Hi,

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.

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 

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 
...

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?

Thanks
Carsten

Reply via email to