1
0
mirror of https://github.com/danog/process.git synced 2024-11-30 04:39:04 +01:00

Return promise from Process::start(); int from Process::getPid()

This commit is contained in:
Aaron Piotrowski 2018-10-14 23:24:35 -05:00
parent 9460633c7d
commit 8ec002633b
No known key found for this signature in database
GPG Key ID: ADD1EF783EDE9EEB
2 changed files with 22 additions and 19 deletions

View File

@ -9,6 +9,7 @@ use Amp\Process\Internal\ProcessRunner;
use Amp\Process\Internal\ProcessStatus;
use Amp\Process\Internal\Windows\Runner as WindowsProcessRunner;
use Amp\Promise;
use function Amp\call;
class Process
{
@ -30,6 +31,9 @@ class Process
/** @var ProcessHandle */
private $handle;
/** @var int|null */
private $pid;
/**
* @param string|string[] $command Command to run.
* @param string|null $cwd Working directory or use an empty string to use the working directory of the
@ -90,15 +94,20 @@ class Process
/**
* Start the process.
*
* @return Promise<int> Resolves with the PID.
*
* @throws StatusError If the process has already been started.
*/
public function start()
public function start(): Promise
{
if ($this->handle) {
throw new StatusError("Process has already been started.");
}
return call(function () {
$this->handle = $this->processRunner->start($this->command, $this->cwd, $this->env, $this->options);
return $this->pid = yield $this->handle->pidDeferred->promise();
});
}
/**
@ -152,17 +161,17 @@ class Process
/**
* Returns the PID of the child process.
*
* @return Promise<int>
* @return int
*
* @throws StatusError If the process has not started.
* @throws StatusError If the process has not started or has not completed starting.
*/
public function getPid(): Promise
public function getPid(): int
{
if (!$this->handle) {
throw new StatusError("Process has not been started.");
if (!$this->pid) {
throw new StatusError("Process has not been started or has not completed starting.");
}
return $this->handle->pidDeferred->promise();
return $this->pid;
}
/**

View File

@ -8,7 +8,6 @@ use Amp\Loop;
use Amp\Process\Process;
use Amp\Process\ProcessInputStream;
use Amp\Process\ProcessOutputStream;
use Amp\Promise;
use PHPUnit\Framework\TestCase;
class ProcessTest extends TestCase
@ -60,9 +59,7 @@ class ProcessTest extends TestCase
{
Loop::run(function () {
$process = new Process(self::CMD_PROCESS);
$process->start();
$this->assertInternalType('int', yield $process->getPid());
$this->assertInternalType('int', yield $process->start());
$this->assertSame(0, yield $process->join());
});
}
@ -75,9 +72,8 @@ class ProcessTest extends TestCase
Loop::run(function () {
$process = new Process(self::CMD_PROCESS_SLOW);
$process->start();
yield $process->start();
$process->signal(0);
$this->assertInstanceOf(Promise::class, $process->getPid());
$this->assertSame(0, yield $process->join());
});
}
@ -249,14 +245,12 @@ class ProcessTest extends TestCase
/**
* @expectedException \Amp\Process\StatusError
* @expectedExceptionMessage Process has not been started.
* @expectedExceptionMessage Process has not been started or has not completed starting.
*/
public function testProcessHasNotBeenStartedWithGetPid()
{
Loop::run(function () {
$process = new Process(self::CMD_PROCESS);
yield $process->getPid();
});
$process->getPid();
}
/**