From 8bb9c572ac7bcf835831bb6c49fc1b295524a87a Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Thu, 21 Nov 2019 15:06:38 +0300 Subject: [PATCH] Move inProgress lock at the onFinish of background task (KT-34688) Setting inProgress to false inside run method can lead to multiple notifications because of delay between run method end and progress hide ^KT-34688 Fixed --- .../AsyncScriptDefinitionsContributor.kt | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/script/AsyncScriptDefinitionsContributor.kt b/idea/src/org/jetbrains/kotlin/idea/script/AsyncScriptDefinitionsContributor.kt index 155284745a0..9a74004d2b0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/script/AsyncScriptDefinitionsContributor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/script/AsyncScriptDefinitionsContributor.kt @@ -56,26 +56,30 @@ abstract class AsyncScriptDefinitionsContributor(protected val project: Project) private var _definitions: List? = null private val definitionsLock = ReentrantReadWriteLock() + @Volatile protected var forceStartUpdate = false + + @Volatile protected var shouldStartNewUpdate = false private var inProgress = false private val inProgressLock = ReentrantReadWriteLock() private inner class DefinitionsCollectorBackgroundTask : Task.Backgroundable(project, progressMessage, true) { + override fun onFinished() { + inProgressLock.write { + inProgress = false + } + } override fun run(indicator: ProgressIndicator) { while (true) { - inProgressLock.read { - if (indicator.isCanceled || !shouldStartNewUpdate) { - inProgressLock.write { - inProgress = false - } - return - } - shouldStartNewUpdate = false + if (indicator.isCanceled || !shouldStartNewUpdate) { + return } + shouldStartNewUpdate = false + val previousDefinitions = definitionsLock.read { if (!forceStartUpdate && _definitions != null) return