From 659378f8068a844126ca4f9f144cc10447274ee3 Mon Sep 17 00:00:00 2001 From: Vladimir Dolzhenko Date: Mon, 6 Apr 2020 19:24:53 +0200 Subject: [PATCH] Do not use synchronized for fetchAnalysisResultsForElement Relates to #KT-37467 --- .../caches/resolve/ProjectResolutionFacade.kt | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt index 09e936c7b88..4c90a1c8adc 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt @@ -47,6 +47,7 @@ internal class ProjectResolutionFacade( private val cachedResolverForProject: ResolverForProject get() = globalContext.storageManager.compute { cachedValue.value } + private val analysisResultsLock = ReentrantLock() private val analysisResults = CachedValuesManager.getManager(project).createCachedValue( { val resolverForProject = cachedResolverForProject @@ -140,8 +141,14 @@ internal class ProjectResolutionFacade( internal fun getAnalysisResultsForElements(elements: Collection): AnalysisResult { assert(elements.isNotEmpty()) { "elements collection should not be empty" } - val slruCache = synchronized(analysisResults) { - analysisResults.value!! + + val slruCache = run { + analysisResultsLock.lock() + try { + analysisResults.value!! + } finally { + analysisResultsLock.unlock() + } } val results = elements.map { val perFileCache = slruCache[it.containingKtFile] @@ -158,11 +165,15 @@ internal class ProjectResolutionFacade( } internal fun fetchAnalysisResultsForElement(element: KtElement): AnalysisResult? { - val slruCache = synchronized(analysisResults) { - analysisResults.upToDateOrNull?.get() ?: return null - } - val perFileCache = slruCache.getIfCached(element.containingKtFile) - return perFileCache?.fetchAnalysisResults(element) + val slruCache = if (analysisResultsLock.tryLock()) { + try { + analysisResults.upToDateOrNull?.get() + } finally { + analysisResultsLock.unlock() + } + } else null + + return slruCache?.getIfCached(element.containingKtFile)?.fetchAnalysisResults(element) } override fun toString(): String {