From 986b13c3a1c55d1dca0cf817c6ac868606745226 Mon Sep 17 00:00:00 2001 From: Pavel Kirpichenkov Date: Wed, 3 Jun 2020 14:35:32 +0300 Subject: [PATCH] Optimize synchronization for resolution anchors Use volatile state instead of synchronized access to it. This should be enough as the component's state is only read by the component users and never changed. --- .../caches/resolve/KotlinIdeResolutionAnchorService.kt | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinIdeResolutionAnchorService.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinIdeResolutionAnchorService.kt index 6df36e36e52..16d08170d4f 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinIdeResolutionAnchorService.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinIdeResolutionAnchorService.kt @@ -24,16 +24,17 @@ import org.jetbrains.kotlin.resolve.ResolutionAnchorProvider @State(name = "KotlinIdeAnchorService", storages = [Storage("anchors.xml")]) class KotlinIdeResolutionAnchorService( val project: Project -) : ResolutionAnchorProvider, +) : ResolutionAnchorProvider, PersistentStateComponent { data class State( var moduleNameToAnchorName: Map = emptyMap() ) - + private val logger = logger() @JvmField + @Volatile var myState: State = State() private fun buildMapping(): Map { @@ -52,7 +53,7 @@ class KotlinIdeResolutionAnchorService( module to anchor }.toMap() } - + private fun notFoundModule(moduleName: String): Nothing? { logger.warn("Module <${moduleName}> not found in project model") return null @@ -63,15 +64,12 @@ class KotlinIdeResolutionAnchorService( buildMapping() } - @Synchronized override fun getState(): State = myState - @Synchronized override fun loadState(state: State) { XmlSerializerUtil.copyBean(state, myState) } - @Synchronized override fun getResolutionAnchor(moduleDescriptor: ModuleDescriptor): ModuleDescriptor? { if (!project.libraryToSourceAnalysisEnabled) return null val moduleInfo = moduleDescriptor.moduleInfo ?: return null