Skip to content

Commit 19710c3

Browse files
committed
[Process] Add support for Fiber
1 parent ff70bd1 commit 19710c3

File tree

3 files changed

+41
-2
lines changed

3 files changed

+41
-2
lines changed

src/Symfony/Component/Process/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
CHANGELOG
22
=========
33

4+
5.4
5+
---
6+
7+
* added support for `Fiber`
8+
49
5.2.0
510
-----
611

src/Symfony/Component/Process/Process.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -427,12 +427,22 @@ public function wait(callable $callback = null)
427427
do {
428428
$this->checkTimeout();
429429
$running = '\\' === \DIRECTORY_SEPARATOR ? $this->isRunning() : $this->processPipes->areOpen();
430-
$this->readPipes($running, '\\' !== \DIRECTORY_SEPARATOR || !$running);
430+
431+
if (\PHP_VERSION_ID >= 80100 && $fiber = \Fiber::getCurrent()) {
432+
$this->readPipes(false, '\\' !== \DIRECTORY_SEPARATOR || !$running);
433+
$fiber->suspend();
434+
} else {
435+
$this->readPipes($running, '\\' !== \DIRECTORY_SEPARATOR || !$running);
436+
}
431437
} while ($running);
432438

433439
while ($this->isRunning()) {
434440
$this->checkTimeout();
435-
usleep(1000);
441+
if (\PHP_VERSION_ID >= 80100 && $fiber = \Fiber::getCurrent()) {
442+
$fiber->suspend();
443+
} else {
444+
usleep(1000);
445+
}
436446
}
437447

438448
if ($this->processInformation['signaled'] && $this->processInformation['termsig'] !== $this->latestSignal) {

src/Symfony/Component/Process/Tests/ProcessTest.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,30 @@ public function testMustRun()
550550
$this->assertEquals('foo'.\PHP_EOL, $process->getOutput());
551551
}
552552

553+
/**
554+
* @requires PHP 8.1
555+
*/
556+
public function testMustRunWithFiber()
557+
{
558+
$process = new Process(['sleep', 1]);
559+
$fiber = new \Fiber(function () use ($process) {
560+
$process->mustRun();
561+
});
562+
$fiber->start();
563+
564+
$fiberHasBeenSuspended = false;
565+
while (!$fiber->isTerminated()) {
566+
$fiberHasBeenSuspended = true;
567+
$this->assertTrue($fiber->isSuspended());
568+
$fiber->resume();
569+
570+
usleep(100000);
571+
}
572+
573+
$this->assertTrue($process->isTerminated());
574+
$this->assertTrue($fiberHasBeenSuspended);
575+
}
576+
553577
public function testSuccessfulMustRunHasCorrectExitCode()
554578
{
555579
$process = $this->getProcess('echo foo')->mustRun();

0 commit comments

Comments
 (0)