From 3ac099fc9a3484936df724824750154b098f5c95 Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Wed, 18 Sep 2019 15:06:48 +0300 Subject: [PATCH] Fix freeze during script definitions update (KT-32513) loadScriptDefinitions is a long running operation, so it shouldn't be called under write lock. This may cause a freeze when someone else wants to get definitions from the same loader during loading process ^KT-32513 Fixed --- .../idea/script/AsyncScriptDefinitionsContributor.kt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/script/AsyncScriptDefinitionsContributor.kt b/idea/src/org/jetbrains/kotlin/idea/script/AsyncScriptDefinitionsContributor.kt index eaf965a82b5..155284745a0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/script/AsyncScriptDefinitionsContributor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/script/AsyncScriptDefinitionsContributor.kt @@ -76,10 +76,15 @@ abstract class AsyncScriptDefinitionsContributor(protected val project: Project) shouldStartNewUpdate = false } - val wasRunning = definitionsLock.isWriteLocked + val previousDefinitions = definitionsLock.read { + if (!forceStartUpdate && _definitions != null) return + + _definitions + } + + val newDefinitions = loadScriptDefinitions(previousDefinitions) + val needReload = definitionsLock.write { - if (wasRunning && !forceStartUpdate && _definitions != null) return@write false - val newDefinitions = loadScriptDefinitions(_definitions) if (newDefinitions != _definitions) { _definitions = newDefinitions return@write true