From 29ea757566705df0f0f0c4248943e704b45f93db Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Tue, 1 Aug 2023 07:46:20 +0200 Subject: [PATCH] core: sometimes runnable submitted to StartupManager.runAfterOpened might not be called due to the race between StartupManagerImpl#postStartupActivities and StartupManagerImpl#postStartupActivitiesPassed (IDEA-327074) GitOrigin-RevId: 9b0c04f62051950d3c286701846441924a784821 --- .../com/intellij/ide/startup/impl/StartupManagerImpl.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/startup/impl/StartupManagerImpl.kt b/platform/platform-impl/src/com/intellij/ide/startup/impl/StartupManagerImpl.kt index e0ab89a5c711..aef3abd8dc86 100644 --- a/platform/platform-impl/src/com/intellij/ide/startup/impl/StartupManagerImpl.kt +++ b/platform/platform-impl/src/com/intellij/ide/startup/impl/StartupManagerImpl.kt @@ -102,6 +102,8 @@ open class StartupManagerImpl(private val project: Project, private val coroutin private val lock = Any() private val initProjectStartupActivities = ArrayDeque() private val postStartupActivities = ArrayDeque() + @Volatile + private var freezePostStartupActivities = false @MagicConstant(intValues = [0, DUMB_AWARE_PASSED.toLong(), ALL_PASSED.toLong()]) @Volatile @@ -270,6 +272,7 @@ open class StartupManagerImpl(private val project: Project, private val coroutin } withContext(tracer.span("run post-startup dynamically registered activities")) { + freezePostStartupActivities = true runActivities(postStartupActivities) } postStartupActivitiesPassed = DUMB_AWARE_PASSED @@ -353,9 +356,9 @@ open class StartupManagerImpl(private val project: Project, private val coroutin override fun runAfterOpened(runnable: Runnable) { checkNonDefaultProject() - if (postStartupActivitiesPassed < DUMB_AWARE_PASSED) { + if (!freezePostStartupActivities) { synchronized(lock) { - if (postStartupActivitiesPassed < DUMB_AWARE_PASSED) { + if (!freezePostStartupActivities) { postStartupActivities.add(runnable) return } @@ -370,6 +373,7 @@ open class StartupManagerImpl(private val project: Project, private val coroutin synchronized(lock) { initProjectStartupActivities.clear() postStartupActivities.clear() + freezePostStartupActivities = false } }