/** * {@inheritdoc} */ public function cancel(Immediate $immediate) { if ($this->immediates->contains($immediate)) { $this->immediates->detach($immediate); foreach ($this->queue as $key => $event) { if ($event === $immediate) { unset($this->queue[$key]); break; } } } }
/** * Executes any pending timers. Returns the number of timers executed. * * @return int * * @internal */ public function tick() : int { $count = 0; $time = microtime(true); while (!$this->queue->isEmpty()) { list($timer, $timeout) = $this->queue->top(); if (!$this->timers->contains($timer) || $timeout !== $this->timers[$timer]) { $this->queue->extract(); // Timer was removed from queue. continue; } if ($this->timers[$timer] > $time) { // Timer at top of queue has not expired. return $count; } // Remove and execute timer. Replace timer if persistent. $this->queue->extract(); if ($timer->isPeriodic()) { $timeout = $time + $timer->getInterval(); $this->queue->insert([$timer, $timeout], -$timeout); $this->timers[$timer] = $timeout; } else { $this->timers->detach($timer); } // Execute the timer. $timer->call(); ++$count; } return $count; }