krz/vox-populi

A Tumblr web client.

clone: git clone https://gitbay.org/krz/vox-populi.git

main: vendor/guzzlehttp/promises/src/TaskQueue.php · raw

 1<?php
 2namespace GuzzleHttp\Promise;
 3
 4/**
 5 * A task queue that executes tasks in a FIFO order.
 6 *
 7 * This task queue class is used to settle promises asynchronously and
 8 * maintains a constant stack size. You can use the task queue asynchronously
 9 * by calling the `run()` function of the global task queue in an event loop.
10 *
11 *     GuzzleHttp\Promise\queue()->run();
12 */
13class TaskQueue implements TaskQueueInterface
14{
15    private $enableShutdown = true;
16    private $queue = [];
17
18    public function __construct($withShutdown = true)
19    {
20        if ($withShutdown) {
21            register_shutdown_function(function () {
22                if ($this->enableShutdown) {
23                    // Only run the tasks if an E_ERROR didn't occur.
24                    $err = error_get_last();
25                    if (!$err || ($err['type'] ^ E_ERROR)) {
26                        $this->run();
27                    }
28                }
29            });
30        }
31    }
32
33    public function isEmpty()
34    {
35        return !$this->queue;
36    }
37
38    public function add(callable $task)
39    {
40        $this->queue[] = $task;
41    }
42
43    public function run()
44    {
45        /** @var callable $task */
46        while ($task = array_shift($this->queue)) {
47            $task();
48        }
49    }
50
51    /**
52     * The task queue will be run and exhausted by default when the process
53     * exits IFF the exit is not the result of a PHP E_ERROR error.
54     *
55     * You can disable running the automatic shutdown of the queue by calling
56     * this function. If you disable the task queue shutdown process, then you
57     * MUST either run the task queue (as a result of running your event loop
58     * or manually using the run() method) or wait on each outstanding promise.
59     *
60     * Note: This shutdown will occur before any destructors are triggered.
61     */
62    public function disableShutdown()
63    {
64        $this->enableShutdown = false;
65    }
66}