project leak
authorAlexey Kudravtsev <cdr@intellij.com>
Tue, 6 Jul 2010 10:29:36 +0000 (14:29 +0400)
committerAlexey Kudravtsev <cdr@intellij.com>
Tue, 6 Jul 2010 10:31:51 +0000 (14:31 +0400)
platform/platform-api/src/com/intellij/execution/process/OSProcessHandler.java
plugins/git4idea/src/git4idea/commands/GitTextHandler.java

index cfb32f4d124067e5cbb38ffe8cb95ab029d9631b..d07c3730a64920cfb0aea3c5dd8a9db26e501dfb 100644 (file)
@@ -233,7 +233,7 @@ public class OSProcessHandler extends ProcessHandler {
     private boolean skipLF = false;
 
     private boolean myIsClosed = false;
-    volatile private boolean myIsProcessTerminated = false;
+    private volatile boolean myIsProcessTerminated = false;
     private final Semaphore mySemaphore = new Semaphore();
     private final BlockingQueue<String> myNotificationQueue = new LinkedBlockingQueue<String>();
 
@@ -349,12 +349,15 @@ public class OSProcessHandler extends ProcessHandler {
     @Override
     public void run() {
       while (true) {
-        final ReadProcessRequest request = takeRequest();
+        ReadProcessRequest request = takeRequest();
         if (request == null) return;
 
         processRequest(request);
         if (!request.isClosed()) addRequest(request);
 
+        //noinspection UnusedAssignment
+        request = null;  //leak?
+
         try {
           Thread.sleep(1L);
         }
index 2f4895796eb46cad65811040bbcd3e6a3976d1c8..8a21b78c5570adb0d99c35b296f079ac8b3597b9 100644 (file)
@@ -68,13 +68,7 @@ public abstract class GitTextHandler extends GitHandler {
    * {@inheritDoc}
    */
   protected void startHandlingStreams() {
-    myHandler = new OSProcessHandler(myProcess, myCommandLine.getCommandLineString()) {
-      @Override
-      public Charset getCharset() {
-        Charset charset = GitTextHandler.this.getCharset();
-        return charset == null ? super.getCharset() : charset;
-      }
-    };
+    myHandler = new MyOSProcessHandler(myProcess, myCommandLine.getCommandLineString(), getCharset());
     myHandler.addProcessListener(new ProcessListener() {
       public void startNotified(final ProcessEvent event) {
         // do nothing
@@ -130,7 +124,23 @@ public abstract class GitTextHandler extends GitHandler {
    * {@inheritDoc}
    */
   protected void waitForProcess() {
-    myHandler.waitFor();
+    OSProcessHandler handler = myHandler;
     myHandler = null;
+    handler.waitFor();
+  }
+
+  private static class MyOSProcessHandler extends OSProcessHandler {
+    private final Charset myCharset;
+
+    public MyOSProcessHandler(Process process, String commandLine, Charset charset) {
+      super(process, commandLine);
+      myCharset = charset;
+    }
+
+    @Override
+    public Charset getCharset() {
+      Charset charset = myCharset;
+      return charset == null ? super.getCharset() : charset;
+    }
   }
 }