From f2c536aff2c028ff6356fa8448bfcbb380ce9f0e Mon Sep 17 00:00:00 2001 From: Stanislau Kviatkouski <7zete7@gmail.com> Date: Thu, 28 Aug 2025 14:45:42 +0300 Subject: [PATCH 1/2] test: cover gh-116 issue --- tests/AbstractProcessTest.php | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) 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. From daadf868494967adfd6786d9953b4d9ca3a4649a Mon Sep 17 00:00:00 2001 From: Stanislau Kviatkouski <7zete7@gmail.com> Date: Thu, 28 Aug 2025 14:46:44 +0300 Subject: [PATCH 2/2] fix: prevent Process::close() double execution --- src/Process.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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;