diff --git a/src/Process.php b/src/Process.php index 7af5de7..ba94cee 100644 --- a/src/Process.php +++ b/src/Process.php @@ -297,6 +297,9 @@ public function close() return; } + $process = $this->process; + $this->process = null; + foreach ($this->pipes as $pipe) { $pipe->close(); } @@ -306,8 +309,7 @@ public function close() $this->closeExitCodePipe(); } - $exitCode = \proc_close($this->process); - $this->process = null; + $exitCode = \proc_close($process); if ($this->exitCode === null && $exitCode !== -1) { $this->exitCode = $exitCode; diff --git a/tests/AbstractProcessTest.php b/tests/AbstractProcessTest.php index ee2dab5..aafe6c2 100644 --- a/tests/AbstractProcessTest.php +++ b/tests/AbstractProcessTest.php @@ -1099,6 +1099,28 @@ function ($output) use (&$stdErr) { $loop->run(); } + public function testIssue116() + { + if (DIRECTORY_SEPARATOR === '\\') { + $this->markTestSkipped('Process pipes not supported on Windows'); + } + + $loop = $this->createLoop(); + $process = new Process('exit 0'); + + $process->start($loop); + + // through some chain + $process->stdout->on('close', function () use ($process) { + $process->close(); + }); + + $process->close(); + $loop->stop(); + + $this->assertFalse($process->isRunning()); + } + /** * Execute a callback at regular intervals until it returns successfully or * a timeout is reached.