[dbe] database tests: sync destroy for remote processes
authorSergey Ignatov <sergey.ignatov@jetbrains.com>
Sat, 20 Feb 2016 13:39:33 +0000 (16:39 +0300)
committerSergey Ignatov <sergey.ignatov@jetbrains.com>
Sat, 20 Feb 2016 13:41:55 +0000 (16:41 +0300)
platform/lang-impl/src/com/intellij/execution/rmi/RemoteProcessSupport.java

index 94fb8a75374b6bce584ab80d009e7ed5c489ca38..3b53be8f7d67651326a6d0546efc9c7ec12e460c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2012 JetBrains s.r.o.
+ * Copyright 2000-2016 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -38,6 +38,7 @@ import com.intellij.openapi.util.ThrowableComputable;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.util.ExceptionUtil;
 import com.intellij.util.ObjectUtils;
+import com.intellij.util.concurrency.FixedFuture;
 import com.intellij.util.containers.ContainerUtil;
 import com.intellij.util.containers.HashSet;
 import org.jetbrains.annotations.NotNull;
@@ -89,14 +90,11 @@ public abstract class RemoteProcessSupport<Target, EntryPoint, Parameters> {
       }
     }
     if (infos.isEmpty()) return;
-    Future<?> future = ApplicationManager.getApplication().executeOnPooledThread(new Runnable() {
-      @Override
-      public void run() {
-        destroyProcessesImpl(infos);
-        if (wait) {
-          for (Info o : infos) {
-            o.handler.waitFor();
-          }
+    Future<?> future = ApplicationManager.getApplication().executeOnPooledThread(() -> {
+      destroyProcessesImpl(infos);
+      if (wait) {
+        for (Info o : infos) {
+          o.handler.waitFor();
         }
       }
     });
@@ -164,7 +162,8 @@ public abstract class RemoteProcessSupport<Target, EntryPoint, Parameters> {
     return acquire(info);
   }
 
-  public void release(@NotNull Target target, @Nullable Parameters configuration) {
+  @NotNull
+  public Future<?> release(@NotNull Target target, @Nullable Parameters configuration) {
     List<Info> infos = ContainerUtil.newArrayList();
     synchronized (myProcMap) {
       for (Pair<Target, Parameters> key : myProcMap.keySet()) {
@@ -174,9 +173,14 @@ public abstract class RemoteProcessSupport<Target, EntryPoint, Parameters> {
         }
       }
     }
-    if (infos.isEmpty()) return;
-    destroyProcessesImpl(infos);
-    fireModificationCountChanged();
+    if (infos.isEmpty()) return new FixedFuture<>(null);
+    return ApplicationManager.getApplication().executeOnPooledThread(() -> {
+        destroyProcessesImpl(infos);
+        fireModificationCountChanged();
+        for (Info o : infos) {
+          o.handler.waitFor();
+        }
+    });
   }
 
   private static void destroyProcessesImpl(@NotNull List<Info> infos) {