From 5d5fb35f63095ae1e7642d7cd082b5f688f48383 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 21 Aug 2019 18:16:29 +0200 Subject: [PATCH] Fix race condition leading to project leak through extension point listener in StartupManagerImpl GitOrigin-RevId: af3c3fd64ea2b8f12b10be7652d28c9f0ee9b072 --- .../ide/startup/impl/StartupManagerImpl.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/startup/impl/StartupManagerImpl.java b/platform/platform-impl/src/com/intellij/ide/startup/impl/StartupManagerImpl.java index c578ac7bb948..537a8f686ccd 100644 --- a/platform/platform-impl/src/com/intellij/ide/startup/impl/StartupManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/ide/startup/impl/StartupManagerImpl.java @@ -410,19 +410,21 @@ public class StartupManagerImpl extends StartupManagerEx implements Disposable { } public void scheduleBackgroundPostStartupActivities() { + List backgroundPostStartupActivities = StartupActivity.BACKGROUND_POST_STARTUP_ACTIVITY.getExtensionList(); + + Extensions.getRootArea().getExtensionPoint(StartupActivity.BACKGROUND_POST_STARTUP_ACTIVITY).addExtensionPointListener( + new ExtensionPointListener() { + @Override + public void extensionAdded(@NotNull StartupActivity extension, @NotNull PluginDescriptor pluginDescriptor) { + extension.runActivity(myProject); + } + }, false, this); + myBackgroundPostStartupScheduledFuture = AppExecutorUtil.getAppScheduledExecutorService().schedule( () -> BackgroundTaskUtil.runUnderDisposeAwareIndicator(this, () -> { - for (StartupActivity activity : StartupActivity.BACKGROUND_POST_STARTUP_ACTIVITY.getExtensionList()) { + for (StartupActivity activity : backgroundPostStartupActivities) { activity.runActivity(myProject); } - - Extensions.getRootArea().getExtensionPoint(StartupActivity.BACKGROUND_POST_STARTUP_ACTIVITY).addExtensionPointListener( - new ExtensionPointListener() { - @Override - public void extensionAdded(@NotNull StartupActivity extension, @NotNull PluginDescriptor pluginDescriptor) { - extension.runActivity(myProject); - } - }, false, this); }), 5, TimeUnit.SECONDS); }