blob: 50b215b29d2fadf6ccc38e860242d04e5d946fb5 [file] [log] [blame]
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +02001import _signal
2from _signal import *
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +02003from enum import IntEnum as _IntEnum
4
5_globals = globals()
6
orlnub1230fb9fad2018-09-12 20:28:53 +03007_IntEnum._convert_(
Ethan Furman24e837f2015-03-18 17:27:57 -07008 'Signals', __name__,
9 lambda name:
10 name.isupper()
11 and (name.startswith('SIG') and not name.startswith('SIG_'))
12 or name.startswith('CTRL_'))
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +020013
orlnub1230fb9fad2018-09-12 20:28:53 +030014_IntEnum._convert_(
Ethan Furman24e837f2015-03-18 17:27:57 -070015 'Handlers', __name__,
16 lambda name: name in ('SIG_DFL', 'SIG_IGN'))
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +020017
18if 'pthread_sigmask' in _globals:
orlnub1230fb9fad2018-09-12 20:28:53 +030019 _IntEnum._convert_(
Ethan Furman24e837f2015-03-18 17:27:57 -070020 'Sigmasks', __name__,
21 lambda name: name in ('SIG_BLOCK', 'SIG_UNBLOCK', 'SIG_SETMASK'))
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +020022
23
24def _int_to_enum(value, enum_klass):
25 """Convert a numeric value to an IntEnum member.
26 If it's not a known member, return the numeric value itself.
27 """
28 try:
29 return enum_klass(value)
30 except ValueError:
31 return value
32
33
34def _enum_to_int(value):
35 """Convert an IntEnum member to a numeric value.
Martin Panterd2ad5712015-11-02 04:20:33 +000036 If it's not an IntEnum member return the value itself.
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +020037 """
38 try:
39 return int(value)
40 except (ValueError, TypeError):
41 return value
42
43
Serhiy Storchakae55deaa2021-12-13 12:14:51 +020044# Similar to functools.wraps(), but only assign __doc__.
45# __module__ should be preserved,
46# __name__ and __qualname__ are already fine,
47# __annotations__ is not set.
48def _wraps(wrapped):
49 def decorator(wrapper):
50 wrapper.__doc__ = wrapped.__doc__
51 return wrapper
52 return decorator
53
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +020054@_wraps(_signal.signal)
55def signal(signalnum, handler):
56 handler = _signal.signal(_enum_to_int(signalnum), _enum_to_int(handler))
57 return _int_to_enum(handler, Handlers)
58
59
60@_wraps(_signal.getsignal)
61def getsignal(signalnum):
62 handler = _signal.getsignal(signalnum)
63 return _int_to_enum(handler, Handlers)
64
65
66if 'pthread_sigmask' in _globals:
67 @_wraps(_signal.pthread_sigmask)
68 def pthread_sigmask(how, mask):
69 sigs_set = _signal.pthread_sigmask(how, mask)
70 return set(_int_to_enum(x, Signals) for x in sigs_set)
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +020071
72
Victor Stinnera2b5bf02014-04-04 16:57:24 +020073if 'sigpending' in _globals:
74 @_wraps(_signal.sigpending)
75 def sigpending():
Antoine Pitrou9d3627e2018-05-04 13:00:50 +020076 return {_int_to_enum(x, Signals) for x in _signal.sigpending()}
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +020077
78
79if 'sigwait' in _globals:
80 @_wraps(_signal.sigwait)
81 def sigwait(sigset):
82 retsig = _signal.sigwait(sigset)
83 return _int_to_enum(retsig, Signals)
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +020084
Antoine Pitrou9d3627e2018-05-04 13:00:50 +020085
86if 'valid_signals' in _globals:
87 @_wraps(_signal.valid_signals)
88 def valid_signals():
89 return {_int_to_enum(x, Signals) for x in _signal.valid_signals()}
90
91
Giampaolo Rodola'e09fb712014-04-04 15:34:17 +020092del _globals, _wraps