From c7e05865765deee0eb8dc3bb80962a2375d7c942 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 22 Feb 2012 17:47:53 +0100 Subject: [PATCH] non-blocking bundled gdsl scripts parsing --- .../groovy/dsl/GroovyDslFileIndex.java | 54 +++++++++++++------ 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/GroovyDslFileIndex.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/GroovyDslFileIndex.java index 964b3de73f30..2391408ef384 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/GroovyDslFileIndex.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/dsl/GroovyDslFileIndex.java @@ -45,6 +45,7 @@ import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.util.PsiModificationTracker; import com.intellij.util.ExceptionUtil; import com.intellij.util.PathUtil; +import com.intellij.util.concurrency.Semaphore; import com.intellij.util.containers.ConcurrentMultiMap; import com.intellij.util.containers.MultiMap; import com.intellij.util.indexing.*; @@ -256,9 +257,22 @@ public class GroovyDslFileIndex extends ScalarIndexExtension { private static volatile List> ourStandardScripts; private static List> getStandardScripts() { - if (ourStandardScripts == null) { - synchronized (SCRIPTS_CACHE) { - if (ourStandardScripts == null) { + List> result = ourStandardScripts; + if (result != null) { + return result; + } + + final Semaphore semaphore = new Semaphore(); + semaphore.down(); + ourPool.execute(new Runnable() { + @SuppressWarnings("AssignmentToStaticFieldFromInstanceMethod") + @Override + public void run() { + if (ourStandardScripts != null) { + return; + } + + try { Set scriptFolders = new LinkedHashSet(); // perhaps a separate extension for that? for (GroovyFrameworkConfigNotification extension : GroovyFrameworkConfigNotification.EP_NAME.getExtensions()) { @@ -285,11 +299,28 @@ public class GroovyDslFileIndex extends ScalarIndexExtension { } } } - } ourStandardScripts = executors; } + catch (OutOfMemoryError e) { + stopGdsl = true; + throw e; + } + catch (NoClassDefFoundError e) { + stopGdsl = true; + throw e; + } + finally { + semaphore.up(); + } } + }); + + while (ourStandardScripts == null && !stopGdsl && !semaphore.waitFor(20)) { + ProgressManager.checkCanceled(); + } + if (stopGdsl) { + return Collections.emptyList(); } return ourStandardScripts; } @@ -307,18 +338,11 @@ public class GroovyDslFileIndex extends ScalarIndexExtension { List result = new ArrayList(); - try { - for (Pair pair : getStandardScripts()) { - result.add(new GroovyDslScript(project, null, pair.second, pair.first.getPath())); - } + for (Pair pair : getStandardScripts()) { + result.add(new GroovyDslScript(project, null, pair.second, pair.first.getPath())); } - catch (OutOfMemoryError e) { - stopGdsl = true; - throw e; - } - catch (NoClassDefFoundError e) { - stopGdsl = true; - throw e; + if (stopGdsl) { + return Result.create(Collections.emptyList()); } final LinkedBlockingQueue> queue =