[ create a new paste ] login | about

Project: circuits
Link: http://circuits.codepad.org/xh64Vqsn    [ raw code | fork ]

Plain Text, pasted on Jan 23:
diff -r b21c6b602735 circuits/io/process.py
--- a/circuits/io/process.py	Wed Jan 23 11:17:10 2013 +0100
+++ b/circuits/io/process.py	Wed Jan 23 15:14:28 2013 +0100
@@ -54,6 +54,10 @@
         self.stdout = StringIO()
 
         self._status = None
+        self._terminated = False
+
+        self._stdout_closed = False
+        self._stderr_closed = False
 
         self._stdin = None
         self._stderr = None
@@ -62,6 +66,8 @@
         self._stdin_closed_handler = None
         self._stderr_read_handler = None
         self._stdout_read_handler = None
+        self._stderr_closed_handler = None
+        self._stdout_closed_handler = None
 
     def start(self):
         self.p = Popen(
@@ -105,8 +111,28 @@
             )
         )
 
+        self._stderr_closed_handler = self.addHandler(
+            handler("closed", channel="{0:d}.stderr".format(self.p.pid))(
+                self.__class__._on_stderr_closed
+            )
+        )
+
+        self._stdout_closed_handler = self.addHandler(
+            handler("closed", channel="{0:d}.stdout".format(self.p.pid))(
+                self.__class__._on_stdout_closed
+            )
+        )
+
         self.fire(Started(self))
 
+    @staticmethod
+    def _on_stdout_closed(self):
+        self._stdout_closed = True
+
+    @staticmethod
+    def _on_stderr_closed(self):
+        self._stderr_closed = True
+
     def stop(self):
         if self.p is not None:
             self.p.terminate()
@@ -138,12 +164,18 @@
 
     @handler("generate_events")
     def _on_generate_events(self, event):
-        if self.p is not None:
-            status = self.p.poll()
-            if status is not self._status:
-                self._status = status
-                self.fire(Stopped(self))
-                event.reduce_time_left(0)
-                return True
-            else:
-                event.reduce_time_left(TIMEOUT)
+        if self.p is not None and self._status is None:
+            self._status = self.p.poll()
+
+        if self._status is not None and self._stderr_closed == True \
+           and self._stdout_closed == True and not self._terminated:
+            self._terminated = True
+            self.removeHandler(self._stderr_read_handler)
+            self.removeHandler(self._stdout_read_handler)
+            self.removeHandler(self._stderr_closed_handler)
+            self.removeHandler(self._stdout_closed_handler)
+            self.fire(Stopped(self))
+            event.reduce_time_left(0)
+            return True
+        else:
+            event.reduce_time_left(TIMEOUT)
diff -r b21c6b602735 tests/io/test_process.py
--- a/tests/io/test_process.py	Wed Jan 23 11:17:10 2013 +0100
+++ b/tests/io/test_process.py	Wed Jan 23 15:14:28 2013 +0100
@@ -1,12 +1,7 @@
 #!/usr/bin/env python
 
-
-import sys
-
 from circuits.io import Process, Start
 
-from tests.io import hello
-
 
 def test(manager, watcher):
     p = Process(["echo", "Hello World!"]).register(manager)



Create a new paste based on this one


Comments: