Community
Participate
Working Groups
Build ID: 3.4 M5 Steps To Reproduce: In an adaptor's headless eclipse 3.4 M5 based tool, after the classpath is set on a java project via JavaProject.setRawClasspath() on the main thread, sometimes it gets reset to a default set of four entries by a worker thread. This is only reproducible on multi-core cpu machines where race conditions are more easily reproduced. More information: Inserting some trace info in JavaModelManager.PerProjectInfo.setClasspath(....), whenever the classpath gets reset, this worker thread is seen (note that the classpath before this thread came along had 100+ entries set previously via JavaProject.setRawClasspath()): >>>>> JavaModelManager.PerProjectInfo.setClasspath(): ::::: cp entry 0 = /depconvrt02/ejbModule[CPE_SOURCE][K_SOURCE][isExported:false] ::::: cp entry 1 = org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/java[CPE_CONTAINER][K_SOURCE][isExported:false] ::::: cp entry 2 = org.eclipse.jst.j2ee.internal.module.container[CPE_CONTAINER][K_SOURCE][isExported:false] ::::: cp entry 3 = /depconvrt02/ImportedClasses[CPE_LIBRARY][K_BINARY][isExported:true] project = depconvrt02 THREAD INFO: JavaModelManager.PerProjectInfo.setClasspath(): Thread name = Worker-0, id = 13 java.lang.Thread.getStackTraceImpl(Native Method) java.lang.Thread.getStackTrace(Thread.java:1039) org.eclipse.jdt.internal.core.JavaModelManager$PerProjectInfo.setClasspath(JavaModelManager.java:1150) org.eclipse.jdt.internal.core.JavaModelManager$PerProjectInfo.readAndCacheClasspath(JavaModelManager.java:1206) org.eclipse.jdt.internal.core.DeltaProcessor.readRawClasspath(DeltaProcessor.java:482) org.eclipse.jdt.internal.core.DeltaProcessor.checkProjectsBeingAddedOrRemoved(DeltaProcessor.java:340) org.eclipse.jdt.internal.core.DeltaProcessor.checkProjectsBeingAddedOrRemoved(DeltaProcessor.java:469) org.eclipse.jdt.internal.core.DeltaProcessor.resourceChanged(DeltaProcessor.java:1828) org.eclipse.jdt.internal.core.DeltaProcessingState.resourceChanged(DeltaProcessingState.java:390) org.eclipse.core.internal.events.NotificationManager$2.run(NotificationManager.java:282) org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37) org.eclipse.core.internal.events.NotificationManager.notify(NotificationManager.java:276) org.eclipse.core.internal.events.NotificationManager.broadcastChanges(NotificationManager.java:148) org.eclipse.core.internal.resources.Workspace.broadcastPostChange(Workspace.java:313) org.eclipse.core.internal.resources.Workspace.endOperation(Workspace.java:1022) org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1809) org.eclipse.core.internal.events.NotificationManager$NotifyJob.run(NotificationManager.java:39) org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
Created attachment 91853 [details] Proposed fix Note there is no regression test as this is a race condition fix.
Unfortunately this fix causes a deadlock between the main thread and the resource change notifier thread (Worker-0) as shown below: "main" TID:0x0013C500, j9thread_t:0x00012BD4, state:B, prio=5 (native thread ID:0x12C8, native priority:0x5, native policy:UNKNOWN) at java/lang/Object.wait(Native Method) at java/lang/Object.wait(Object.java:196) at org/eclipse/core/internal/jobs/Semaphore.acquire(Semaphore.java:38) at org/eclipse/core/internal/jobs/OrderedLock.doAcquire(OrderedLock.java:169) at org/eclipse/core/internal/jobs/OrderedLock.acquire(OrderedLock.java:105) at org/eclipse/core/internal/jobs/OrderedLock.acquire(OrderedLock.java:82(Compiled Code)) at org/eclipse/core/internal/resources/WorkManager.checkIn(WorkManager.java:118) at org/eclipse/core/internal/resources/Workspace.prepareOperation(Workspace.java:1747) at org/eclipse/core/internal/resources/File.setContents(File.java:364) at org/eclipse/jdt/internal/core/JavaProject.setSharedProperty(JavaProject.java:2857) at org/eclipse/jdt/internal/core/JavaProject.writeFileEntries(JavaProject.java:2623) at org/eclipse/jdt/internal/core/JavaModelManager$7.run(JavaModelManager.java:1171) at org/eclipse/core/internal/resources/Workspace.run(Workspace.java:1800) at org/eclipse/jdt/internal/core/JavaModelManager$PerProjectInfo.writeAndCacheClasspath(JavaModelManager.java:1167) at org/eclipse/jdt/internal/core/SetClasspathOperation.executeOperation(SetClasspathOperation.java:61) at org/eclipse/jdt/internal/core/JavaModelOperation.run(JavaModelOperation.java:720) at org/eclipse/core/internal/resources/Workspace.run(Workspace.java:1800) at org/eclipse/jdt/internal/core/JavaModelOperation.runOperation(JavaModelOperation.java:785) at org/eclipse/jdt/internal/core/JavaProject.setRawClasspath(JavaProject.java:2787) at org/eclipse/jdt/internal/core/JavaProject.setRawClasspath(JavaProject.java:2818) "Worker-0" TID:0x12303900, j9thread_t:0x0001D0D0, state:B, prio=5(native thread ID:0xC1C, native priority:0x5, native policy:UNKNOWN) at org/eclipse/jdt/internal/core/DeltaProcessor.readRawClasspath(DeltaProcessor.java:482) at org/eclipse/jdt/internal/core/DeltaProcessor.checkProjectsBeingAddedOrRemoved(DeltaProcessor.java:340) at org/eclipse/jdt/internal/core/DeltaProcessor.checkProjectsBeingAddedOrRemoved(DeltaProcessor.java:469) at org/eclipse/jdt/internal/core/DeltaProcessor.resourceChanged(DeltaProcessor.java:1828) at org/eclipse/jdt/internal/core/DeltaProcessingState.resourceChanged(DeltaProcessingState.java:390) at org/eclipse/core/internal/events/NotificationManager$2.run(NotificationManager.java:282) at org/eclipse/core/runtime/SafeRunner.run(SafeRunner.java:37) at org/eclipse/core/internal/events/NotificationManager.notify(NotificationManager.java:276) at org/eclipse/core/internal/events/NotificationManager.broadcastChanges(NotificationManager.java:148) at org/eclipse/core/internal/resources/Workspace.broadcastPostChange(Workspace.java:313) at org/eclipse/core/internal/resources/Workspace.endOperation(Workspace.java:1022) at org/eclipse/core/internal/resources/Workspace.run(Workspace.java:1809) at org/eclipse/core/internal/events/NotificationManager$NotifyJob.run(NotificationManager.java:39) at org/eclipse/core/internal/jobs/Worker.run(Worker.java:55)
Comment on attachment 91853 [details] Proposed fix Marking proposed fix obsolete since it causes a deadlock.
Created attachment 92587 [details] New proposed fix against V_836 This fix should avoid the deadlock problem.
Created attachment 92624 [details] Last proposed fix against v_836 The deadlock was still present in previous proposed fix. I verified that this fix doesn't have the deadlock problem.
Fix released for 3.4M6
Verified for 3.4M6.