Community
Participate
Working Groups
Here is the tested scenario. * the debug view has handled a suspend event, and is trying to open an editor on the associated compilation unit, in the "main thread" * the test has made changes to the same compilation unit, and is saving the changes (testing HCR), in the "test thread" * the (saved) changes to the compilation unit, have caused the UISyncronizer to do a sync exec (i.e. waiting on the main thread). This thread has a lock on the compilation unit that has been changed * the main thread is waiting for a lock on the same compilation unit (trying to open it). -> deadlock Here is the thread dump: [java] "org.eclipse.jdt.debug: JDI Event Dispatcher" prio=1 tid=0x08b4b7b0 nid=0x7e0a in Object.wait() [bd3ff000..bd3ff8d8] [java] at java.lang.Object.wait(Native Method) [java] - waiting on <0x449152d8> (a org.eclipse.core.internal.jobs.ImplicitJobs$ThreadJob) [java] at org.eclipse.core.internal.jobs.ImplicitJobs$ThreadJob.joinRun(ImplicitJobs.java:65) [java] - locked <0x449152d8> (a org.eclipse.core.internal.jobs.ImplicitJobs$ThreadJob) [java] at org.eclipse.core.internal.jobs.ImplicitJobs.begin(ImplicitJobs.java:195) [java] at org.eclipse.core.internal.jobs.JobManager.beginRule(JobManager.java:113) [java] at org.eclipse.core.internal.resources.WorkManager.checkIn(WorkManager.java:94) [java] at org.eclipse.core.internal.resources.Workspace.prepareOperation(Workspace.java:1520) [java] at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1552) [java] at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1572) [java] at org.eclipse.debug.core.model.Breakpoint.setAttribute(Breakpoint.java:180) [java] at org.eclipse.jdt.internal.debug.core.breakpoints.JavaBreakpoint.decrementInstallCount(JavaBreakpoint.java:720) [java] at org.eclipse.jdt.internal.debug.core.breakpoints.JavaBreakpoint.deregisterRequest(JavaBreakpoint.java:246) [java] at org.eclipse.jdt.internal.debug.core.breakpoints.JavaBreakpoint.removeRequests(JavaBreakpoint.java:638) [java] at org.eclipse.jdt.internal.debug.core.breakpoints.JavaBreakpoint.removeFromTarget(JavaBreakpoint.java:581) [java] at org.eclipse.jdt.internal.debug.core.breakpoints.JavaLineBreakpoint.removeFromTarget(JavaLineBreakpoint.java:166) [java] at org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget.removeAllBreakpoints(JDIDebugTarget.java:1299) [java] at org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget.cleanup(JDIDebugTarget.java:1263) [java] at org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget.disconnected(JDIDebugTarget.java:1242) [java] at org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget.handleVMDisconnect(JDIDebugTarget.java:854) [java] at org.eclipse.jdt.internal.debug.core.EventDispatcher.dispatch(EventDispatcher.java:145) [java] at org.eclipse.jdt.internal.debug.core.EventDispatcher.run(EventDispatcher.java:214) [java] at java.lang.Thread.run(Thread.java:534) [java] "org.eclipse.jdt.internal.ui.text.JavaReconciler" daemon prio=1 tid=0x089a60d0 nid=0x7d0f in Object.wait() [bcdff000..bcdff8d8] [java] at java.lang.Object.wait(Native Method) [java] - waiting on <0x45e35eb0> (a org.eclipse.jface.text.reconciler.DirtyRegionQueue) [java] at org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run(AbstractReconciler.java:161) [java] - locked <0x45e35eb0> (a org.eclipse.jface.text.reconciler.DirtyRegionQueue) [java] "Worker-3" prio=1 tid=0x08096b78 nid=0x736d in Object.wait() [bd7ff000..bd7ff8d8] [java] at java.lang.Object.wait(Native Method) [java] at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:108) [java] - locked <0x44c5a8f0> (a org.eclipse.core.internal.jobs.WorkerPool) [java] at org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:134) [java] at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55) [java] "Thread-1" prio=1 tid=0x089d9d78 nid=0x7361 in Object.wait() [be3fe000..be3ff8d8] [java] at java.lang.Object.wait(Native Method) [java] at org.eclipse.ui.internal.Semaphore.acquire(Semaphore.java:37) [java] - locked <0x449a4608> (a org.eclipse.ui.internal.Semaphore) [java] at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:42) [java] at org.eclipse.swt.widgets.Display.syncExec(Display.java:2230) [java] at org.eclipse.ui.model.WorkbenchContentProvider.resourceChanged(WorkbenchContentProvider.java:198) [java] at org.eclipse.core.internal.events.NotificationManager$2.run(NotificationManager.java:218) [java] at org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:1034) [java] at org.eclipse.core.runtime.Platform.run(Platform.java:432) [java] at org.eclipse.core.internal.events.NotificationManager.notify(NotificationManager.java:211) [java] at org.eclipse.core.internal.events.NotificationManager.broadcastChanges(NotificationManager.java:118) [java] at org.eclipse.core.internal.resources.Workspace.broadcastChanges(Workspace.java:153) [java] at org.eclipse.core.internal.resources.Workspace.endOperation(Workspace.java:852) [java] at org.eclipse.core.internal.resources.File.setContents(File.java:289) [java] at org.eclipse.jdt.internal.core.Buffer.save(Buffer.java:339) [java] - locked <0x449a4750> (a java.lang.Object) [java] at org.eclipse.jdt.debug.tests.core.HcrTests.testSimpleHcr(HcrTests.java:63) [java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [java] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [java] at java.lang.reflect.Method.invoke(Method.java:324) [java] at junit.framework.TestCase.runTest(TestCase.java:154) [java] at junit.framework.TestCase.runBare(TestCase.java:127) [java] at junit.framework.TestResult$1.protect(TestResult.java:106) [java] at junit.framework.TestResult.runProtected(TestResult.java:124) [java] at junit.framework.TestResult.run(TestResult.java:109) [java] at junit.framework.TestCase.run(TestCase.java:118) [java] at junit.framework.TestSuite.runTest(TestSuite.java:208) [java] at junit.framework.TestSuite.run(TestSuite.java:203) [java] at junit.framework.TestSuite.runTest(TestSuite.java:208) [java] at org.eclipse.jdt.debug.tests.AutomatedSuite$1.run(AutomatedSuite.java:171) [java] at java.lang.Thread.run(Thread.java:534) [java] "Java indexing" daemon prio=1 tid=0x087949f0 nid=0x7344 in Object.wait() [be5ff000..be5ff8d8] [java] at java.lang.Object.wait(Native Method) [java] - waiting on <0x45072e80> (a org.eclipse.jdt.internal.core.search.indexing.IndexManager) [java] at java.lang.Object.wait(Object.java:429) [java] at org.eclipse.jdt.internal.core.search.processing.JobManager.run(JobManager.java:358) [java] - locked <0x45072e80> (a org.eclipse.jdt.internal.core.search.indexing.IndexManager) [java] at java.lang.Thread.run(Thread.java:534) [java] "Signal Dispatcher" daemon prio=1 tid=0x0809fb28 nid=0x733d waiting on condition [0..0] [java] "Finalizer" daemon prio=1 tid=0x0808bc60 nid=0x733b in Object.wait() [bf3ff000..bf3ff8d8] [java] at java.lang.Object.wait(Native Method) [java] - waiting on <0x44c388f8> (a java.lang.ref.ReferenceQueue$Lock) [java] at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:111) [java] - locked <0x44c388f8> (a java.lang.ref.ReferenceQueue$Lock) [java] at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:127) [java] at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159) [java] "Reference Handler" daemon prio=1 tid=0x0808a1a8 nid=0x733a in Object.wait() [bf5ff000..bf5ff8d8] [java] at java.lang.Object.wait(Native Method) [java] - waiting on <0x44c38960> (a java.lang.ref.Reference$Lock) [java] at java.lang.Object.wait(Object.java:429) [java] at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:115) [java] - locked <0x44c38960> (a java.lang.ref.Reference$Lock) [java] "main" prio=1 tid=0x080527c0 nid=0x7335 waiting for monitor entry [bfffa000..bfffbce8] [java] at org.eclipse.jdt.internal.core.Buffer.close(Buffer.java:97) [java] - waiting to lock <0x449a4750> (a java.lang.Object) [java] at org.eclipse.jdt.internal.core.Openable.closeBuffer(Openable.java:94) [java] at org.eclipse.jdt.internal.core.Openable.closing(Openable.java:102) [java] at org.eclipse.jdt.internal.core.CompilationUnit.closing(CompilationUnit.java:176) [java] at org.eclipse.jdt.internal.core.JavaModelManager.removeInfoAndChildren(JavaModelManager.java:1225) [java] - locked <0x45072a60> (a org.eclipse.jdt.internal.core.JavaModelManager) [java] at org.eclipse.jdt.internal.core.JavaElement.close(JavaElement.java:88) [java] at org.eclipse.jdt.internal.core.CompilationUnit.close(CompilationUnit.java:169) [java] at org.eclipse.jdt.internal.core.CompilationUnit.becomeWorkingCopy(CompilationUnit.java:79) [java] at org.eclipse.jdt.internal.ui.javaeditor.filebuffers.CompilationUnitDocumentProvider2.createFileInfo(CompilationUnitDocumentProvider2.java:764) [java] at org.eclipse.ui.editors.text.TextFileDocumentProvider.connect(TextFileDocumentProvider.java:298) [java] at org.eclipse.ui.texteditor.AbstractTextEditor.doSetInput(AbstractTextEditor.java:2500) [java] at org.eclipse.ui.texteditor.StatusTextEditor.doSetInput(StatusTextEditor.java:162) [java] at org.eclipse.jdt.internal.ui.javaeditor.JavaEditor.doSetInput(JavaEditor.java:2088) [java] at org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor.doSetInput(CompilationUnitEditor.java:1003) [java] at org.eclipse.ui.texteditor.AbstractTextEditor.setInput(AbstractTextEditor.java:2517) [java] at org.eclipse.debug.internal.ui.views.launch.LaunchView.openEditor(LaunchView.java:842) [java] at org.eclipse.debug.internal.ui.views.launch.LaunchView.openEditorForStackFrame(LaunchView.java:655) [java] at org.eclipse.debug.internal.ui.views.launch.LaunchView.showEditorForCurrentSelection(LaunchView.java:574) [java] at org.eclipse.debug.internal.ui.views.launch.LaunchView.selectionChanged(LaunchView.java:450) [java] at org.eclipse.jface.viewers.Viewer$2.run(Viewer.java:159) [java] at org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:1034) [java] at org.eclipse.core.runtime.Platform.run(Platform.java:432) [java] at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:157) [java] at org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:1282) [java] at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1012) [java] at org.eclipse.debug.internal.ui.views.launch.LaunchView.autoExpand(LaunchView.java:964) [java] at org.eclipse.debug.internal.ui.views.launch.LaunchViewEventHandler.doHandleSuspendThreadEvent(LaunchViewEventHandler.java:243) [java] at org.eclipse.debug.internal.ui.views.launch.LaunchViewEventHandler.doHandleSuspendEvent(LaunchViewEventHandler.java:193) [java] at org.eclipse.debug.internal.ui.views.launch.LaunchViewEventHandler.doHandleDebugEvents(LaunchViewEventHandler.java:103) [java] at org.eclipse.debug.internal.ui.views.launch.LaunchViewEventHandler.updateForDebugEvents(LaunchViewEventHandler.java:260) [java] at org.eclipse.debug.internal.ui.views.AbstractDebugEventHandler$1.run(AbstractDebugEventHandler.java:72) [java] at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) [java] at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:102) [java] - locked <0x449a4fc0> (a org.eclipse.swt.widgets.RunnableLock) [java] at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:1792) [java] at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:1598) [java] at org.eclipse.jdt.debug.tests.AutomatedSuite.run(AutomatedSuite.java:185) [java] at org.eclipse.test.EclipseTestRunner.run(EclipseTestRunner.java:320) [java] at org.eclipse.test.EclipseTestRunner.run(EclipseTestRunner.java:199) [java] at org.eclipse.test.EclipseTestRunner.main(EclipseTestRunner.java:134) [java] at org.eclipse.test.UITestApplication.runTests(UITestApplication.java:45) [java] at org.eclipse.test.UITestApplication.runEventLoop(UITestApplication.java:39) [java] at org.eclipse.ui.internal.Workbench.run(Workbench.java:2298) [java] at org.eclipse.core.internal.boot.InternalBootLoader.run(InternalBootLoader.java:858) [java] at org.eclipse.core.boot.BootLoader.run(BootLoader.java:461) [java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [java] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [java] at java.lang.reflect.Method.invoke(Method.java:324) [java] at org.eclipse.core.launcher.Main.basicRun(Main.java:298) [java] at org.eclipse.core.launcher.Main.run(Main.java:764) [java] at org.eclipse.core.launcher.Main.main(Main.java:598) [java] "VM Thread" prio=1 tid=0x08086f40 nid=0x7339 runnable [java] "VM Periodic Task Thread" prio=1 tid=0x080a2248 nid=0x733f waiting on condition [java] "Suspend Checker Thread" prio=1 tid=0x0809f1a0 nid=0x733c runnable It seems that the lock of the buffer is reached from two different threads.
Note that the lock is on the buffer's lock, not on the compilation unit.
Taking the buffer's lock on save was useless. Removed the synchronize statement. Also checked other places where this lock is taken, and they are all fine as they don't do call out while the lock is taken.
Verified.