[388391] constant freezes with 100% cpu
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/TaglibIndex.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/TaglibIndex.java index 96bb2fd..1fbb799 100644 --- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/TaglibIndex.java +++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/TaglibIndex.java
@@ -71,36 +71,33 @@ public void elementChanged(ElementChangedEvent event) { if (!isIndexAvailable()) return; - try { - LOCK.acquire(); - if (_debugEvents) { - Logger.log(Logger.INFO, "TaglibIndex responding to:" + event); //$NON-NLS-1$ - } - projectsIndexed.clear(); - elementChanged(event.getDelta(), true); - fireCurrentDelta(event); + if (_debugEvents) { + Logger.log(Logger.INFO, "TaglibIndex responding to:" + event); //$NON-NLS-1$ } - finally { - LOCK.release(); - } + DeltaRunner runner = new DeltaRunner(event); + elementChanged(runner, event.getDelta(), true); } - private void elementChanged(IJavaElementDelta delta, boolean forceUpdate) { + private void elementChanged(DeltaRunner runner, final IJavaElementDelta delta, final boolean forceUpdate) { if (frameworkIsShuttingDown()) return; - IJavaElement element = delta.getElement(); + final IJavaElement element = delta.getElement(); if (element.getElementType() == IJavaElement.JAVA_MODEL) { IJavaElementDelta[] changed = delta.getAffectedChildren(); for (int i = 0; i < changed.length; i++) { - elementChanged(changed[i], forceUpdate); + elementChanged(runner, changed[i], forceUpdate); } } // Handle any changes at the project level else if (element.getElementType() == IJavaElement.JAVA_PROJECT) { if ((delta.getFlags() & IJavaElementDelta.F_CLASSPATH_CHANGED) != 0) { - IJavaElement proj = element; - handleClasspathChange((IJavaProject) proj, delta, forceUpdate); + runner.run(new Runnable() { + public void run() { + IJavaElement proj = element; + handleClasspathChange((IJavaProject) proj, delta, forceUpdate); + } + }); } else { IJavaElementDelta[] deltas = delta.getAffectedChildren(); @@ -110,17 +107,21 @@ * If the project is being deleted or closed, just * remove the description */ - IJavaProject proj = (IJavaProject) element; - ProjectDescription description = (ProjectDescription) fProjectDescriptions.remove(proj.getProject()); - if (description != null) { - if (_debugIndexCreation) { - Logger.log(Logger.INFO, "removing index of " + description.fProject.getName()); //$NON-NLS-1$ + runner.run(new Runnable() { + public void run() { + IJavaProject proj = (IJavaProject) element; + ProjectDescription description = (ProjectDescription) fProjectDescriptions.remove(proj.getProject()); + if (description != null) { + if (_debugIndexCreation) { + Logger.log(Logger.INFO, "removing index of " + description.fProject.getName()); //$NON-NLS-1$ + } + // removing the index file ensures that we + // don't get stale data if the project is + // reopened + removeIndexFile(proj.getProject()); + } } - // removing the index file ensures that we - // don't get stale data if the project is - // reopened - removeIndexFile(proj.getProject()); - } + }); } } /* @@ -129,7 +130,7 @@ */ else { for (int i = 0; i < deltas.length; i++) { - elementChanged(deltas[i], false); + elementChanged(runner, deltas[i], false); } } } @@ -140,24 +141,28 @@ * itself */ else if ((delta.getFlags() & IJavaElementDelta.F_ADDED_TO_CLASSPATH) != 0 || (delta.getFlags() & IJavaElementDelta.F_REMOVED_FROM_CLASSPATH) != 0) { - IJavaProject affectedProject = element.getJavaProject(); - if (affectedProject != null) { - /* - * If the affected project has an index on-disk, it's - * going to be invalid--we need to create/load the - * description so it will be up to date [loading now and - * updating is usually faster than regenerating the entire - * index]. If there is no index on disk, do nothing more. - */ - File indexFile = new File(computeIndexLocation(affectedProject.getProject().getFullPath())); - if (indexFile.exists()) { - ProjectDescription affectedDescription = createDescription(affectedProject.getProject()); - if (affectedDescription != null) { - affectedDescription.handleElementChanged(delta); + /* + * If the affected project has an index on-disk, it's + * going to be invalid--we need to create/load the + * description so it will be up to date [loading now and + * updating is usually faster than regenerating the entire + * index]. If there is no index on disk, do nothing more. + */ + runner.run(new Runnable() { + public void run() { + IJavaProject affectedProject = element.getJavaProject(); + if (affectedProject != null) { + File indexFile = new File(computeIndexLocation(affectedProject.getProject().getFullPath())); + if (indexFile.exists()) { + ProjectDescription affectedDescription = createDescription(affectedProject.getProject()); + if (affectedDescription != null) { + affectedDescription.handleElementChanged(delta); + } + } + projectsIndexed.add(affectedProject.getProject()); } } - projectsIndexed.add(affectedProject.getProject()); - } + }); } } @@ -190,6 +195,26 @@ Logger.logException(e); } } + + class DeltaRunner { + private ElementChangedEvent event; + public DeltaRunner(ElementChangedEvent event) { + this.event = event; + } + + public void run(Runnable runnable) { + LOCK.acquire(); + try { + projectsIndexed.clear(); + runnable.run(); + fireCurrentDelta(event); + } + finally { + LOCK.release(); + } + } + } + } class ResourceChangeListener implements IResourceChangeListener {