diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java index 8b2e896..91c7643 100644 --- a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java +++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java @@ -101,6 +101,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; +import java.util.Iterator; import java.util.Map; import org.eclipse.core.runtime.CoreException; @@ -116,6 +117,7 @@ import org.eclipse.core.runtime.QualifiedName; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.core.runtime.jobs.ISchedulingRule; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; @@ -3888,6 +3890,7 @@ monitor.subTask(Messages.javamodel_resetting_source_attachment_properties); final IJavaProject[] projects = manager.getJavaModel().getJavaProjects(); HashSet visitedPaths = new HashSet(); + HashSet externalPaths = new HashSet(); ExternalFoldersManager externalFoldersManager = JavaModelManager.getExternalManager(); for (int i = 0, length = projects.length; i < length; i++) { JavaProject javaProject = (JavaProject) projects[i]; @@ -3911,19 +3914,32 @@ if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) { IPath entryPath = entry.getPath(); if (ExternalFoldersManager.isExternalFolderPath(entryPath) && externalFoldersManager.getFolder(entryPath) == null) { - externalFoldersManager.addFolder(entryPath, true); + externalPaths.add(entryPath); } } } } } + + ISchedulingRule rule = null; try { + // Use a schedule rule to avoid a race condition (https://bugs.eclipse.org/bugs/show_bug.cgi?id=369251) + rule = ResourcesPlugin.getWorkspace().getRuleFactory().modifyRule(externalFoldersManager.getExternalFoldersProject()); + Job.getJobManager().beginRule(rule, monitor); + + Iterator externalPathIter = externalPaths.iterator(); + while (externalPathIter.hasNext()) { + externalFoldersManager.addFolder((IPath) externalPathIter.next(), true); + } externalFoldersManager.createPendingFolders(monitor); - } - catch(JavaModelException jme) { + + } catch (JavaModelException jme) { // Creation of external folder project failed. Log it and continue; Util.log(jme, "Error while processing external folders"); //$NON-NLS-1$ + } finally { + Job.getJobManager().endRule(rule); } + // initialize delta state if (monitor != null) monitor.subTask(Messages.javamodel_initializing_delta_state); diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ExternalFoldersManager.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ExternalFoldersManager.java index 192d097..d615698 100644 --- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ExternalFoldersManager.java +++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/ExternalFoldersManager.java @@ -122,7 +122,7 @@ } while (result.exists()); if (scheduleForCreation) { if (this.pendingFolders == null) - this.pendingFolders = Collections.synchronizedSet(new HashSet()); + this.pendingFolders = new HashSet(); this.pendingFolders.add(externalFolderPath); } knownFolders.put(externalFolderPath, result); @@ -166,15 +166,13 @@ catch(CoreException e) { throw new JavaModelException(e); } - synchronized (this.pendingFolders) { - Iterator iterator = this.pendingFolders.iterator(); - while (iterator.hasNext()) { - Object folderPath = iterator.next(); - try { - createLinkFolder((IPath) folderPath, false, externalFoldersProject, monitor); - } catch (CoreException e) { - Util.log(e, "Error while creating a link for external folder :" + folderPath); //$NON-NLS-1$ - } + Iterator iterator = this.pendingFolders.iterator(); + while (iterator.hasNext()) { + Object folderPath = iterator.next(); + try { + createLinkFolder((IPath) folderPath, false, externalFoldersProject, monitor); + } catch (CoreException e) { + Util.log(e, "Error while creating a link for external folder :" + folderPath); //$NON-NLS-1$ } } this.pendingFolders.clear();