From b445c56b69cc8ba918f5ec6a56a0f0d8a7a97758 Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Wed, 26 Jun 2019 16:17:09 -0700 Subject: [PATCH] Try to avoid deadlock caused by 'ProjectSorter' See: https://www.pivotaltracker.com/story/show/166943765 --- .../classpath/ClasspathListenerManager.java | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/classpath/ClasspathListenerManager.java b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/classpath/ClasspathListenerManager.java index e3fbee4ba..1f8cfeca3 100644 --- a/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/classpath/ClasspathListenerManager.java +++ b/headless-services/jdt-ls-extension/org.springframework.tooling.jdt.ls.commons/src/org/springframework/tooling/jdt/ls/commons/classpath/ClasspathListenerManager.java @@ -10,13 +10,13 @@ *******************************************************************************/ package org.springframework.tooling.jdt.ls.commons.classpath; -import java.util.Arrays; -import java.util.Comparator; -import java.util.function.Supplier; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jdt.core.ElementChangedEvent; import org.eclipse.jdt.core.IElementChangedListener; import org.eclipse.jdt.core.IJavaElement; @@ -34,6 +34,22 @@ import org.springframework.tooling.jdt.ls.commons.Logger; */ public class ClasspathListenerManager { + Queue workQueue = new ConcurrentLinkedQueue<>(); + + Job worker = new Job("Processing JDT Change Events") { + { + setSystem(true); + } + + @Override + protected IStatus run(IProgressMonitor monitor) { + while (!workQueue.isEmpty()) { + workQueue.remove().run(); + } + return Status.OK_STATUS; + } + }; + public interface ClasspathListener { public abstract void classpathChanged(IJavaProject jp); } @@ -42,7 +58,8 @@ public class ClasspathListenerManager { @Override public void elementChanged(ElementChangedEvent event) { - visit(event.getDelta()); + workQueue.add(() -> visit(event.getDelta())); + worker.schedule(); } private void visit(IJavaElementDelta delta) {