Passed
Push — master ( ac7767...ce6fb4 )
by PHPinnacle
06:06 queued 03:22
created

StaticDispatcher::dispatch()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 3
ccs 0
cts 2
cp 0
rs 10
c 0
b 0
f 0
cc 1
eloc 1
nc 1
nop 2
crap 2
1
<?php
2
/**
3
 * This file is part of PHPinnacle/Ensign.
4
 *
5
 * (c) PHPinnacle Team <[email protected]>
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
11
declare(strict_types = 1);
12
13
use Amp\Promise;
14
use PHPinnacle\Ensign\HandlerRegistry;
15
use PHPinnacle\Ensign\Signal;
16
use PHPinnacle\Ensign\SignalDispatcher;
17
use PHPinnacle\Ensign\Dispatcher;
18
19
final class StaticDispatcher implements Dispatcher
20
{
21
    private static $instance;
22
    private $handlers;
23
    private $dispatcher;
24
25
    private function __construct()
26
    {
27
        $this->handlers   = new HandlerRegistry();
28
        $this->dispatcher = new SignalDispatcher($this->handlers);
29
    }
30
31
    public static function instance(): self
32
    {
33
        if (null === self::$instance) {
34
            self::$instance = new self();
35
        }
36
37
        return self::$instance;
38
    }
39
40
    public function register(string $signal, callable $action): void
41
    {
42
        $this->handlers->register($signal, $action);
43
    }
44
45
    public function dispatch($signal, ...$arguments): Promise
46
    {
47
        return $this->dispatcher->dispatch($signal, ...$arguments);
48
    }
49
}
50
51
/**
52
 * @param mixed    $signal
53
 * @param mixed ...$arguments
54
 * @return Signal
55
 */
56
function ensign_send($signal, ...$arguments)
57
{
58
    return Signal::create($signal, $arguments);
59
}
60
61
/**
62
 * @param string   $signal
63
 * @param callable $handler
64
 */
65
function ensign_signal(string $signal, callable $handler): void
66
{
67
    StaticDispatcher::instance()->register($signal, $handler);
68
}
69
70
/**
71
 * @param string    $signal
72
 * @param mixed  ...$arguments
73
 *
74
 * @return Promise
75
 */
76
function ensign_dispatch(string $signal, ...$arguments): Promise
77
{
78
    return StaticDispatcher::instance()->dispatch($signal, ...$arguments);
79
}
80
81
/**
82
 * @param array      $signals
83
 * @param Dispatcher $dispatcher
84
 */
85
function ensign_pcntl_signals(array $signals, Dispatcher $dispatcher = null): void
86
{
87
    $dispatcher = $dispatcher ?: StaticDispatcher::instance();
88
89
    foreach ($signals as $signal) {
90
        // OS signal support check
91
        if (!$sigNo = \constant($signal)) {
92
            continue;
93
        }
94
95
        $handler = function (string $watcherId, int $sigNo, $sigInfo = null) use ($dispatcher, $signal) {
96
            yield $dispatcher->dispatch($signal, $sigNo, $sigInfo, $watcherId);
97
        };
98
99
        \Amp\Loop::onSignal($sigNo, $handler);
100
    }
101
}
102
103
/**
104
 * @param array $exclude
105
 *
106
 * @return array
107
 */
108
function pcntl_signal_list(array $exclude = []): array
109
{
110
    return \array_diff([
111
        'SIGHUP',
112
        'SIGINT',
113
        'SIGQUIT',
114
        'SIGILL',
115
        'SIGTRAP',
116
        'SIGABRT',
117
        'SIGIOT',
118
        'SIGBUS',
119
        'SIGFPE',
120
        // 'SIGKILL',
121
        'SIGUSR1',
122
        'SIGSEGV',
123
        'SIGUSR2',
124
        'SIGPIPE',
125
        'SIGALRM',
126
        'SIGTERM',
127
        'SIGSTKFLT',
128
        'SIGCLD',
129
        'SIGCHLD',
130
        'SIGCONT',
131
        // 'SIGSTOP',
132
        'SIGTSTP',
133
        'SIGTTIN',
134
        'SIGTTOU',
135
        'SIGURG',
136
        'SIGXCPU',
137
        'SIGXFSZ',
138
        'SIGVTALRM',
139
        'SIGPROF',
140
        'SIGWINCH',
141
        'SIGPOLL',
142
        'SIGIO',
143
        'SIGPWR',
144
        'SIGSYS',
145
    ], $exclude);
146
}
147