fix deadlock in ManagingFS initialization (PY-1215)
authorDmitry Jemerov <yole@jetbrains.com>
Thu, 8 Jul 2010 12:29:39 +0000 (16:29 +0400)
committerDmitry Jemerov <yole@jetbrains.com>
Thu, 8 Jul 2010 17:24:45 +0000 (21:24 +0400)
platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/FileWatcher.java

index d2d4ba84134fd75d4f95401033529846d591722e..d5bb3b448436b8e25c06e38116b3163aeba892c2 100644 (file)
@@ -30,8 +30,6 @@ import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.util.Pair;
 import com.intellij.openapi.util.SystemInfo;
 import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.util.Pair;
 import com.intellij.openapi.util.SystemInfo;
 import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.util.text.StringUtil;
-import com.intellij.openapi.vfs.VfsBundle;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.openapi.vfs.newvfs.ManagingFS;
 import com.intellij.openapi.vfs.newvfs.NewVirtualFile;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.openapi.vfs.newvfs.ManagingFS;
 import com.intellij.openapi.vfs.newvfs.NewVirtualFile;
@@ -40,10 +38,8 @@ import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
-import javax.swing.*;
 import javax.swing.event.HyperlinkEvent;
 import java.io.*;
 import javax.swing.event.HyperlinkEvent;
 import java.io.*;
-import java.net.URL;
 import java.util.*;
 
 public class FileWatcher {
 import java.util.*;
 
 public class FileWatcher {
@@ -78,12 +74,15 @@ public class FileWatcher {
   private int attemptCount = 0;
   private static final int MAX_PROCESS_LAUNCH_ATTEMPT_COUNT = 10;
   private boolean isShuttingDown = false;
   private int attemptCount = 0;
   private static final int MAX_PROCESS_LAUNCH_ATTEMPT_COUNT = 10;
   private boolean isShuttingDown = false;
+  private final ManagingFS myManagingFS;
 
   public static FileWatcher getInstance() {
     return ourInstance;
   }
 
   private FileWatcher() {
 
   public static FileWatcher getInstance() {
     return ourInstance;
   }
 
   private FileWatcher() {
+    // to avoid deadlock (PY-1215), initialize ManagingFS reference in main thread, not in filewatcher thread
+    myManagingFS = ManagingFS.getInstance();
     try {
       if (!"true".equals(System.getProperty(PROPERTY_WATCHER_DISABLED))) {
         startupProcess();
     try {
       if (!"true".equals(System.getProperty(PROPERTY_WATCHER_DISABLED))) {
         startupProcess();
@@ -434,13 +433,12 @@ public class FileWatcher {
   }
 
   private void reset() {
   }
 
   private void reset() {
-    final ManagingFS fs = ManagingFS.getInstance();
     synchronized (LOCK) {
       myDirtyPaths.clear();
       myDirtyDirs.clear();
       myDirtyRecursivePaths.clear();
 
     synchronized (LOCK) {
       myDirtyPaths.clear();
       myDirtyDirs.clear();
       myDirtyRecursivePaths.clear();
 
-      for (VirtualFile root : fs.getLocalRoots()) {
+      for (VirtualFile root : myManagingFS.getLocalRoots()) {
         ((NewVirtualFile)root).markDirtyRecursively();
       }
     }
         ((NewVirtualFile)root).markDirtyRecursively();
       }
     }