diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java index 80c092d816c2..f6f153a676fa 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java @@ -159,7 +159,7 @@ public class DocumentationManager extends DockablePopupManager myLogFileToConfiguration = new HashMap(); private final Runnable myUpdateRequest; private final LogConsoleManager myManager; - private final Alarm myUpdateAlarm = new Alarm(Alarm.ThreadToUse.OWN_THREAD, this); + private final Alarm myUpdateAlarm = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, this); private boolean myDisposed; public LogFilesManager(final Project project, LogConsoleManager manager, Disposable parentDisposable) { diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java index 068f5eaacfd5..299f3e8860e0 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java @@ -231,7 +231,7 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo private String myHelpId; - private final Alarm myFlushUserInputAlarm = new Alarm(Alarm.ThreadToUse.OWN_THREAD, this); + private final Alarm myFlushUserInputAlarm = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, this); private final Alarm myFlushAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD, this); private final Set myCurrentRequests = new HashSet(); diff --git a/platform/platform-api/src/com/intellij/util/Alarm.java b/platform/platform-api/src/com/intellij/util/Alarm.java index 41289e0f4247..5c176d5b8c64 100644 --- a/platform/platform-api/src/com/intellij/util/Alarm.java +++ b/platform/platform-api/src/com/intellij/util/Alarm.java @@ -60,14 +60,20 @@ public class Alarm implements Disposable { public void dispose() { myDisposed = true; cancelAllRequests(); - if (myThreadToUse == ThreadToUse.OWN_THREAD) { + + if (myThreadToUse == ThreadToUse.POOLED_THREAD) { myExecutorService.shutdown(); } + else if (myThreadToUse == ThreadToUse.OWN_THREAD) { + myExecutorService.shutdown(); + ((ThreadPoolExecutor)myExecutorService).getQueue().clear(); + } } public enum ThreadToUse { SWING_THREAD, SHARED_THREAD, + POOLED_THREAD, OWN_THREAD } @@ -84,12 +90,23 @@ public class Alarm implements Disposable { public Alarm(@NotNull ThreadToUse threadToUse) { this(threadToUse, null); - LOG.assertTrue(threadToUse != ThreadToUse.OWN_THREAD, "You must provide parent Disposable for ThreadToUse.OWN_THREAD Alarm"); + LOG.assertTrue(threadToUse != ThreadToUse.POOLED_THREAD && threadToUse != ThreadToUse.OWN_THREAD, + "You must provide parent Disposable for ThreadToUse.POOLED_THREAD and ThreadToUse.OWN_THREAD Alarm"); } public Alarm(@NotNull ThreadToUse threadToUse, Disposable parentDisposable) { myThreadToUse = threadToUse; - myExecutorService = threadToUse == ThreadToUse.OWN_THREAD ? new MyExecutor() : ourSharedExecutorService; + + if (threadToUse == ThreadToUse.POOLED_THREAD) { + myExecutorService = new MyExecutor(); + } + else if(threadToUse == ThreadToUse.OWN_THREAD) { + myExecutorService = ConcurrencyUtil.newSingleThreadExecutor( + "Alarm pool(own)", Thread.NORM_PRIORITY - 2); + } + else { + myExecutorService = ourSharedExecutorService; + } if (parentDisposable != null) { Disposer.register(parentDisposable, this); diff --git a/platform/platform-api/src/com/intellij/util/ui/update/MergingUpdateQueue.java b/platform/platform-api/src/com/intellij/util/ui/update/MergingUpdateQueue.java index b72fd6d5d077..c7f8c90a3e88 100644 --- a/platform/platform-api/src/com/intellij/util/ui/update/MergingUpdateQueue.java +++ b/platform/platform-api/src/com/intellij/util/ui/update/MergingUpdateQueue.java @@ -86,15 +86,23 @@ public class MergingUpdateQueue implements Runnable, Disposable, Activatable { @Nullable Disposable parent, @Nullable JComponent activationComponent, boolean executeInDispatchThread) { + this(name, mergingTimeSpan, isActive, modalityStateComponent, parent, activationComponent, + executeInDispatchThread ? Alarm.ThreadToUse.SWING_THREAD : Alarm.ThreadToUse.POOLED_THREAD); + } + + public MergingUpdateQueue(@NonNls String name, + int mergingTimeSpan, + boolean isActive, + @Nullable JComponent modalityStateComponent, + @Nullable Disposable parent, + @Nullable JComponent activationComponent, + @NotNull Alarm.ThreadToUse thread) { myMergingTimeSpan = mergingTimeSpan; myModalityStateComponent = modalityStateComponent; myName = name; myPassThrough = ApplicationManager.getApplication().isUnitTestMode(); - myExecuteInDispatchThread = executeInDispatchThread; - - myWaiterForMerge = myExecuteInDispatchThread - ? createAlarm(Alarm.ThreadToUse.SWING_THREAD, null) - : createAlarm(Alarm.ThreadToUse.OWN_THREAD, this); + myExecuteInDispatchThread = thread == Alarm.ThreadToUse.SWING_THREAD; + myWaiterForMerge = createAlarm(thread, myExecuteInDispatchThread ? null : this); if (isActive) { showNotify(); @@ -109,7 +117,6 @@ public class MergingUpdateQueue implements Runnable, Disposable, Activatable { } } - protected Alarm createAlarm(@NotNull Alarm.ThreadToUse thread, Disposable parent) { return new Alarm(thread, parent); } diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/cl/PluginClassLoader.java b/platform/platform-impl/src/com/intellij/ide/plugins/cl/PluginClassLoader.java index 208ff2a41e38..426eab11ef8b 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/cl/PluginClassLoader.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/cl/PluginClassLoader.java @@ -104,6 +104,9 @@ public class PluginClassLoader extends UrlClassLoader { catch (IncompatibleClassChangeError e) { throw new PluginException(e, myPluginId); } + catch (UnsupportedClassVersionError e) { + throw new PluginException(e, myPluginId); + } if (c != null) { PluginManager.addPluginClass(c.getName(), myPluginId); } diff --git a/platform/platform-impl/src/com/intellij/internal/statistic/updater/SendStatisticsProjectComponent.java b/platform/platform-impl/src/com/intellij/internal/statistic/updater/SendStatisticsProjectComponent.java index bd96bd36eef0..d2792d5801e1 100644 --- a/platform/platform-impl/src/com/intellij/internal/statistic/updater/SendStatisticsProjectComponent.java +++ b/platform/platform-impl/src/com/intellij/internal/statistic/updater/SendStatisticsProjectComponent.java @@ -38,7 +38,7 @@ public class SendStatisticsProjectComponent implements ProjectComponent { public SendStatisticsProjectComponent(Project project) { myProject = project; - myAlarm = new Alarm(Alarm.ThreadToUse.OWN_THREAD, myProject); + myAlarm = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, myProject); NotificationsConfigurationImpl.remove("SendUsagesStatistics"); NotificationsConfiguration.getNotificationsConfiguration().register( diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/EncodingManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/EncodingManagerImpl.java index fcc7d6165274..705005d82dc6 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/EncodingManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/EncodingManagerImpl.java @@ -82,7 +82,7 @@ public class EncodingManagerImpl extends EncodingManager implements PersistentSt private final PropertyChangeSupport myPropertyChangeSupport = new PropertyChangeSupport(this); private Charset myDefaultEncoding = CharsetToolkit.UTF8_CHARSET; - private final Alarm updateEncodingFromContent = new Alarm(Alarm.ThreadToUse.OWN_THREAD, this); + private final Alarm updateEncodingFromContent = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, this); private static final Key CACHED_CHARSET_FROM_CONTENT = Key.create("CACHED_CHARSET_FROM_CONTENT"); private final TransferToPooledThreadQueue> myChangedDocuments = new TransferToPooledThreadQueue>( diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/FileWatcherTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/FileWatcherTest.java index 88e140cc68a0..ee03f738bdee 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/FileWatcherTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/FileWatcherTest.java @@ -93,7 +93,7 @@ public class FileWatcherTest extends PlatformLangTestCase { myWatcher.startup(myNotifier); assertTrue(myWatcher.isOperational()); - myAlarm = new Alarm(Alarm.ThreadToUse.OWN_THREAD, getProject()); + myAlarm = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, getProject()); myTimeout = NATIVE_PROCESS_DELAY; myConnection = ApplicationManager.getApplication().getMessageBus().connect(); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/ZipperUpdater.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/ZipperUpdater.java index 86314450c6e4..88ebc4c7c8b6 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/ZipperUpdater.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/ZipperUpdater.java @@ -33,8 +33,8 @@ public class ZipperUpdater { public ZipperUpdater(final int delay, Disposable parentDisposable) { myDelay = delay; myIsEmpty = true; - myThreadToUse = Alarm.ThreadToUse.OWN_THREAD; - myAlarm = new Alarm(Alarm.ThreadToUse.OWN_THREAD, parentDisposable); + myThreadToUse = Alarm.ThreadToUse.POOLED_THREAD; + myAlarm = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, parentDisposable); } public ZipperUpdater(final int delay, final Alarm.ThreadToUse threadToUse, Disposable parentDisposable) { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ControlledCycle.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ControlledCycle.java index 15de3a6e20e7..60fba14ea957 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ControlledCycle.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ControlledCycle.java @@ -58,7 +58,7 @@ public class ControlledCycle { } } }; - mySimpleAlarm = new Alarm(Alarm.ThreadToUse.OWN_THREAD, project); + mySimpleAlarm = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, project); } public boolean startIfNotStarted(final int refreshInterval) { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsAnnotationLocalChangesListenerImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsAnnotationLocalChangesListenerImpl.java index 5e2de4405f6a..6c51e32483f0 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsAnnotationLocalChangesListenerImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsAnnotationLocalChangesListenerImpl.java @@ -60,7 +60,7 @@ public class VcsAnnotationLocalChangesListenerImpl implements Disposable, VcsAnn myProject = project; myLock = new Object(); myUpdateStuff = createUpdateStuff(); - myUpdater = new ZipperUpdater(ApplicationManager.getApplication().isUnitTestMode() ? 10 : 300, Alarm.ThreadToUse.OWN_THREAD, project); + myUpdater = new ZipperUpdater(ApplicationManager.getApplication().isUnitTestMode() ? 10 : 300, Alarm.ThreadToUse.POOLED_THREAD, project); myConnection = myProject.getMessageBus().connect(); myLocalFileSystem = LocalFileSystem.getInstance(); myHandler = createHandler(); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsDirtyScopeVfsListener.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsDirtyScopeVfsListener.java index 10e4aa4ea6dc..0be01724b5f6 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsDirtyScopeVfsListener.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsDirtyScopeVfsListener.java @@ -92,7 +92,7 @@ public class VcsDirtyScopeVfsListener implements ApplicationComponent, BulkFileL new FileAndDirsCollector().markDirty(map); } }; - myZipperUpdater = new ConstantZipperUpdater(300, Alarm.ThreadToUse.OWN_THREAD, ApplicationManager.getApplication(), + myZipperUpdater = new ConstantZipperUpdater(300, Alarm.ThreadToUse.POOLED_THREAD, ApplicationManager.getApplication(), myDirtReporter); } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/ApplyPatchDifferentiatedDialog.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/ApplyPatchDifferentiatedDialog.java index ee12151836b4..acd4a36f037f 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/ApplyPatchDifferentiatedDialog.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/ApplyPatchDifferentiatedDialog.java @@ -160,7 +160,7 @@ public class ApplyPatchDifferentiatedDialog extends DialogWrapper { } }); - myLoadQueue = new ZipperUpdater(500, Alarm.ThreadToUse.OWN_THREAD, getDisposable()); + myLoadQueue = new ZipperUpdater(500, Alarm.ThreadToUse.POOLED_THREAD, getDisposable()); myCanChangePatchFile = applyPatchMode.isCanChangePatchFile(); myReset = myCanChangePatchFile ? new Runnable() { public void run() { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryPanelImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryPanelImpl.java index 9d7747a921f3..8a314b7c0033 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryPanelImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryPanelImpl.java @@ -376,7 +376,7 @@ public class FileHistoryPanelImpl extends PanelWithActionsAndCloseButton { replaceTransferable(); - myUpdateAlarm = new Alarm(Alarm.ThreadToUse.OWN_THREAD, myProject); + myUpdateAlarm = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, myProject); final HistoryAsTreeProvider treeHistoryProvider = myHistorySession.getHistoryAsTreeProvider(); diff --git a/plugins/git4idea/src/git4idea/roots/GitRootScanner.java b/plugins/git4idea/src/git4idea/roots/GitRootScanner.java index 6628a2c1f928..226f8932b603 100644 --- a/plugins/git4idea/src/git4idea/roots/GitRootScanner.java +++ b/plugins/git4idea/src/git4idea/roots/GitRootScanner.java @@ -64,7 +64,7 @@ public class GitRootScanner implements BulkFileListener, ModuleRootListener, Dis messageBus.connect().subscribe(VirtualFileManager.VFS_CHANGES, this); messageBus.connect().subscribe(ProjectTopics.PROJECT_ROOTS, this); - myAlarm = new Alarm(Alarm.ThreadToUse.OWN_THREAD, project); + myAlarm = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, project); } @Override diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchPanel.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchPanel.java index cc5ff21211dd..53fb0662242a 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchPanel.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/indices/MavenArtifactSearchPanel.java @@ -66,7 +66,7 @@ public class MavenArtifactSearchPanel extends JPanel { myListener = listener; initComponents(initialText); - myAlarm = new Alarm(Alarm.ThreadToUse.OWN_THREAD, dialog.getDisposable()); + myAlarm = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, dialog.getDisposable()); } public JTextField getSearchField() { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/RootsToWorkingCopies.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/RootsToWorkingCopies.java index 1717ea261c9c..083228821fd2 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/RootsToWorkingCopies.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/RootsToWorkingCopies.java @@ -74,7 +74,7 @@ public class RootsToWorkingCopies implements VcsListener { } } }; - myZipperUpdater = new ZipperUpdater(200, Alarm.ThreadToUse.OWN_THREAD, myProject); + myZipperUpdater = new ZipperUpdater(200, Alarm.ThreadToUse.POOLED_THREAD, myProject); } private void addRoot(final VirtualFile root) { diff --git a/plugins/xslt-debugger/src/org/intellij/plugins/xsltDebugger/EDTGuard.java b/plugins/xslt-debugger/src/org/intellij/plugins/xsltDebugger/EDTGuard.java index 42b9bb60cec3..c69d2ba7d8dd 100644 --- a/plugins/xslt-debugger/src/org/intellij/plugins/xsltDebugger/EDTGuard.java +++ b/plugins/xslt-debugger/src/org/intellij/plugins/xsltDebugger/EDTGuard.java @@ -208,7 +208,7 @@ class EDTGuard implements InvocationHandler { }); final Alarm alarm = new Alarm(Alarm.ThreadToUse.SHARED_THREAD, d); - final Alarm alarm2 = new Alarm(Alarm.ThreadToUse.OWN_THREAD, alarm); + final Alarm alarm2 = new Alarm(Alarm.ThreadToUse.POOLED_THREAD, alarm); final Runnable watchdog = new Runnable() { @Override