From 6454b34f90a01be4dd24855f66d2ad64da63990a Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 14 Mar 2012 14:24:04 +0400 Subject: [PATCH] make RefCountHolder soft-reacheable to avoid hard refs to PSI elements --- .../codeInsight/daemon/impl/RefCountHolder.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/RefCountHolder.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/RefCountHolder.java index 89c08ba5f256..9d0f23efa8a3 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/RefCountHolder.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/RefCountHolder.java @@ -30,6 +30,8 @@ import com.intellij.util.containers.BidirectionalMap; import com.intellij.util.containers.ConcurrentHashMap; import org.jetbrains.annotations.NotNull; +import java.lang.ref.Reference; +import java.lang.ref.SoftReference; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -53,13 +55,16 @@ public class RefCountHolder { BEING_USED_BY_PHP, // post highlighting pass is retrieving info } - private static final Key REF_COUNT_HOLDER_IN_FILE_KEY = Key.create("REF_COUNT_HOLDER_IN_FILE_KEY"); + private static final Key> REF_COUNT_HOLDER_IN_FILE_KEY = Key.create("REF_COUNT_HOLDER_IN_FILE_KEY"); public static RefCountHolder getInstance(PsiFile file) { - RefCountHolder refCountHolder = file.getUserData(REF_COUNT_HOLDER_IN_FILE_KEY); - if (refCountHolder == null) { - refCountHolder = ((UserDataHolderEx)file).putUserDataIfAbsent(REF_COUNT_HOLDER_IN_FILE_KEY, new RefCountHolder(file)); + Reference ref = file.getUserData(REF_COUNT_HOLDER_IN_FILE_KEY); + RefCountHolder holder = ref == null ? null : ref.get(); + while (holder == null) { + holder = new RefCountHolder(file); + ref = ((UserDataHolderEx)file).putUserDataIfAbsent(REF_COUNT_HOLDER_IN_FILE_KEY, new SoftReference(holder)); + holder = ref.get(); } - return refCountHolder; + return holder; } private RefCountHolder(@NotNull PsiFile file) {