Passed
Push — master ( d7ea07...baeed4 )
by PHPinnacle
02:31
created

ensign_pcntl_signals()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 15
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

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