Proyectos de Subversion Moodle

Rev

Rev 1 | | Comparar con el anterior | Ultima modificación | Ver Log |

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