From 8a6cdcba293736c73efc4b2f54622508c99225e3 Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Mon, 20 Jul 2020 19:59:56 +0300 Subject: [PATCH] Do not hold a lock during loading script templates from dependencies ^KT-40383 Fixed --- ...ScriptTemplatesFromDependenciesProvider.kt | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/script/ScriptTemplatesFromDependenciesProvider.kt b/idea/src/org/jetbrains/kotlin/idea/script/ScriptTemplatesFromDependenciesProvider.kt index a6a6b025fdf..6cf7b7580df 100644 --- a/idea/src/org/jetbrains/kotlin/idea/script/ScriptTemplatesFromDependenciesProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/script/ScriptTemplatesFromDependenciesProvider.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.scripting.definitions.SCRIPT_DEFINITION_MARKERS_EXTE import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition import org.jetbrains.kotlin.scripting.definitions.getEnvironment import java.io.File +import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.locks.ReentrantLock import kotlin.concurrent.withLock import kotlin.script.experimental.host.ScriptingHostConfiguration @@ -68,12 +69,8 @@ class ScriptTemplatesFromDependenciesProvider(private val project: Project) : Sc if (!forceStartUpdate && _definitions != null) return } - inProgressLock.withLock { - if (!inProgress) { - inProgress = true - - loadScriptDefinitions() - } + if (inProgress.compareAndSet(false, true)) { + loadScriptDefinitions() } } @@ -88,8 +85,7 @@ class ScriptTemplatesFromDependenciesProvider(private val project: Project) : Sc val classpath: List, ) - private var inProgress = false - private val inProgressLock = ReentrantLock() + private val inProgress = AtomicBoolean(false) @Volatile private var forceStartUpdate = false @@ -121,10 +117,7 @@ class ScriptTemplatesFromDependenciesProvider(private val project: Project) : Sc val newTemplates = TemplatesWithCp(templates.toList(), classpath.toList()) if (newTemplates == oldTemplates) { - inProgressLock.withLock { - inProgress = false - } - + inProgress.set(false) return@onSuccess } @@ -164,9 +157,7 @@ class ScriptTemplatesFromDependenciesProvider(private val project: Project) : Sc ScriptDefinitionsManager.getInstance(project).reloadDefinitionsBy(this@ScriptTemplatesFromDependenciesProvider) } - inProgressLock.withLock { - inProgress = false - } + inProgress.set(false) } } @@ -174,9 +165,7 @@ class ScriptTemplatesFromDependenciesProvider(private val project: Project) : Sc definitionsLock.withLock { _definitions = emptyList() } - inProgressLock.withLock { - inProgress = false - } + inProgress.set(false) } // public for tests