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)