I’m developing my own Eclipse plugin and came across a very strange behavior. In some very specific cases, Eclipse won’t quit when I close the workbench. It just stays hanging until I kill the process. This happens when running through PDE and when running as a regular installation.
It is really hard to provide more details and I know that it is a very generic question. Yet, I was wondering if anyone encountered such behavior and could share the solution.
Thanks. Zviki
PS. I’m attaching stack traces of all the running threads after the workbench is quit. Maybe something will pop out. This trace was achieved by running the IDE in debug mode, suspending it after it got frozen and copying all the threads tree.
Test1 [Eclipse Application] org.eclipse.equinox.launcher.Main at localhost:54840 (Suspended) Daemon System Thread [Finalizer] (Suspended) Object.wait(long) line: not available [native method] ReferenceQueue<T>.remove(long) line: 120 ReferenceQueue<T>.remove() line: 136 Finalizer$FinalizerThread.run() line: 159 Daemon System Thread [Reference Handler] (Suspended) Object.wait(long) line: not available [native method] Reference$Lock(Object).wait() line: 474 Reference$ReferenceHandler.run() line: 116 Thread [main] (Suspended) Daemon System Thread [Signal Dispatcher] (Suspended) Daemon Thread [Thread-0] (Suspended) OS.CFRunLoopRunInMode(int, double, boolean) line: not available [native method] Display.sleep() line: 3902 IDEWorkbenchAdvisor(WorkbenchAdvisor).eventLoopIdle(Display) line: 364 Workbench.runEventLoop(Window$IExceptionHandler, Display) line: 2383 Workbench.runUI() line: 2346 Workbench.access$4(Workbench) line: 2198 Workbench$5.run() line: 493 Realm.runWithDefault(Realm, Runnable) line: 288 Workbench.createAndRunWorkbench(Display, WorkbenchAdvisor) line: 488 PlatformUI.createAndRunWorkbench(Display, WorkbenchAdvisor) line: 149 IDEApplication.start(IApplicationContext) line: 113 EclipseAppHandle.run(Object) line: 193 EclipseAppLauncher.runApplication(Object) line: 110 EclipseAppLauncher.start(Object) line: 79 EclipseStarter.run(Object) line: 386 EclipseStarter.run(String[], Runnable) line: 179 NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39 DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25 Method.invoke(Object, Object...) line: 585 Main.invokeFramework(String[], URL[]) line: 549 Main.basicRun(String[]) line: 504 Main.run(String[]) line: 1236 Main.main(String[]) line: 1212 Daemon Thread [State Data Manager] (Suspended) Thread.sleep(long) line: not available [native method] StateManager.run() line: 297 Thread.run() line: 613 Daemon Thread [Framework Event Dispatcher] (Suspended) Object.wait(long) line: not available [native method] EventManager$EventThread(Object).wait() line: 474 EventManager$EventThread.getNextEvent() line: 377 EventManager$EventThread.run() line: 317 Daemon Thread [Start Level Event Dispatcher] (Suspended) Object.wait(long) line: not available [native method] EventManager$EventThread(Object).wait() line: 474 EventManager$EventThread.getNextEvent() line: 377 EventManager$EventThread.run() line: 317 Thread [Worker-0] (Suspended) Object.wait(long) line: not available [native method] WorkerPool.sleep(long) line: 185 WorkerPool.startJob(Worker) line: 217 Worker.run() line: 51 Daemon Thread [Java indexing] (Suspended) Object.wait(long) line: not available [native method] IndexManager(Object).wait() line: 474 IndexManager(JobManager).run() line: 371 Thread.run() line: 613 Thread [Worker-1] (Suspended) Object.wait(long) line: not available [native method] WorkerPool.sleep(long) line: 185 WorkerPool.startJob(Worker) line: 217 Worker.run() line: 51 Thread [Worker-2] (Suspended) Object.wait(long) line: not available [native method] WorkerPool.sleep(long) line: 185 WorkerPool.startJob(Worker) line: 217 Worker.run() line: 51
Sorry to bother everybody… got the problem.
My problem was simple: one of my Action Handlers threw an exception in the Dispose method. This causes the entire workspace to hang.