FutureTickQueue.php 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. <?php
  2. namespace React\EventLoop\Tick;
  3. use SplQueue;
  4. /**
  5. * A tick queue implementation that can hold multiple callback functions
  6. *
  7. * This class should only be used internally, see LoopInterface instead.
  8. *
  9. * @see LoopInterface
  10. * @internal
  11. */
  12. final class FutureTickQueue
  13. {
  14. private $queue;
  15. public function __construct()
  16. {
  17. $this->queue = new SplQueue();
  18. }
  19. /**
  20. * Add a callback to be invoked on a future tick of the event loop.
  21. *
  22. * Callbacks are guaranteed to be executed in the order they are enqueued.
  23. *
  24. * @param callable $listener The callback to invoke.
  25. */
  26. public function add($listener)
  27. {
  28. $this->queue->enqueue($listener);
  29. }
  30. /**
  31. * Flush the callback queue.
  32. */
  33. public function tick()
  34. {
  35. // Only invoke as many callbacks as were on the queue when tick() was called.
  36. $count = $this->queue->count();
  37. while ($count--) {
  38. \call_user_func(
  39. $this->queue->dequeue()
  40. );
  41. }
  42. }
  43. /**
  44. * Check if the next tick queue is empty.
  45. *
  46. * @return boolean
  47. */
  48. public function isEmpty()
  49. {
  50. return $this->queue->isEmpty();
  51. }
  52. }