[Process] Avoid failure when calling Process::stop in edge cases
See https://travis-ci.org/symfony/symfony/jobs/20664994 for an example of failure.
This commit is contained in:
parent
123dcac063
commit
173f8c5fd2
@ -356,17 +356,7 @@ class Process
|
|||||||
*/
|
*/
|
||||||
public function signal($signal)
|
public function signal($signal)
|
||||||
{
|
{
|
||||||
if (!$this->isRunning()) {
|
$this->doSignal($signal, true);
|
||||||
throw new LogicException('Can not send signal on a non running process.');
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->isSigchildEnabled()) {
|
|
||||||
throw new RuntimeException('This PHP has been compiled with --enable-sigchild. The process can not be signaled.');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (true !== @proc_terminate($this->process, $signal)) {
|
|
||||||
throw new RuntimeException(sprintf('Error while sending signal `%d`.', $signal));
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@ -635,7 +625,11 @@ class Process
|
|||||||
|
|
||||||
if ($this->isRunning() && !$this->isSigchildEnabled()) {
|
if ($this->isRunning() && !$this->isSigchildEnabled()) {
|
||||||
if (null !== $signal || defined('SIGKILL')) {
|
if (null !== $signal || defined('SIGKILL')) {
|
||||||
$this->signal($signal ?: SIGKILL);
|
// avoid exception here :
|
||||||
|
// process is supposed to be running, but it might have stop
|
||||||
|
// just after this line.
|
||||||
|
// in any case, let's silently discard the error, we can not do anything
|
||||||
|
$this->doSignal($signal ?: SIGKILL, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1111,4 +1105,44 @@ class Process
|
|||||||
$this->incrementalOutputOffset = 0;
|
$this->incrementalOutputOffset = 0;
|
||||||
$this->incrementalErrorOutputOffset = 0;
|
$this->incrementalErrorOutputOffset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a POSIX signal to the process.
|
||||||
|
*
|
||||||
|
* @param integer $signal A valid POSIX signal (see http://www.php.net/manual/en/pcntl.constants.php)
|
||||||
|
* @param Boolean $throwException True to throw exception in case signal failed, false otherwise
|
||||||
|
* @return Boolean True if the signal was sent successfully, false otherwise
|
||||||
|
*
|
||||||
|
* @throws LogicException In case the process is not running
|
||||||
|
* @throws RuntimeException In case --enable-sigchild is activated
|
||||||
|
* @throws RuntimeException In case of failure
|
||||||
|
*/
|
||||||
|
private function doSignal($signal, $throwException)
|
||||||
|
{
|
||||||
|
if (!$this->isRunning()) {
|
||||||
|
if ($throwException) {
|
||||||
|
throw new LogicException('Can not send signal on a non running process.');
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->isSigchildEnabled()) {
|
||||||
|
if ($throwException) {
|
||||||
|
throw new RuntimeException('This PHP has been compiled with --enable-sigchild. The process can not be signaled.');
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (true !== @proc_terminate($this->process, $signal)) {
|
||||||
|
if ($throwException) {
|
||||||
|
throw new RuntimeException(sprintf('Error while sending signal `%d`.', $signal));
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user