Skip to content

Commit

Permalink
Better initialization
Browse files Browse the repository at this point in the history
  • Loading branch information
trowski committed Jan 28, 2024
1 parent 321e868 commit 72fb16e
Showing 1 changed file with 15 additions and 17 deletions.
32 changes: 15 additions & 17 deletions src/Process.php
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,7 @@ public static function start(
$workingDirectory = $cwd;
}

$driver = EventLoop::getDriver();

$runner = self::$driverRunner[$driver] ??= self::initialize();
$runner = self::getRunner();

$context = $runner->start(
$command,
Expand All @@ -87,39 +85,39 @@ public static function start(
$streams = $context->streams;

$procHolder = new ProcHolder($runner, $handle);
self::$procHolder[$procHolder] = $handle->pid;

self::$streamHolder[$streams->stdin] = $procHolder;
self::$streamHolder[$streams->stdout] = $procHolder;
self::$streamHolder[$streams->stderr] = $procHolder;

self::$procHolder[$procHolder] = $handle->pid;

return new self($runner, $handle, $streams, $command, $workingDirectory, $envVars, $options);
}

private static function initialize(): ProcessRunner
private static function getRunner(): ProcessRunner
{
/** @psalm-suppress RedundantPropertyInitializationCheck */
self::$driverRunner ??= new \WeakMap();
if (!isset(self::$driverRunner)) {
self::$driverRunner = new \WeakMap();

\register_shutdown_function(static function (): void {
/** @var ProcHolder $procHolder */
foreach (self::$procHolder as $procHolder => $pid) {
$procHolder->handle->wait();
}
});
}

/** @psalm-suppress RedundantPropertyInitializationCheck */
self::$procHolder ??= new \WeakMap();

/** @psalm-suppress RedundantPropertyInitializationCheck */
self::$streamHolder ??= new \WeakMap();

$runner = \PHP_OS_FAMILY === 'Windows'
$driver = EventLoop::getDriver();
return self::$driverRunner[$driver] ??= \PHP_OS_FAMILY === 'Windows'
? new WindowsProcessRunner()
: new PosixProcessRunner();

\register_shutdown_function(static function (): void {
/** @var ProcHolder $procHolder */
foreach (self::$procHolder as $procHolder => $pid) {
$procHolder->handle->wait();
}
});

return $runner;
}

/**
Expand Down

0 comments on commit 72fb16e

Please sign in to comment.