Passed
Push — master ( 6ff6ae...87aa6e )
by PHPinnacle
07:13 queued 03:19
created

ensign_send()   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 1
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\SignalDispatcher;
15
use PHPinnacle\Ensign\Dispatcher;
16
use PHPinnacle\Ensign\Task;
17
18
final class StaticDispatcher implements Dispatcher
19
{
20
    private static $instance;
21
    private $dispatcher;
22
23
    private function __construct()
24
    {
25
        $this->dispatcher = new SignalDispatcher();
26
    }
27
28
    public static function instance(): self
29
    {
30
        if (null === self::$instance) {
31
            self::$instance = new self();
32
        }
33
34
        return self::$instance;
35
    }
36
37
    public function register(string $signal, callable $action): void
38
    {
39
        $this->dispatcher->register($signal, $action);
40
    }
41
42
    public function dispatch($signal, ...$arguments): Task
43
    {
44
        return $this->dispatcher->dispatch($signal, ...$arguments);
45
    }
46
}
47
48
/**
49
 * @param string   $signal
50
 * @param callable $handler
51
 */
52
function ensign_signal(string $signal, callable $handler): void
53
{
54
    StaticDispatcher::instance()->register($signal, $handler);
55
}
56
57
/**
58
 * @param string    $signal
59
 * @param mixed  ...$arguments
60
 *
61
 * @return Promise
62
 */
63
function ensign_dispatch(string $signal, ...$arguments): Promise
64
{
65
    return StaticDispatcher::instance()->dispatch($signal, ...$arguments);
66
}
67
68
/**
69
 * @param array      $signals
70
 * @param Dispatcher $dispatcher
71
 *
72
 * @throws \Amp\Loop\UnsupportedFeatureException
73
 */
74
function ensign_pcntl_signals(array $signals, Dispatcher $dispatcher = null): void
75
{
76
    $dispatcher = $dispatcher ?: StaticDispatcher::instance();
77
78
    foreach ($signals as $signal) {
79
        // OS signal support check
80
        if (!$sigNo = \constant($signal)) {
81
            continue;
82
        }
83
84
        $handler = function (string $watcherId, int $sigNo, $sigInfo = null) use ($dispatcher, $signal) {
85
            yield $dispatcher->dispatch($signal, $sigNo, $sigInfo, $watcherId);
86
        };
87
88
        \Amp\Loop::onSignal($sigNo, $handler);
89
    }
90
}
91
92
/**
93
 * @param array $exclude
94
 *
95
 * @return array
96
 */
97
function pcntl_signal_list(array $exclude = []): array
98
{
99
    return \array_diff([
100
        'SIGHUP',
101
        'SIGINT',
102
        'SIGQUIT',
103
        'SIGILL',
104
        'SIGTRAP',
105
        'SIGABRT',
106
        'SIGIOT',
107
        'SIGBUS',
108
        'SIGFPE',
109
        // 'SIGKILL',
110
        'SIGUSR1',
111
        'SIGSEGV',
112
        'SIGUSR2',
113
        'SIGPIPE',
114
        'SIGALRM',
115
        'SIGTERM',
116
        'SIGSTKFLT',
117
        'SIGCLD',
118
        'SIGCHLD',
119
        'SIGCONT',
120
        // 'SIGSTOP',
121
        'SIGTSTP',
122
        'SIGTTIN',
123
        'SIGTTOU',
124
        'SIGURG',
125
        'SIGXCPU',
126
        'SIGXFSZ',
127
        'SIGVTALRM',
128
        'SIGPROF',
129
        'SIGWINCH',
130
        'SIGPOLL',
131
        'SIGIO',
132
        'SIGPWR',
133
        'SIGSYS',
134
    ], $exclude);
135
}
136