PocketMine-MP 5.23.3 git-976fc63567edab7a6fb6aeae739f43cf9fe57de4
Loading...
Searching...
No Matches
SignalHandler.php
1<?php
2
3/*
4 *
5 * ____ _ _ __ __ _ __ __ ____
6 * | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
7 * | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
8 * | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
9 * |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
10 *
11 * This program is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU Lesser General Public License as published by
13 * the Free Software Foundation, either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * @author PocketMine Team
17 * @link http://www.pocketmine.net/
18 *
19 *
20 */
21
22declare(strict_types=1);
23
24namespace pocketmine\utils;
25
26use function function_exists;
27use function pcntl_async_signals;
28use function pcntl_signal;
29use function sapi_windows_set_ctrl_handler;
30use const PHP_WINDOWS_EVENT_CTRL_BREAK;
31use const PHP_WINDOWS_EVENT_CTRL_C;
32use const SIG_DFL;
33use const SIGHUP;
34use const SIGINT;
35use const SIGTERM;
36
37final class SignalHandler{
39 private ?\Closure $interruptCallback = null;
40
44 public function __construct(\Closure $interruptCallback){
45 if(function_exists('sapi_windows_set_ctrl_handler')){
46 sapi_windows_set_ctrl_handler($this->interruptCallback = function(int $signo) use ($interruptCallback) : void{
47 if($signo === PHP_WINDOWS_EVENT_CTRL_C || $signo === PHP_WINDOWS_EVENT_CTRL_BREAK){
48 $interruptCallback();
49 }
50 });
51 }elseif(function_exists('pcntl_signal')){
52 foreach([
53 SIGTERM,
54 SIGINT,
55 SIGHUP
56 ] as $signal){
57 pcntl_signal($signal, $this->interruptCallback = fn(int $signo) => $interruptCallback());
58 }
59 pcntl_async_signals(true);
60 }else{
61 //no supported signal handlers :(
62 }
63 }
64
65 public function unregister() : void{
66 if(function_exists('sapi_windows_set_ctrl_handler')){
67 sapi_windows_set_ctrl_handler($this->interruptCallback, false);
68 }elseif(function_exists('pcntl_signal')){
69 foreach([
70 SIGTERM,
71 SIGINT,
72 SIGHUP
73 ] as $signal){
74 pcntl_signal($signal, SIG_DFL);
75 }
76 }
77 }
78}
__construct(\Closure $interruptCallback)