public function tick()
{
if (!$this->timings instanceof SplObjectStorage) {
$this->timings = new SplObjectStorage();
}
$waiting = [];
$running = [];
foreach ($this->waiting as $task) {
if ($this->isTaskCancelled($task)) {
continue;
}
if (!$this->canRunTask($task)) {
$waiting[] = $task;
continue;
}
if ($task->stopsSiblings()) {
$this->stopSiblingTasks($task);
}
$binary = $this->getBinary();
$worker = $this->getWorker();
$stdout = $this->getStdOut();
$stderr = $this->getStdErr();
if ($task instanceof Expires) {
$this->timings[$task] = time();
}
$output = $this->getShell()->exec("{$binary} {$worker} %s {$stdout} {$stderr} & echo \$!", [$this->getTaskString($task)]);
if ($task instanceof Process) {
$task->setId($output[0]);
}
$this->running[] = $task;
}
foreach ($this->running as $task) {
if (!$this->canRemoveTask($task)) {
$running[] = $task;
}
}
$this->waiting = $waiting;
$this->running = $running;
return !empty($waiting) || !empty($running);
}