Giampaolo Rodola' | e09fb71 | 2014-04-04 15:34:17 +0200 | [diff] [blame] | 1 | import _signal |
| 2 | from _signal import * |
| 3 | from functools import wraps as _wraps |
| 4 | from enum import IntEnum as _IntEnum |
| 5 | |
| 6 | _globals = globals() |
| 7 | |
Ethan Furman | 24e837f | 2015-03-18 17:27:57 -0700 | [diff] [blame] | 8 | _IntEnum._convert( |
| 9 | 'Signals', __name__, |
| 10 | lambda name: |
| 11 | name.isupper() |
| 12 | and (name.startswith('SIG') and not name.startswith('SIG_')) |
| 13 | or name.startswith('CTRL_')) |
Giampaolo Rodola' | e09fb71 | 2014-04-04 15:34:17 +0200 | [diff] [blame] | 14 | |
Ethan Furman | 24e837f | 2015-03-18 17:27:57 -0700 | [diff] [blame] | 15 | _IntEnum._convert( |
| 16 | 'Handlers', __name__, |
| 17 | lambda name: name in ('SIG_DFL', 'SIG_IGN')) |
Giampaolo Rodola' | e09fb71 | 2014-04-04 15:34:17 +0200 | [diff] [blame] | 18 | |
| 19 | if 'pthread_sigmask' in _globals: |
Ethan Furman | 24e837f | 2015-03-18 17:27:57 -0700 | [diff] [blame] | 20 | _IntEnum._convert( |
| 21 | 'Sigmasks', __name__, |
| 22 | lambda name: name in ('SIG_BLOCK', 'SIG_UNBLOCK', 'SIG_SETMASK')) |
Giampaolo Rodola' | e09fb71 | 2014-04-04 15:34:17 +0200 | [diff] [blame] | 23 | |
| 24 | |
| 25 | def _int_to_enum(value, enum_klass): |
| 26 | """Convert a numeric value to an IntEnum member. |
| 27 | If it's not a known member, return the numeric value itself. |
| 28 | """ |
| 29 | try: |
| 30 | return enum_klass(value) |
| 31 | except ValueError: |
| 32 | return value |
| 33 | |
| 34 | |
| 35 | def _enum_to_int(value): |
| 36 | """Convert an IntEnum member to a numeric value. |
| 37 | If it's not a IntEnum member return the value itself. |
| 38 | """ |
| 39 | try: |
| 40 | return int(value) |
| 41 | except (ValueError, TypeError): |
| 42 | return value |
| 43 | |
| 44 | |
| 45 | @_wraps(_signal.signal) |
| 46 | def signal(signalnum, handler): |
| 47 | handler = _signal.signal(_enum_to_int(signalnum), _enum_to_int(handler)) |
| 48 | return _int_to_enum(handler, Handlers) |
| 49 | |
| 50 | |
| 51 | @_wraps(_signal.getsignal) |
| 52 | def getsignal(signalnum): |
| 53 | handler = _signal.getsignal(signalnum) |
| 54 | return _int_to_enum(handler, Handlers) |
| 55 | |
| 56 | |
| 57 | if 'pthread_sigmask' in _globals: |
| 58 | @_wraps(_signal.pthread_sigmask) |
| 59 | def pthread_sigmask(how, mask): |
| 60 | sigs_set = _signal.pthread_sigmask(how, mask) |
| 61 | return set(_int_to_enum(x, Signals) for x in sigs_set) |
| 62 | pthread_sigmask.__doc__ = _signal.pthread_sigmask.__doc__ |
| 63 | |
| 64 | |
Victor Stinner | a2b5bf0 | 2014-04-04 16:57:24 +0200 | [diff] [blame] | 65 | if 'sigpending' in _globals: |
| 66 | @_wraps(_signal.sigpending) |
| 67 | def sigpending(): |
| 68 | sigs = _signal.sigpending() |
| 69 | return set(_int_to_enum(x, Signals) for x in sigs) |
Giampaolo Rodola' | e09fb71 | 2014-04-04 15:34:17 +0200 | [diff] [blame] | 70 | |
| 71 | |
| 72 | if 'sigwait' in _globals: |
| 73 | @_wraps(_signal.sigwait) |
| 74 | def sigwait(sigset): |
| 75 | retsig = _signal.sigwait(sigset) |
| 76 | return _int_to_enum(retsig, Signals) |
| 77 | sigwait.__doc__ = _signal.sigwait |
| 78 | |
| 79 | del _globals, _wraps |