[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 {