From 2d68637fd958d43ee0f5c8b50429040aad2e4f39 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Thu, 15 Jan 2015 18:48:18 +0300 Subject: [PATCH] ResolveElementCache: Use softly (not weakly) retained values Fixes performance problems with long running searches analyzing function bodies several times --- .../kotlin/storage/LazyResolveStorageManager.java | 4 ++-- .../storage/LockBasedLazyResolveStorageManager.kt | 10 +++++----- .../kotlin/idea/project/ResolveElementCache.java | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/storage/LazyResolveStorageManager.java b/compiler/frontend/src/org/jetbrains/kotlin/storage/LazyResolveStorageManager.java index 6f251d5cc05..84b7aff8674 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/storage/LazyResolveStorageManager.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/storage/LazyResolveStorageManager.java @@ -22,10 +22,10 @@ import org.jetbrains.kotlin.resolve.BindingTrace; public interface LazyResolveStorageManager extends StorageManager { @NotNull - MemoizedFunctionToNotNull createWeaklyRetainedMemoizedFunction(@NotNull Function1 compute); + MemoizedFunctionToNotNull createSoftlyRetainedMemoizedFunction(@NotNull Function1 compute); @NotNull - MemoizedFunctionToNullable createWeaklyRetainedMemoizedFunctionWithNullableValues(@NotNull Function1 compute); + MemoizedFunctionToNullable createSoftlyRetainedMemoizedFunctionWithNullableValues(@NotNull Function1 compute); @NotNull BindingTrace createSafeTrace(@NotNull BindingTrace originalTrace); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/storage/LockBasedLazyResolveStorageManager.kt b/compiler/frontend/src/org/jetbrains/kotlin/storage/LockBasedLazyResolveStorageManager.kt index 8a5ebfbf541..7315770fbe1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/storage/LockBasedLazyResolveStorageManager.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/storage/LockBasedLazyResolveStorageManager.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.storage -import com.intellij.util.containers.ConcurrentWeakValueHashMap import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.resolve.BindingContext @@ -24,13 +23,14 @@ import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.util.slicedMap.ReadOnlySlice import org.jetbrains.kotlin.util.slicedMap.WritableSlice import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics +import com.intellij.util.containers.ConcurrentSoftValueHashMap public class LockBasedLazyResolveStorageManager(private val storageManager: StorageManager): StorageManager by storageManager, LazyResolveStorageManager { - override fun createWeaklyRetainedMemoizedFunction(compute: Function1) = - storageManager.createMemoizedFunction(compute, ConcurrentWeakValueHashMap()) + override fun createSoftlyRetainedMemoizedFunction(compute: Function1) = + storageManager.createMemoizedFunction(compute, ConcurrentSoftValueHashMap()) - override fun createWeaklyRetainedMemoizedFunctionWithNullableValues(compute: Function1) = - storageManager.createMemoizedFunctionWithNullableValues(compute, ConcurrentWeakValueHashMap()) + override fun createSoftlyRetainedMemoizedFunctionWithNullableValues(compute: Function1) = + storageManager.createMemoizedFunctionWithNullableValues(compute, ConcurrentSoftValueHashMap()) // It seems safe to have a separate lock for traces: // no other locks will be acquired inside the trace operations diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.java index a86c807fcb6..1a55b9deb42 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.java @@ -55,7 +55,7 @@ public class ResolveElementCache extends ElementResolver { ResolveSession resolveSession = ResolveElementCache.this.resolveSession; LazyResolveStorageManager manager = resolveSession.getStorageManager(); MemoizedFunctionToNotNull elementsCacheFunction = - manager.createWeaklyRetainedMemoizedFunction(new Function1() { + manager.createSoftlyRetainedMemoizedFunction(new Function1() { @Override public BindingContext invoke(JetElement jetElement) { return elementAdditionalResolve(jetElement, jetElement, BodyResolveMode.FULL);