Bug 44242 - Deadlock during jdt/debug test
Summary: Deadlock during jdt/debug test
Status: VERIFIED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 3.0   Edit
Hardware: PC Linux
: P3 critical (vote)
Target Milestone: 3.0 M4   Edit
Assignee: Jerome Lanneluc CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2003-10-06 15:03 EDT by Olivier Thomann CLA
Modified: 2003-10-14 11:51 EDT (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Olivier Thomann CLA 2003-10-06 15:03:33 EDT
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.
Comment 1 Jerome Lanneluc CLA 2003-10-06 17:04:11 EDT
Note that the lock is on the buffer's lock, not on the compilation unit.
Comment 2 Jerome Lanneluc CLA 2003-10-06 17:20:17 EDT
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.
Comment 3 David Audel CLA 2003-10-14 11:51:36 EDT
Verified.