Community
Participate
Working Groups
Created attachment 165801 [details] Thread dump I'm launching an inner Eclipse from the build #48 4.0 SDK. This happens intermittently. I have a habit of deleting everything in .metadata/.plugins/ except for the org.eclipse.core.resources folder of my target workspace. Maybe this is the cause. I believe I was expanding my org.eclipse.ui plug-in project from 'Package Explorer' when this happened.
Jay, please investigate.
The problem comes from Worker-3: 3XMTHREADINFO "Worker-3" (TID:0x22FC2E00, sys_thread_t:0x21EA6038, state:CW, native ID:0x00000B40) prio=5 4XESTACKTRACE at java/lang/Object.wait(Native Method) 4XESTACKTRACE at java/lang/Object.wait(Object.java:231) 4XESTACKTRACE at org/eclipse/core/internal/jobs/ThreadJob.waitForRun(ThreadJob.java:269(Compiled Code)) 4XESTACKTRACE at org/eclipse/core/internal/jobs/ThreadJob.joinRun(ThreadJob.java:199) 4XESTACKTRACE at org/eclipse/core/internal/jobs/ImplicitJobs.begin(ImplicitJobs.java:92) 4XESTACKTRACE at org/eclipse/core/internal/jobs/JobManager.beginRule(JobManager.java:285) 4XESTACKTRACE at org/eclipse/core/internal/resources/WorkManager.checkIn(WorkManager.java:117) 4XESTACKTRACE at org/eclipse/core/internal/resources/Workspace.prepareOperation(Workspace.java:1914) 4XESTACKTRACE at org/eclipse/core/internal/resources/Project.open(Project.java:914) 4XESTACKTRACE at org/eclipse/core/internal/resources/Project.open(Project.java:984) 4XESTACKTRACE at org/eclipse/jdt/internal/core/ExternalFoldersManager.openExternalFoldersProject(ExternalFoldersManager.java:177) 4XESTACKTRACE at org/eclipse/jdt/internal/core/ExternalFoldersManager.getFolders(ExternalFoldersManager.java:237(Compiled Code)) 4XESTACKTRACE at org/eclipse/jdt/internal/core/ExternalFoldersManager.getFolder(ExternalFoldersManager.java:226) 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaModel.getExternalTarget(JavaModel.java:333) The lock on ExternalFoldersManager.getFolder(..) does release the lock before being blocked on a wait.
Created attachment 165810 [details] Workspace zip You can try and use this zipped workspace to reproduce the problem. When I launch my inner it hangs at 30% trying to initialize the Java tooling. It seems once I try to expand one of my Java projects, JDT tries to invoke the same code so the UI thread also ends up hanging on getExternalTarget(IPath, boolean). 2XMFULLTHDDUMP Full thread dump J9 VM (J2RE 5.0 IBM J9 2.3 Windows XP x86-32 build 20090706_38445_lHdSMr, native threads): 3XMTHREADINFO "main" (TID:0x210A4E00, sys_thread_t:0x00376B80, state:CW, native ID:0x00002370) prio=6 4XESTACKTRACE at org/eclipse/swt/internal/win32/OS.WaitMessage(Native Method) 4XESTACKTRACE at org/eclipse/swt/widgets/Display.sleep(Display.java:4526(Compiled Code)) 4XESTACKTRACE at org/eclipse/e4/ui/workbench/swt/internal/PartRenderingEngine$5.run(PartRenderingEngine.java:547) 4XESTACKTRACE at org/eclipse/core/databinding/observable/Realm.runWithDefault(Realm.java:332) 4XESTACKTRACE at org/eclipse/e4/ui/workbench/swt/internal/PartRenderingEngine.run(PartRenderingEngine.java:477) 4XESTACKTRACE at org/eclipse/e4/workbench/ui/internal/E4Workbench.createAndRunUI(E4Workbench.java:101) 4XESTACKTRACE at org/eclipse/ui/internal/Workbench$3.run(Workbench.java:533) 4XESTACKTRACE at org/eclipse/core/databinding/observable/Realm.runWithDefault(Realm.java:332) 4XESTACKTRACE at org/eclipse/ui/internal/Workbench.createAndRunWorkbench(Workbench.java:519) 4XESTACKTRACE at org/eclipse/ui/PlatformUI.createAndRunWorkbench(PlatformUI.java:149) 4XESTACKTRACE at org/eclipse/ui/internal/ide/application/IDEApplication.start(IDEApplication.java:115) 4XESTACKTRACE at org/eclipse/equinox/internal/app/EclipseAppHandle.run(EclipseAppHandle.java:196) 4XESTACKTRACE at org/eclipse/core/runtime/internal/adaptor/EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 4XESTACKTRACE at org/eclipse/core/runtime/internal/adaptor/EclipseAppLauncher.start(EclipseAppLauncher.java:79) 4XESTACKTRACE at org/eclipse/core/runtime/adaptor/EclipseStarter.run(EclipseStarter.java:369) 4XESTACKTRACE at org/eclipse/core/runtime/adaptor/EclipseStarter.run(EclipseStarter.java:179) 4XESTACKTRACE at sun/reflect/NativeMethodAccessorImpl.invoke0(Native Method) 4XESTACKTRACE at sun/reflect/NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79) 4XESTACKTRACE at sun/reflect/DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 4XESTACKTRACE at java/lang/reflect/Method.invoke(Method.java:618) 4XESTACKTRACE at org/eclipse/equinox/launcher/Main.invokeFramework(Main.java:619) 4XESTACKTRACE at org/eclipse/equinox/launcher/Main.basicRun(Main.java:574) 4XESTACKTRACE at org/eclipse/equinox/launcher/Main.run(Main.java:1407) 4XESTACKTRACE at org/eclipse/equinox/launcher/Main.main(Main.java:1383) 3XMTHREADINFO "JIT Compilation Thread" (TID:0x210A5200, sys_thread_t:0x00376DD8, state:CW, native ID:0x0000264C) prio=11 3XMTHREADINFO "Signal Dispatcher" (TID:0x210A5600, sys_thread_t:0x00377288, state:R, native ID:0x00002550) prio=5 4XESTACKTRACE at com/ibm/misc/SignalDispatcher.waitForSignal(Native Method) 4XESTACKTRACE at com/ibm/misc/SignalDispatcher.run(SignalDispatcher.java:84) 3XMTHREADINFO "Gc Slave Thread" (TID:0x21640100, sys_thread_t:0x00377738, state:CW, native ID:0x00000420) prio=5 3XMTHREADINFO "State Data Manager" (TID:0x21640500, sys_thread_t:0x21B7FF88, state:CW, native ID:0x00001300) prio=5 4XESTACKTRACE at java/lang/Thread.sleep(Native Method) 4XESTACKTRACE at java/lang/Thread.sleep(Thread.java:939) 4XESTACKTRACE at org/eclipse/osgi/internal/baseadaptor/StateManager.run(StateManager.java:319) 4XESTACKTRACE at java/lang/Thread.run(Thread.java:811) 3XMTHREADINFO "Start Level Event Dispatcher" (TID:0x21640900, sys_thread_t:0x21B801E0, state:CW, native ID:0x0000260C) prio=5 4XESTACKTRACE at java/lang/Object.wait(Native Method) 4XESTACKTRACE at java/lang/Object.wait(Object.java:199) 4XESTACKTRACE at org/eclipse/osgi/framework/eventmgr/EventManager$EventThread.getNextEvent(EventManager.java:397) 4XESTACKTRACE at org/eclipse/osgi/framework/eventmgr/EventManager$EventThread.run(EventManager.java:333) 3XMTHREADINFO "Framework Event Dispatcher" (TID:0x22060500, sys_thread_t:0x21B80438, state:CW, native ID:0x000026A8) prio=5 4XESTACKTRACE at java/lang/Object.wait(Native Method) 4XESTACKTRACE at java/lang/Object.wait(Object.java:199(Compiled Code)) 4XESTACKTRACE at org/eclipse/osgi/framework/eventmgr/EventManager$EventThread.getNextEvent(EventManager.java:397(Compiled Code)) 4XESTACKTRACE at org/eclipse/osgi/framework/eventmgr/EventManager$EventThread.run(EventManager.java:333) 3XMTHREADINFO "Bundle File Closer" (TID:0x22060900, sys_thread_t:0x21B80690, state:CW, native ID:0x0000171C) prio=5 4XESTACKTRACE at java/lang/Object.wait(Native Method) 4XESTACKTRACE at java/lang/Object.wait(Object.java:199(Compiled Code)) 4XESTACKTRACE at org/eclipse/osgi/framework/eventmgr/EventManager$EventThread.getNextEvent(EventManager.java:397(Compiled Code)) 4XESTACKTRACE at org/eclipse/osgi/framework/eventmgr/EventManager$EventThread.run(EventManager.java:333) 3XMTHREADINFO "Worker-JM" (TID:0x22060D00, sys_thread_t:0x21B808E8, state:CW, native ID:0x000027BC) prio=5 4XESTACKTRACE at java/lang/Object.wait(Native Method) 4XESTACKTRACE at java/lang/Object.wait(Object.java:231) 4XESTACKTRACE at org/eclipse/core/internal/jobs/InternalWorker.run(InternalWorker.java:58) 3XMTHREADINFO "[Timer] - Main Queue Handler" (TID:0x22193A00, sys_thread_t:0x21B80B40, state:CW, native ID:0x000016A4) prio=5 4XESTACKTRACE at java/lang/Object.wait(Native Method) 4XESTACKTRACE at java/lang/Object.wait(Object.java:231) 4XESTACKTRACE at org/eclipse/equinox/internal/util/impl/tpt/timer/TimerImpl.run(TimerImpl.java:141) 4XESTACKTRACE at java/lang/Thread.run(Thread.java:811) 3XMTHREADINFO "[ThreadPool Manager] - Idle Thread" (TID:0x22193E00, sys_thread_t:0x21D65008, state:CW, native ID:0x00000528) prio=5 4XESTACKTRACE at java/lang/Object.wait(Native Method) 4XESTACKTRACE at java/lang/Object.wait(Object.java:199) 4XESTACKTRACE at org/eclipse/equinox/internal/util/impl/tpt/threadpool/Executor.run(Executor.java:106) 3XMTHREADINFO "Worker-0" (TID:0x22194200, sys_thread_t:0x21D65260, state:B, native ID:0x000017F8) prio=5 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaModel.getExternalTarget(JavaModel.java:333) 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaModel.getTarget(JavaModel.java:319) 4XESTACKTRACE at org/eclipse/jdt/internal/core/ClasspathEntry.getCalledFileNames(ClasspathEntry.java:949) 4XESTACKTRACE at org/eclipse/jdt/internal/core/ClasspathEntry.resolvedChainedLibraries(ClasspathEntry.java:920) 4XESTACKTRACE at org/eclipse/jdt/internal/core/ClasspathEntry.resolvedChainedLibraries(ClasspathEntry.java:907) 4XESTACKTRACE at org/eclipse/jdt/internal/core/ClasspathEntry.resolvedChainedLibraries(ClasspathEntry.java:1447) 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaProject.resolveClasspath(JavaProject.java:2673) 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaProject.resolveClasspath(JavaProject.java:2779) 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaProject.getResolvedClasspath(JavaProject.java:1915) 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaProject.computeExpandedClasspath(JavaProject.java:485) 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaProject.getExpandedClasspath(JavaProject.java:1527) 4XESTACKTRACE at org/eclipse/jdt/internal/core/builder/NameEnvironment.computeClasspathLocations(NameEnvironment.java:93) 4XESTACKTRACE at org/eclipse/jdt/internal/core/builder/NameEnvironment.<init>(NameEnvironment.java:41) 4XESTACKTRACE at org/eclipse/jdt/internal/core/builder/JavaBuilder.initializeBuilder(JavaBuilder.java:603) 4XESTACKTRACE at org/eclipse/jdt/internal/core/builder/JavaBuilder.build(JavaBuilder.java:167) 4XESTACKTRACE at org/eclipse/core/internal/events/BuildManager$2.run(BuildManager.java:628) 4XESTACKTRACE at org/eclipse/core/runtime/SafeRunner.run(SafeRunner.java:42) 4XESTACKTRACE at org/eclipse/core/internal/events/BuildManager.basicBuild(BuildManager.java:171) 4XESTACKTRACE at org/eclipse/core/internal/events/BuildManager.basicBuild(BuildManager.java:202) 4XESTACKTRACE at org/eclipse/core/internal/events/BuildManager$1.run(BuildManager.java:254) 4XESTACKTRACE at org/eclipse/core/runtime/SafeRunner.run(SafeRunner.java:42) 4XESTACKTRACE at org/eclipse/core/internal/events/BuildManager.basicBuild(BuildManager.java:257) 4XESTACKTRACE at org/eclipse/core/internal/events/BuildManager.basicBuildLoop(BuildManager.java:310) 4XESTACKTRACE at org/eclipse/core/internal/events/BuildManager.build(BuildManager.java:342) 4XESTACKTRACE at org/eclipse/core/internal/events/AutoBuildJob.doBuild(AutoBuildJob.java:140) 4XESTACKTRACE at org/eclipse/core/internal/events/AutoBuildJob.run(AutoBuildJob.java:238) 4XESTACKTRACE at org/eclipse/core/internal/jobs/Worker.run(Worker.java:54) 3XMTHREADINFO "Worker-1" (TID:0x22CBEE00, sys_thread_t:0x21D654B8, state:CW, native ID:0x00001C14) prio=5 4XESTACKTRACE at java/lang/Object.wait(Native Method) 4XESTACKTRACE at java/lang/Object.wait(Object.java:231) 4XESTACKTRACE at org/eclipse/core/internal/jobs/ThreadJob.waitForRun(ThreadJob.java:269) 4XESTACKTRACE at org/eclipse/core/internal/jobs/ThreadJob.joinRun(ThreadJob.java:199) 4XESTACKTRACE at org/eclipse/core/internal/jobs/ImplicitJobs.begin(ImplicitJobs.java:92) 4XESTACKTRACE at org/eclipse/core/internal/jobs/JobManager.beginRule(JobManager.java:285) 4XESTACKTRACE at org/eclipse/core/internal/resources/WorkManager.checkIn(WorkManager.java:117) 4XESTACKTRACE at org/eclipse/core/internal/resources/Workspace.prepareOperation(Workspace.java:1914) 4XESTACKTRACE at org/eclipse/core/internal/resources/Project.open(Project.java:914) 4XESTACKTRACE at org/eclipse/core/internal/resources/Project.open(Project.java:984) 4XESTACKTRACE at org/eclipse/jdt/internal/core/ExternalFoldersManager.openExternalFoldersProject(ExternalFoldersManager.java:177) 4XESTACKTRACE at org/eclipse/jdt/internal/core/ExternalFoldersManager.getFolders(ExternalFoldersManager.java:237) 4XESTACKTRACE at org/eclipse/jdt/internal/core/ExternalFoldersManager.getFolder(ExternalFoldersManager.java:226) 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaModel.getExternalTarget(JavaModel.java:333) 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaModel.getTarget(JavaModel.java:319) 4XESTACKTRACE at org/eclipse/jdt/internal/core/ClasspathEntry.getCalledFileNames(ClasspathEntry.java:949) 4XESTACKTRACE at org/eclipse/jdt/internal/core/ClasspathEntry.resolvedChainedLibraries(ClasspathEntry.java:920) 4XESTACKTRACE at org/eclipse/jdt/internal/core/ClasspathEntry.resolvedChainedLibraries(ClasspathEntry.java:907) 4XESTACKTRACE at org/eclipse/jdt/internal/core/ClasspathEntry.resolvedChainedLibraries(ClasspathEntry.java:1447) 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaProject.resolveClasspath(JavaProject.java:2673) 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaProject.resolveClasspath(JavaProject.java:2779) 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaProject.getResolvedClasspath(JavaProject.java:1915) 4XESTACKTRACE at org/eclipse/jdt/internal/core/ProjectReferenceChange.updateProjectReferencesIfNecessary(ProjectReferenceChange.java:46) 4XESTACKTRACE at org/eclipse/jdt/internal/core/ChangeClasspathOperation.classpathChanged(ChangeClasspathOperation.java:59) 4XESTACKTRACE at org/eclipse/jdt/internal/core/SetContainerOperation.executeOperation(SetContainerOperation.java:110) 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaModelOperation.run(JavaModelOperation.java:728) 4XESTACKTRACE at org/eclipse/core/internal/resources/Workspace.run(Workspace.java:1975) 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaModelOperation.runOperation(JavaModelOperation.java:793) 4XESTACKTRACE at org/eclipse/jdt/core/JavaCore.setClasspathContainer(JavaCore.java:4842) 4XESTACKTRACE at org/eclipse/jdt/internal/launching/JREContainerInitializer.initialize(JREContainerInitializer.java:69) 4XESTACKTRACE at org/eclipse/jdt/internal/launching/LaunchingPlugin$VMChanges.rebind(LaunchingPlugin.java:298) 4XESTACKTRACE at org/eclipse/jdt/internal/launching/LaunchingPlugin$VMChanges.access$0(LaunchingPlugin.java:263) 4XESTACKTRACE at org/eclipse/jdt/internal/launching/LaunchingPlugin$1.run(LaunchingPlugin.java:251) 4XESTACKTRACE at org/eclipse/jdt/internal/core/BatchOperation.executeOperation(BatchOperation.java:39) 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaModelOperation.run(JavaModelOperation.java:728) 4XESTACKTRACE at org/eclipse/core/internal/resources/Workspace.run(Workspace.java:1975) 4XESTACKTRACE at org/eclipse/jdt/core/JavaCore.run(JavaCore.java:4777) 4XESTACKTRACE at org/eclipse/jdt/internal/launching/LaunchingPlugin$VMChanges.doit(LaunchingPlugin.java:255) 4XESTACKTRACE at org/eclipse/jdt/internal/launching/LaunchingPlugin$JREUpdateJob.run(LaunchingPlugin.java:335) 4XESTACKTRACE at org/eclipse/core/internal/jobs/Worker.run(Worker.java:54) 3XMTHREADINFO "Worker-2" (TID:0x22CBF200, sys_thread_t:0x21D65710, state:CW, native ID:0x00002730) prio=5 4XESTACKTRACE at java/lang/Object.wait(Native Method) 4XESTACKTRACE at java/lang/Object.wait(Object.java:231) 4XESTACKTRACE at org/eclipse/core/internal/jobs/ThreadJob.waitForRun(ThreadJob.java:269) 4XESTACKTRACE at org/eclipse/core/internal/jobs/ThreadJob.joinRun(ThreadJob.java:199) 4XESTACKTRACE at org/eclipse/core/internal/jobs/ImplicitJobs.begin(ImplicitJobs.java:92) 4XESTACKTRACE at org/eclipse/core/internal/jobs/JobManager.beginRule(JobManager.java:285) 4XESTACKTRACE at org/eclipse/core/internal/resources/WorkManager.checkIn(WorkManager.java:117) 4XESTACKTRACE at org/eclipse/core/internal/resources/Workspace.prepareOperation(Workspace.java:1914) 4XESTACKTRACE at org/eclipse/core/internal/resources/Workspace.run(Workspace.java:1970) 4XESTACKTRACE at org/eclipse/core/internal/resources/Workspace.run(Workspace.java:1957) 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaModelManager$19.run(JavaModelManager.java:4722) 4XESTACKTRACE at org/eclipse/core/internal/jobs/Worker.run(Worker.java:54) 3XMTHREADINFO "Finalizer thread" (TID:0x22CBF600, sys_thread_t:0x21E20D70, state:CW, native ID:0x00002640) prio=5 3XMTHREADINFO "Java indexing" (TID:0x233A5200, sys_thread_t:0x21D65BC0, state:CW, native ID:0x00002578) prio=4 4XESTACKTRACE at java/lang/Object.wait(Native Method) 4XESTACKTRACE at java/lang/Object.wait(Object.java:199) 4XESTACKTRACE at org/eclipse/jdt/internal/core/search/processing/JobManager.run(JobManager.java:381) 4XESTACKTRACE at java/lang/Thread.run(Thread.java:811) 3XMTHREADINFO "StackTrace Remote Thread" (TID:0x233A5A00, sys_thread_t:0x21E216D0, state:R, native ID:0x00002544) prio=10 4XESTACKTRACE at com/ibm/jvm/Dump.JavaDump(Native Method) 3XMTHREADINFO "Worker-4" (TID:0x24A8C000, sys_thread_t:0x21E21220, state:CW, native ID:0x00002678) prio=5 4XESTACKTRACE at java/lang/Object.wait(Native Method) 4XESTACKTRACE at java/lang/Object.wait(Object.java:231) 4XESTACKTRACE at org/eclipse/core/internal/jobs/ThreadJob.waitForRun(ThreadJob.java:269) 4XESTACKTRACE at org/eclipse/core/internal/jobs/ThreadJob.joinRun(ThreadJob.java:199) 4XESTACKTRACE at org/eclipse/core/internal/jobs/ImplicitJobs.begin(ImplicitJobs.java:92) 4XESTACKTRACE at org/eclipse/core/internal/jobs/JobManager.beginRule(JobManager.java:285) 4XESTACKTRACE at org/eclipse/core/internal/utils/StringPoolJob.run(StringPoolJob.java:99) 4XESTACKTRACE at org/eclipse/core/internal/jobs/Worker.run(Worker.java:54) 3XMTHREADINFO "Worker-3" (TID:0x24A8C400, sys_thread_t:0x21E21478, state:B, native ID:0x000024F0) prio=5 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaModel.getExternalTarget(JavaModel.java:333) 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaModel.getTarget(JavaModel.java:319) 4XESTACKTRACE at org/eclipse/jdt/internal/core/ClasspathEntry.getCalledFileNames(ClasspathEntry.java:949) 4XESTACKTRACE at org/eclipse/jdt/internal/core/ClasspathEntry.resolvedChainedLibraries(ClasspathEntry.java:920) 4XESTACKTRACE at org/eclipse/jdt/internal/core/ClasspathEntry.resolvedChainedLibraries(ClasspathEntry.java:907) 4XESTACKTRACE at org/eclipse/jdt/internal/core/ClasspathEntry.resolvedChainedLibraries(ClasspathEntry.java:1447) 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaProject.resolveClasspath(JavaProject.java:2673) 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaProject.resolveClasspath(JavaProject.java:2779) 4XESTACKTRACE at org/eclipse/jdt/internal/core/JavaProject.getResolvedClasspath(JavaProject.java:1915) 4XESTACKTRACE at org/eclipse/jdt/core/JavaCore.initializeAfterLoad(JavaCore.java:3496) 4XESTACKTRACE at org/eclipse/jdt/internal/ui/InitializeAfterLoadJob$RealJob.run(InitializeAfterLoadJob.java:35) 4XESTACKTRACE at org/eclipse/core/internal/jobs/Worker.run(Worker.java:54) 3XMTHREADINFO "Worker-5" (TID:0x24A8C800, sys_thread_t:0x21E20FC8, state:CW, native ID:0x00002688) prio=5 4XESTACKTRACE at java/lang/Object.wait(Native Method) 4XESTACKTRACE at java/lang/Object.wait(Object.java:231) 4XESTACKTRACE at org/eclipse/core/internal/jobs/WorkerPool.sleep(WorkerPool.java:185) 4XESTACKTRACE at org/eclipse/core/internal/jobs/WorkerPool.startJob(WorkerPool.java:217) 4XESTACKTRACE at org/eclipse/core/internal/jobs/Worker.run(Worker.java:50)
I am unable to reproduce this bug. However, looking at the thread dump, this is what I figure might be the cause: Worker-0 runs AutoBuildJob, which would have acquired lock on the workspace root and waiting to obtain a lock on ExternalFoldersManager. Worker-3 has the lock for ExternalFoldersManager but waiting for Worker-0 to finish so that it can open the external folders project.
Created attachment 167759 [details] Proposed Fix The fix has two parts: 1) Created a singleton of ExternalFoldersManager to ensure the consistency of the map containing the external folders 2) Made the map a synchronized one For this specific case, the first part alone would have been enough. But adding the second part to keep the synchronization only for the folders' map and not to the manager object itself. Remy, can you please see if this addresses your concern?
(In reply to comment #5) > Remy, can you please see if this addresses your concern? I was originally able to get the system to hang in addFolder(IPath) by expanding my project while it was initializing the Java tooling but with the patch, that either "doesn't happen" or happens too quickly that I don't even have a chance to try to cause the hang. :o
The only comment I have is regarding the getFolders() method. Should not we initialize the folders instance variable only when it is properly initialized. So put the synchronized map into a temporary variable and set it to the folders instance variable only before it returns.
Why do we need the call getFolders() inside the private constructor of org.eclipse.jdt.internal.core.ExternalFoldersManager? Should not we wait for the actual first call to getFolders() ?
Created attachment 167803 [details] Proposed fix So we would end up with this patch. Jay, let me know what you think.
(In reply to comment #9) > Created an attachment (id=167803) [details] > Proposed fix > > So we would end up with this patch. Jay, let me know what you think. +1 for this patch I also agree with Olivier, that: 1) it's better to use a temporary map while getting the folders and only initialize the field in one shot at the end... 2) it's not necessary to initialize the folders before the getFolders() method is called, otherwise they will surely be an extra cost during the startup which is already a performance hot spot!
(In reply to comment #7) > The only comment I have is regarding the getFolders() method. > Should not we initialize the folders instance variable only when it is properly > initialized. I agree. We can even delay the creation of the synchronized map - use a normal temporary map and create a synchronized map just before we assign it to the instance variable. I will make this small change to the patch. (In reply to comment #8) > Why do we need the call getFolders() inside the private constructor of > org.eclipse.jdt.internal.core.ExternalFoldersManager? > Should not we wait for the actual first call to getFolders() ? The reason I had to put that was to avoid the race condition to the code that instantiates the folders' map. As we see in the thread dump, there are several threads in the start-up trying to access the folders manager and there is a good chance of a race condition and hence multiple execution of the code inside ExternalFoldersManager#getFolders is a possibility. Functionally this should not matter as the overwritten map should have the same contents. But it's better to avoid that. Having said that, I do agree with the point of calling getFolders only when necessary. However, Looking at the code and practically speaking, the getFolders method will most probably be called at some point during the start-up. So, my concern is that the delayed but imminent call could lead us to a double invocation of the same. It looks like a trade-off we need to decide on. Olivier, in any case, do we want to keep the private constructor just for the completion of the singleton? At this point, I don't see anyone else creating an instance other than JavaModelManager. So, it's only of academic interest.
(In reply to comment #11) > (In reply to comment #7) > > The only comment I have is regarding the getFolders() method. > > Should not we initialize the folders instance variable only when it is properly > > initialized. > > I agree. We can even delay the creation of the synchronized map - use a normal > temporary map and create a synchronized map just before we assign it to the > instance variable. I will make this small change to the patch. > > (In reply to comment #8) > > Why do we need the call getFolders() inside the private constructor of > > org.eclipse.jdt.internal.core.ExternalFoldersManager? > > Should not we wait for the actual first call to getFolders() ? > > The reason I had to put that was to avoid the race condition to the code that > instantiates the folders' map. As we see in the thread dump, there are several > threads in the start-up trying to access the folders manager and there is a > good chance of a race condition and hence multiple execution of the code inside > ExternalFoldersManager#getFolders is a possibility. Functionally this should > not matter as the overwritten map should have the same contents. But it's > better to avoid that. > > Having said that, I do agree with the point of calling getFolders only when > necessary. However, Looking at the code and practically speaking, the > getFolders method will most probably be called at some point during the > start-up. So, my concern is that the delayed but imminent call could lead us to > a double invocation of the same. It looks like a trade-off we need to decide > on. > As the getFolders will be well protected against race conditions with the patch I do still think that we should avoid to initialize the folders at the creation of the ExternalFoldersManager. > Olivier, in any case, do we want to keep the private constructor just for the > completion of the singleton? At this point, I don't see anyone else creating an > instance other than JavaModelManager. So, it's only of academic interest. I agree that it's only academic as we do not want the ExternalFoldersManager folders to be initialized in the constructor. Hence I let it unchanged until there's a real need to turn it as a singleton.
(In reply to comment #11) > I agree. We can even delay the creation of the synchronized map - use a normal > temporary map and create a synchronized map just before we assign it to the > instance variable. I will make this small change to the patch. Please do that change and provide a new patch for review. > Olivier, in any case, do we want to keep the private constructor just for the > completion of the singleton? At this point, I don't see anyone else creating an > instance other than JavaModelManager. So, it's only of academic interest. No need for this as this is internal code. Once the new patch is ready, we must review it one last time and release it.
(In reply to comment #13) > > Olivier, in any case, do we want to keep the private constructor just for the > > completion of the singleton? At this point, I don't see anyone else creating an > > instance other than JavaModelManager. So, it's only of academic interest. > No need for this as this is internal code. Since the default constructor is created anyway, there is no reason not to add it ourselves. At least it makes it clear that this should be treated as a singleton.
Created attachment 167955 [details] Updated patch This patch contains the changes discussed.
+1. Patch looks good.
Released in HEAD for 3.6RC1.
Verified for 3.6RC1 by code inspection but also by reporter (see comment 6).