You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by "Carsten Pfeiffer (JIRA)" <ji...@apache.org> on 2014/03/20 11:54:42 UTC
[jira] [Created] (IVYDE-361) Deadlock in classpath container
Carsten Pfeiffer created IVYDE-361:
--------------------------------------
Summary: Deadlock in classpath container
Key: IVYDE-361
URL: https://issues.apache.org/jira/browse/IVYDE-361
Project: IvyDE
Issue Type: Bug
Components: classpath container
Reporter: Carsten Pfeiffer
The change in IvyClasspathContainer (asyncExec -> syncExec) may unfortunately lead to deadlock situations. If the main thread attempts to execute a job while the resolve job is already running, the main thread waits for the resolve job to finish. The latter then attempts to syncExec() into the main thread, which won't work.
I'm wondering why the IvyClasspathContainer (now Impl) needs to syncExec() or asyncExec() at all. Do you remember why it cannot update the classpath in the background thread?
{code}
Thread [Worker-4] (Suspended)
waiting for: RunnableLock (id=122)
Object.wait(long) line: not available [native method]
RunnableLock(Object).wait() line: 503
Synchronizer.syncExec(Runnable) line: 187
Display.syncExec(Runnable) line: 4330
IvyClasspathContainerImpl.setClasspathEntries(IClasspathEntry[]) line: 148
IvyClasspathContainerImpl.updateClasspathEntries(IClasspathEntry[]) line: 144
IvyClasspathResolver.postBatchResolve() line: 40
IvyResolveJob.doRun(IProgressMonitor) line: 263
IvyResolveJob.run(IProgressMonitor) line: 85
Worker.run() line: 54
{code}
{code}
Thread [main] (Suspended)
owns: RunnableLock (id=122)
waited by: Thread [Worker-4] (Suspended)
waiting for: Object (id=123)
Object.wait(long) line: not available [native method]
Object.wait() line: 503
ThreadJob.waitForRun(ThreadJob, IProgressMonitor, InternalJob, Thread) line: 272
ThreadJob.joinRun(ThreadJob, IProgressMonitor) line: 199
ImplicitJobs.begin(ISchedulingRule, IProgressMonitor, boolean) line: 92
JobManager.beginRule(ISchedulingRule, IProgressMonitor) line: 286
WorkManager.checkIn(ISchedulingRule, IProgressMonitor) line: 118
Workspace.prepareOperation(ISchedulingRule, IProgressMonitor) line: 2282
Folder(Resource).refreshLocal(int, IProgressMonitor) line: 1655
ExternalFoldersManager.createLinkFolder(IPath, boolean, IProject, IProgressMonitor) line: 155
ExternalFoldersManager.createLinkFolder(IPath, boolean, IProgressMonitor) line: 145
ExternalFolderChange.updateExternalFoldersIfNecessary(boolean, IProgressMonitor) line: 48
SetContainerOperation(ChangeClasspathOperation).classpathChanged(ClasspathChange, boolean) line: 62
SetContainerOperation.executeOperation() line: 110
SetContainerOperation(JavaModelOperation).run(IProgressMonitor) line: 728
Workspace.run(IWorkspaceRunnable, ISchedulingRule, int, IProgressMonitor) line: 2344
SetContainerOperation(JavaModelOperation).runOperation(IProgressMonitor) line: 793
JavaCore.setClasspathContainer(IPath, IJavaProject[], IClasspathContainer[], IProgressMonitor) line: 4952
IvyClasspathContainerImpl.notifyUpdateClasspathEntries() line: 172
IvyClasspathContainerImpl$1.run() line: 162
RunnableLock.run() line: 35
Synchronizer.runAsyncMessages(boolean) line: 135
Display.runAsyncMessages(boolean) line: 3563
Display.readAndDispatch() line: 3212
...
{code}
(This is basically a copy of my comments to the already close IVYDE-259.
--
This message was sent by Atlassian JIRA
(v6.2#6252)