Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 348573

Summary: Deadlock between BinaryRunner and project model serializing lock
Product: [Tools] CDT Reporter: Anton Leherbauer <aleherb+eclipse>
Component: cdt-coreAssignee: Anton Leherbauer <aleherb+eclipse>
Status: RESOLVED FIXED QA Contact: Doug Schaefer <cdtdoug>
Severity: major    
Priority: P3 CC: jamesblackburn+eclipse, mober.at+eclipse, yevshif
Version: 7.0.2   
Target Milestone: 8.0.1   
Hardware: All   
OS: All   
Whiteboard:
Attachments:
Description Flags
Patch aleherb+eclipse: iplog-

Description Anton Leherbauer CLA 2011-06-07 10:22:08 EDT
"Worker-80" prio=10 tid=0x0a1eb000 nid=0x2ad2 in Object.wait() [0x8c006000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at org.eclipse.core.internal.jobs.Semaphore.acquire(Semaphore.java:39)
        - locked <0x96128e48> (a org.eclipse.core.internal.jobs.Semaphore)
        at org.eclipse.core.internal.jobs.OrderedLock.doAcquire(OrderedLock.java:176)
        at org.eclipse.core.internal.jobs.OrderedLock.acquire(OrderedLock.java:110)
        at org.eclipse.core.internal.jobs.OrderedLock.acquire(OrderedLock.java:84)
        at org.eclipse.cdt.internal.core.settings.model.xml.XmlProjectDescriptionStorage.getProjectDescription(XmlProjectDescriptionStorage.java:224)
        at org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager.getProjectDescriptionInternal(CProjectDescriptionManager.java:416)
        at org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager.getProjectDescription(CProjectDescriptionManager.java:398)
        at org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager.getProjectDescription(CProjectDescriptionManager.java:393)
        at org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager.getProjectDescription(CProjectDescriptionManager.java:386)
        at org.eclipse.cdt.internal.core.model.CProject.computeSourceRoots(CProject.java:603)
        at org.eclipse.cdt.internal.core.model.CProject.getAllSourceRoots(CProject.java:503)
        at org.eclipse.cdt.internal.core.model.CProject.findSourceRoot(CProject.java:465)
        at org.eclipse.cdt.internal.core.model.CModelManager.create(CModelManager.java:377)
        at org.eclipse.cdt.internal.core.model.BinaryRunner$Visitor.visit(BinaryRunner.java:223)
        at org.eclipse.core.internal.resources.Resource$1.visitElement(Resource.java:64)
        at org.eclipse.core.internal.watson.ElementTreeIterator.doIteration(ElementTreeIterator.java:82)
        at org.eclipse.core.internal.watson.ElementTreeIterator.doIteration(ElementTreeIterator.java:86)
        at org.eclipse.core.internal.watson.ElementTreeIterator.doIteration(ElementTreeIterator.java:86)
        at org.eclipse.core.internal.watson.ElementTreeIterator.doIteration(ElementTreeIterator.java:86)
        at org.eclipse.core.internal.watson.ElementTreeIterator.doIteration(ElementTreeIterator.java:86)
        at org.eclipse.core.internal.watson.ElementTreeIterator.doIteration(ElementTreeIterator.java:86)
        at org.eclipse.core.internal.watson.ElementTreeIterator.doIteration(ElementTreeIterator.java:86)
        at org.eclipse.core.internal.watson.ElementTreeIterator.doIteration(ElementTreeIterator.java:86)
        at org.eclipse.core.internal.watson.ElementTreeIterator.iterate(ElementTreeIterator.java:127)
        at org.eclipse.core.internal.resources.Resource.accept(Resource.java:74)
        at org.eclipse.cdt.internal.core.model.BinaryRunner$1.run(BinaryRunner.java:122)
        at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)

