xref: /aosp_15_r20/prebuilts/build-tools/common/py3-stdlib/signal.py (revision cda5da8d549138a6648c5ee6d7a49cf8f4a657be)
1*cda5da8dSAndroid Build Coastguard Workerimport _signal
2*cda5da8dSAndroid Build Coastguard Workerfrom _signal import *
3*cda5da8dSAndroid Build Coastguard Workerfrom enum import IntEnum as _IntEnum
4*cda5da8dSAndroid Build Coastguard Worker
5*cda5da8dSAndroid Build Coastguard Worker_globals = globals()
6*cda5da8dSAndroid Build Coastguard Worker
7*cda5da8dSAndroid Build Coastguard Worker_IntEnum._convert_(
8*cda5da8dSAndroid Build Coastguard Worker        'Signals', __name__,
9*cda5da8dSAndroid Build Coastguard Worker        lambda name:
10*cda5da8dSAndroid Build Coastguard Worker            name.isupper()
11*cda5da8dSAndroid Build Coastguard Worker            and (name.startswith('SIG') and not name.startswith('SIG_'))
12*cda5da8dSAndroid Build Coastguard Worker            or name.startswith('CTRL_'))
13*cda5da8dSAndroid Build Coastguard Worker
14*cda5da8dSAndroid Build Coastguard Worker_IntEnum._convert_(
15*cda5da8dSAndroid Build Coastguard Worker        'Handlers', __name__,
16*cda5da8dSAndroid Build Coastguard Worker        lambda name: name in ('SIG_DFL', 'SIG_IGN'))
17*cda5da8dSAndroid Build Coastguard Worker
18*cda5da8dSAndroid Build Coastguard Workerif 'pthread_sigmask' in _globals:
19*cda5da8dSAndroid Build Coastguard Worker    _IntEnum._convert_(
20*cda5da8dSAndroid Build Coastguard Worker            'Sigmasks', __name__,
21*cda5da8dSAndroid Build Coastguard Worker            lambda name: name in ('SIG_BLOCK', 'SIG_UNBLOCK', 'SIG_SETMASK'))
22*cda5da8dSAndroid Build Coastguard Worker
23*cda5da8dSAndroid Build Coastguard Worker
24*cda5da8dSAndroid Build Coastguard Workerdef _int_to_enum(value, enum_klass):
25*cda5da8dSAndroid Build Coastguard Worker    """Convert a numeric value to an IntEnum member.
26*cda5da8dSAndroid Build Coastguard Worker    If it's not a known member, return the numeric value itself.
27*cda5da8dSAndroid Build Coastguard Worker    """
28*cda5da8dSAndroid Build Coastguard Worker    try:
29*cda5da8dSAndroid Build Coastguard Worker        return enum_klass(value)
30*cda5da8dSAndroid Build Coastguard Worker    except ValueError:
31*cda5da8dSAndroid Build Coastguard Worker        return value
32*cda5da8dSAndroid Build Coastguard Worker
33*cda5da8dSAndroid Build Coastguard Worker
34*cda5da8dSAndroid Build Coastguard Workerdef _enum_to_int(value):
35*cda5da8dSAndroid Build Coastguard Worker    """Convert an IntEnum member to a numeric value.
36*cda5da8dSAndroid Build Coastguard Worker    If it's not an IntEnum member return the value itself.
37*cda5da8dSAndroid Build Coastguard Worker    """
38*cda5da8dSAndroid Build Coastguard Worker    try:
39*cda5da8dSAndroid Build Coastguard Worker        return int(value)
40*cda5da8dSAndroid Build Coastguard Worker    except (ValueError, TypeError):
41*cda5da8dSAndroid Build Coastguard Worker        return value
42*cda5da8dSAndroid Build Coastguard Worker
43*cda5da8dSAndroid Build Coastguard Worker
44*cda5da8dSAndroid Build Coastguard Worker# Similar to functools.wraps(), but only assign __doc__.
45*cda5da8dSAndroid Build Coastguard Worker# __module__ should be preserved,
46*cda5da8dSAndroid Build Coastguard Worker# __name__ and __qualname__ are already fine,
47*cda5da8dSAndroid Build Coastguard Worker# __annotations__ is not set.
48*cda5da8dSAndroid Build Coastguard Workerdef _wraps(wrapped):
49*cda5da8dSAndroid Build Coastguard Worker    def decorator(wrapper):
50*cda5da8dSAndroid Build Coastguard Worker        wrapper.__doc__ = wrapped.__doc__
51*cda5da8dSAndroid Build Coastguard Worker        return wrapper
52*cda5da8dSAndroid Build Coastguard Worker    return decorator
53*cda5da8dSAndroid Build Coastguard Worker
54*cda5da8dSAndroid Build Coastguard Worker@_wraps(_signal.signal)
55*cda5da8dSAndroid Build Coastguard Workerdef signal(signalnum, handler):
56*cda5da8dSAndroid Build Coastguard Worker    handler = _signal.signal(_enum_to_int(signalnum), _enum_to_int(handler))
57*cda5da8dSAndroid Build Coastguard Worker    return _int_to_enum(handler, Handlers)
58*cda5da8dSAndroid Build Coastguard Worker
59*cda5da8dSAndroid Build Coastguard Worker
60*cda5da8dSAndroid Build Coastguard Worker@_wraps(_signal.getsignal)
61*cda5da8dSAndroid Build Coastguard Workerdef getsignal(signalnum):
62*cda5da8dSAndroid Build Coastguard Worker    handler = _signal.getsignal(signalnum)
63*cda5da8dSAndroid Build Coastguard Worker    return _int_to_enum(handler, Handlers)
64*cda5da8dSAndroid Build Coastguard Worker
65*cda5da8dSAndroid Build Coastguard Worker
66*cda5da8dSAndroid Build Coastguard Workerif 'pthread_sigmask' in _globals:
67*cda5da8dSAndroid Build Coastguard Worker    @_wraps(_signal.pthread_sigmask)
68*cda5da8dSAndroid Build Coastguard Worker    def pthread_sigmask(how, mask):
69*cda5da8dSAndroid Build Coastguard Worker        sigs_set = _signal.pthread_sigmask(how, mask)
70*cda5da8dSAndroid Build Coastguard Worker        return set(_int_to_enum(x, Signals) for x in sigs_set)
71*cda5da8dSAndroid Build Coastguard Worker
72*cda5da8dSAndroid Build Coastguard Worker
73*cda5da8dSAndroid Build Coastguard Workerif 'sigpending' in _globals:
74*cda5da8dSAndroid Build Coastguard Worker    @_wraps(_signal.sigpending)
75*cda5da8dSAndroid Build Coastguard Worker    def sigpending():
76*cda5da8dSAndroid Build Coastguard Worker        return {_int_to_enum(x, Signals) for x in _signal.sigpending()}
77*cda5da8dSAndroid Build Coastguard Worker
78*cda5da8dSAndroid Build Coastguard Worker
79*cda5da8dSAndroid Build Coastguard Workerif 'sigwait' in _globals:
80*cda5da8dSAndroid Build Coastguard Worker    @_wraps(_signal.sigwait)
81*cda5da8dSAndroid Build Coastguard Worker    def sigwait(sigset):
82*cda5da8dSAndroid Build Coastguard Worker        retsig = _signal.sigwait(sigset)
83*cda5da8dSAndroid Build Coastguard Worker        return _int_to_enum(retsig, Signals)
84*cda5da8dSAndroid Build Coastguard Worker
85*cda5da8dSAndroid Build Coastguard Worker
86*cda5da8dSAndroid Build Coastguard Workerif 'valid_signals' in _globals:
87*cda5da8dSAndroid Build Coastguard Worker    @_wraps(_signal.valid_signals)
88*cda5da8dSAndroid Build Coastguard Worker    def valid_signals():
89*cda5da8dSAndroid Build Coastguard Worker        return {_int_to_enum(x, Signals) for x in _signal.valid_signals()}
90*cda5da8dSAndroid Build Coastguard Worker
91*cda5da8dSAndroid Build Coastguard Worker
92*cda5da8dSAndroid Build Coastguard Workerdel _globals, _wraps
93