Giampaolo Rodola' | e09fb71 | 2014-04-04 15:34:17 +0200 | [diff] [blame] | 1 | import _signal |
| 2 | from _signal import * |
Giampaolo Rodola' | e09fb71 | 2014-04-04 15:34:17 +0200 | [diff] [blame] | 3 | from enum import IntEnum as _IntEnum |
| 4 | |
| 5 | _globals = globals() |
| 6 | |
orlnub123 | 0fb9fad | 2018-09-12 20:28:53 +0300 | [diff] [blame] | 7 | _IntEnum._convert_( |
Ethan Furman | 24e837f | 2015-03-18 17:27:57 -0700 | [diff] [blame] | 8 | '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' | e09fb71 | 2014-04-04 15:34:17 +0200 | [diff] [blame] | 13 | |
orlnub123 | 0fb9fad | 2018-09-12 20:28:53 +0300 | [diff] [blame] | 14 | _IntEnum._convert_( |
Ethan Furman | 24e837f | 2015-03-18 17:27:57 -0700 | [diff] [blame] | 15 | 'Handlers', __name__, |
| 16 | lambda name: name in ('SIG_DFL', 'SIG_IGN')) |
Giampaolo Rodola' | e09fb71 | 2014-04-04 15:34:17 +0200 | [diff] [blame] | 17 | |
| 18 | if 'pthread_sigmask' in _globals: |
orlnub123 | 0fb9fad | 2018-09-12 20:28:53 +0300 | [diff] [blame] | 19 | _IntEnum._convert_( |
Ethan Furman | 24e837f | 2015-03-18 17:27:57 -0700 | [diff] [blame] | 20 | 'Sigmasks', __name__, |
| 21 | lambda name: name in ('SIG_BLOCK', 'SIG_UNBLOCK', 'SIG_SETMASK')) |
Giampaolo Rodola' | e09fb71 | 2014-04-04 15:34:17 +0200 | [diff] [blame] | 22 | |
| 23 | |
| 24 | def _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 | |
| 34 | def _enum_to_int(value): |
| 35 | """Convert an IntEnum member to a numeric value. |
Martin Panter | d2ad571 | 2015-11-02 04:20:33 +0000 | [diff] [blame] | 36 | If it's not an IntEnum member return the value itself. |
Giampaolo Rodola' | e09fb71 | 2014-04-04 15:34:17 +0200 | [diff] [blame] | 37 | """ |
| 38 | try: |
| 39 | return int(value) |
| 40 | except (ValueError, TypeError): |
| 41 | return value |
| 42 | |
| 43 | |
Serhiy Storchaka | e55deaa | 2021-12-13 12:14:51 +0200 | [diff] [blame] | 44 | # 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. |
| 48 | def _wraps(wrapped): |
| 49 | def decorator(wrapper): |
| 50 | wrapper.__doc__ = wrapped.__doc__ |
| 51 | return wrapper |
| 52 | return decorator |
| 53 | |
Giampaolo Rodola' | e09fb71 | 2014-04-04 15:34:17 +0200 | [diff] [blame] | 54 | @_wraps(_signal.signal) |
| 55 | def 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) |
| 61 | def getsignal(signalnum): |
| 62 | handler = _signal.getsignal(signalnum) |
| 63 | return _int_to_enum(handler, Handlers) |
| 64 | |
| 65 | |
| 66 | if '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' | e09fb71 | 2014-04-04 15:34:17 +0200 | [diff] [blame] | 71 | |
| 72 | |
Victor Stinner | a2b5bf0 | 2014-04-04 16:57:24 +0200 | [diff] [blame] | 73 | if 'sigpending' in _globals: |
| 74 | @_wraps(_signal.sigpending) |
| 75 | def sigpending(): |
Antoine Pitrou | 9d3627e | 2018-05-04 13:00:50 +0200 | [diff] [blame] | 76 | return {_int_to_enum(x, Signals) for x in _signal.sigpending()} |
Giampaolo Rodola' | e09fb71 | 2014-04-04 15:34:17 +0200 | [diff] [blame] | 77 | |
| 78 | |
| 79 | if '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' | e09fb71 | 2014-04-04 15:34:17 +0200 | [diff] [blame] | 84 | |
Antoine Pitrou | 9d3627e | 2018-05-04 13:00:50 +0200 | [diff] [blame] | 85 | |
| 86 | if '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' | e09fb71 | 2014-04-04 15:34:17 +0200 | [diff] [blame] | 92 | del _globals, _wraps |