StartupManager: avoid data races

when registering post-startup activity from a bg thread, after project closing but before disposing
This commit is contained in:
peter
2017-04-11 10:27:09 +02:00
parent 612b133c60
commit 48a43ddbb1
@@ -203,7 +203,10 @@ public class StartupManagerImpl extends StartupManagerEx {
dumbService.runWhenSmart(this);
}
else {
myPostStartupActivitiesPassed = true;
//noinspection SynchronizeOnThis
synchronized (this) {
myPostStartupActivitiesPassed = true;
}
}
}
});
@@ -362,28 +365,23 @@ public class StartupManagerImpl extends StartupManagerEx {
final Application application = ApplicationManager.getApplication();
if (application == null) return;
//noinspection SynchronizeOnThis
synchronized (this) {
// in tests which simulate project opening, post-startup activities could have been run already.
// Then we should act as if the project was initialized
boolean initialized = myProject.isInitialized() || myProject.isDefault() || application.isUnitTestMode() && myPostStartupActivitiesPassed;
if (!initialized) {
registerPostStartupActivity(action);
return;
}
}
Runnable runnable = () -> {
if (!myProject.isDisposed()) {
action.run();
if (myProject.isDisposed()) return;
//noinspection SynchronizeOnThis
synchronized (this) {
// in tests which simulate project opening, post-startup activities could have been run already.
// Then we should act as if the project was initialized
boolean initialized = myProject.isInitialized() || myProject.isDefault() || application.isUnitTestMode() && myPostStartupActivitiesPassed;
if (!initialized) {
registerPostStartupActivity(action);
return;
}
}
action.run();
};
if (application.isDispatchThread()) {
runnable.run();
}
else {
application.invokeLater(runnable, ModalityState.NON_MODAL);
}
GuiUtils.invokeLaterIfNeeded(runnable, ModalityState.NON_MODAL);
}
@TestOnly