2019-10-29 11:25:03 +01:00
|
|
|
from abc import ABC, abstractmethod
|
2020-04-10 14:17:15 +02:00
|
|
|
from typing import Dict, Callable
|
2019-10-29 11:25:03 +01:00
|
|
|
|
2020-04-10 14:17:15 +02:00
|
|
|
_handled_signals: Dict[int, Callable] = {}
|
2019-10-29 11:25:03 +01:00
|
|
|
|
|
|
|
|
def _signal_handler(signal, frame):
|
|
|
|
|
if not signal in _handled_signals.keys():
|
|
|
|
|
return
|
|
|
|
|
for h in _handled_signals[signal]:
|
|
|
|
|
h.func(signal, *h.args)
|
|
|
|
|
|
|
|
|
|
class Signals:
|
|
|
|
|
|
|
|
|
|
class Handler:
|
|
|
|
|
def __init__(self, func, args):
|
|
|
|
|
self.func = func
|
|
|
|
|
self.args = args
|
|
|
|
|
|
|
|
|
|
def __init(self):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
@abstractmethod
|
|
|
|
|
def _add_handler(self, signal, handler):
|
|
|
|
|
raise Exception("_add_handler() is not reimplemented")
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def add_handler(cls, signals, handler, *args):
|
|
|
|
|
for signal in signals:
|
|
|
|
|
h = Signals.Handler(handler, args)
|
|
|
|
|
if not signal in _handled_signals.keys():
|
|
|
|
|
_handled_signals[signal] = [h]
|
|
|
|
|
cls._add_signal_handler(signal, _signal_handler)
|
|
|
|
|
else:
|
|
|
|
|
_handled_signals[signal].add(h)
|