PocketMine-MP 5.15.1 git-5ef247620a7c6301a849b54e5ef1009217729fc8
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;
40
44 public function __construct(\Closure $interruptCallback){
45 $this->interruptCallback = $interruptCallback;
46
47 if(function_exists('sapi_windows_set_ctrl_handler')){
48 sapi_windows_set_ctrl_handler($this->interruptCallback = function(int $signo) use ($interruptCallback) : void{
49 if($signo === PHP_WINDOWS_EVENT_CTRL_C || $signo === PHP_WINDOWS_EVENT_CTRL_BREAK){
50 $interruptCallback();
51 }
52 });
53 }elseif(function_exists('pcntl_signal')){
54 foreach([
55 SIGTERM,
56 SIGINT,
57 SIGHUP
58 ] as $signal){
59 pcntl_signal($signal, $this->interruptCallback = fn(int $signo) => $interruptCallback());
60 }
61 pcntl_async_signals(true);
62 }else{
63 //no supported signal handlers :(
64 }
65 }
66
67 public function unregister() : void{
68 if(function_exists('sapi_windows_set_ctrl_handler')){
69 sapi_windows_set_ctrl_handler($this->interruptCallback, false);
70 }elseif(function_exists('pcntl_signal')){
71 foreach([
72 SIGTERM,
73 SIGINT,
74 SIGHUP
75 ] as $signal){
76 pcntl_signal($signal, SIG_DFL);
77 }
78 }
79 }
80}
__construct(\Closure $interruptCallback)