From 3e97c51418e6d27e9a81906f347fcb7c78e27d4f Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 14 Apr 2024 15:23:16 +0200 Subject: Adding upstream version 0.20.0. Signed-off-by: Daniel Baumann --- vendor/gipfl/process/src/ProcessKiller.php | 81 ++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 vendor/gipfl/process/src/ProcessKiller.php (limited to 'vendor/gipfl/process/src/ProcessKiller.php') diff --git a/vendor/gipfl/process/src/ProcessKiller.php b/vendor/gipfl/process/src/ProcessKiller.php new file mode 100644 index 0000000..cf904ce --- /dev/null +++ b/vendor/gipfl/process/src/ProcessKiller.php @@ -0,0 +1,81 @@ +attach($process); + return static::terminateProcesses($processes, $loop, $timeout); + } + + /** + * @param ProcessList $processes + * @param LoopInterface $loop + * @param int $timeout + * @return \React\Promise\ExtendedPromiseInterface + */ + public static function terminateProcesses(ProcessList $processes, LoopInterface $loop, $timeout = 5) + { + if ($processes->count() === 0) { + return resolve(); + } + $deferred = new Deferred(); + $killTimer = $loop->addTimer($timeout, function () use ($deferred, $processes, $loop) { + /** @var ChildProcess $process */ + foreach ($processes as $process) { + $pid = $process->getPid(); + // Logger::error("Process $pid is still running, sending SIGKILL"); + $process->terminate(SIGKILL); + } + + // Let's add a bit of a delay after KILLing + $loop->addTimer(0.1, function () use ($deferred) { + $deferred->resolve(); + }); + }); + + $timer = $loop->addPeriodicTimer($timeout / 20, function () use ( + $deferred, + $processes, + $loop, + &$timer, + $killTimer + ) { + $stopped = []; + /** @var ChildProcess $process */ + foreach ($processes as $process) { + if (! $process->isRunning()) { + $stopped[] = $process; + } + } + foreach ($stopped as $process) { + $processes->detach($process); + } + if ($processes->count() === 0) { + $loop->cancelTimer($timer); + $loop->cancelTimer($killTimer); + $deferred->resolve(); + } + }); + /** @var ChildProcess $process */ + foreach ($processes as $process) { + $process->terminate(SIGTERM); + } + + return $deferred->promise(); + } +} -- cgit v1.2.3