/** * @override * @inheritDoc */ public function start() { if ($this->flowController->isRunning) { return; } // TODO KRF-107 $this->addPeriodicTimer(1, function () { usleep(1); }); $this->flowController->isRunning = true; $this->startTickQueue->tick(); while ($this->flowController->isRunning) { $this->nextTickQueue->tick(); $this->futureTickQueue->tick(); $this->timers->tick(); // Next-tick or future-tick queues have pending callbacks ... if (!$this->flowController->isRunning || !$this->nextTickQueue->isEmpty() || !$this->futureTickQueue->isEmpty()) { $timeout = 0; } else { if ($scheduledAt = $this->timers->getFirst()) { $timeout = $scheduledAt - $this->timers->getTime(); $timeout = $timeout < 0 ? 0 : $timeout * self::MICROSECONDS_PER_SECOND; } else { if ($this->readStreams || $this->writeStreams) { $timeout = null; } else { break; } } } $this->waitForStreamActivity($timeout); } }