"Worker-78" prio=10 tid=0x8a126000 nid=0x29ce in Object.wait() [0x8c14a000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at org.eclipse.core.internal.jobs.Semaphore.acquire(Semaphore.java:39)
        - locked <0x960c6e88> (a org.eclipse.core.internal.jobs.Semaphore)
        at org.eclipse.core.internal.jobs.JobManager.join(JobManager.java:847)
        at org.eclipse.core.internal.jobs.InternalJob.join(InternalJob.java:380)
        at org.eclipse.core.runtime.jobs.Job.join(Job.java:385)
        at org.eclipse.cdt.internal.core.model.BinaryRunner.waitIfRunning(BinaryRunner.java:157)
        at org.eclipse.cdt.internal.core.model.BinaryRunner.stop(BinaryRunner.java:170)
        at org.eclipse.cdt.internal.core.model.CModelManager.removeBinaryRunner(CModelManager.java:805)
        at org.eclipse.cdt.internal.core.model.CModelManager.removeBinaryRunner(CModelManager.java:796)
        at org.eclipse.cdt.internal.core.model.CProject.closing(CProject.java:734)
        at org.eclipse.cdt.internal.core.model.CModelManager.releaseCElement(CModelManager.java:539)
        at org.eclipse.cdt.internal.core.model.CElement.close(CElement.java:381)
        at org.eclipse.cdt.internal.core.settings.model.PathEntryConfigurationDataProvider.createData(PathEntryConfigurationDataProvider.java:336)
        at org.eclipse.cdt.internal.core.settings.model.PathEntryConfigurationDataProvider.createData(PathEntryConfigurationDataProvider.java:274)
        at org.eclipse.cdt.internal.core.settings.model.PathEntryConfigurationDataProvider.loadConfiguration(PathEntryConfigurationDataProvider.java:363)
        at org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager.loadData(CProjectDescriptionManager.java:1115)
        at org.eclipse.cdt.internal.core.settings.model.CConfigurationDescriptionCache.loadData(CConfigurationDescriptionCache.java:95)
        at org.eclipse.cdt.internal.core.settings.model.CProjectDescription.loadDatas(CProjectDescription.java:196)
        at org.eclipse.cdt.internal.core.settings.model.xml.XmlProjectDescriptionStorage.loadProjectDescription(XmlProjectDescriptionStorage.java:486)
        at org.eclipse.cdt.internal.core.settings.model.xml.XmlProjectDescriptionStorage.getProjectDescription(XmlProjectDescriptionStorage.java:231)
        at org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager.getProjectDescriptionInternal(CProjectDescriptionManager.java:416)
        at org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager.getProjectDescription(CProjectDescriptionManager.java:398)
        at org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager.getProjectDescription(CProjectDescriptionManager.java:393)
        at org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager.getProjectDescription(CProjectDescriptionManager.java:386)
        at org.eclipse.cdt.internal.ui.viewsupport.ExcludedFileDecorator.decorate(ExcludedFileDecorator.java:40)
        at org.eclipse.ui.internal.decorators.LightweightDecoratorDefinition.decorate(LightweightDecoratorDefinition.java:263)
        at org.eclipse.ui.internal.decorators.LightweightDecoratorManager$LightweightRunnable.run(LightweightDecoratorManager.java:81)
        at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
        at org.eclipse.ui.internal.decorators.LightweightDecoratorManager.decorate(LightweightDecoratorManager.java:365)
        at org.eclipse.ui.internal.decorators.LightweightDecoratorManager.getDecorations(LightweightDecoratorManager.java:347)
        at org.eclipse.ui.internal.decorators.DecorationScheduler$1.ensureResultCached(DecorationScheduler.java:371)
        at org.eclipse.ui.internal.decorators.DecorationScheduler$1.run(DecorationScheduler.java:331)
        at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)

Note that this specific deadlock can only occur with "old-style" C/C++ projects.
It looks like this can be easily solved by waiting for the BinaryRunner in CProject.closing() before flushing the project info cache, so that the BinaryRunner does not try to recreate the cache.
Comment 1 Anton Leherbauer CLA 2011-06-07 10:32:50 EDT
Related to bug 296562.
Comment 2 Martin Oberhuber CLA 2011-06-08 18:18:59 EDT
CQ:WIND00276703
Comment 3 Anton Leherbauer CLA 2011-06-09 06:32:17 EDT
Created attachment 197679 [details]
Patch

That's the simple fix described above.
Comment 4 Anton Leherbauer CLA 2011-06-29 09:35:44 EDT
Fixed in master and cdt_8_0.