Revision 451575de
b/lib/utils.py | ||
---|---|---|
2068 | 2068 |
"Failed to unlock %s" % self.filename) |
2069 | 2069 |
|
2070 | 2070 |
|
2071 |
def SignalHandled(signums): |
|
2072 |
"""Signal Handled decoration. |
|
2073 |
|
|
2074 |
This special decorator installs a signal handler and then calls the target |
|
2075 |
function. The function must accept a 'signal_handlers' keyword argument, |
|
2076 |
which will contain a dict indexed by signal number, with SignalHandler |
|
2077 |
objects as values. |
|
2078 |
|
|
2079 |
The decorator can be safely stacked with iself, to handle multiple signals |
|
2080 |
with different handlers. |
|
2081 |
|
|
2082 |
@type signums: list |
|
2083 |
@param signums: signals to intercept |
|
2084 |
|
|
2085 |
""" |
|
2086 |
def wrap(fn): |
|
2087 |
def sig_function(*args, **kwargs): |
|
2088 |
assert 'signal_handlers' not in kwargs or \ |
|
2089 |
kwargs['signal_handlers'] is None or \ |
|
2090 |
isinstance(kwargs['signal_handlers'], dict), \ |
|
2091 |
"Wrong signal_handlers parameter in original function call" |
|
2092 |
if 'signal_handlers' in kwargs and kwargs['signal_handlers'] is not None: |
|
2093 |
signal_handlers = kwargs['signal_handlers'] |
|
2094 |
else: |
|
2095 |
signal_handlers = {} |
|
2096 |
kwargs['signal_handlers'] = signal_handlers |
|
2097 |
sighandler = SignalHandler(signums) |
|
2098 |
try: |
|
2099 |
for sig in signums: |
|
2100 |
signal_handlers[sig] = sighandler |
|
2101 |
return fn(*args, **kwargs) |
|
2102 |
finally: |
|
2103 |
sighandler.Reset() |
|
2104 |
return sig_function |
|
2105 |
return wrap |
|
2106 |
|
|
2107 |
|
|
2071 | 2108 |
class SignalHandler(object): |
2072 | 2109 |
"""Generic signal handler class. |
2073 | 2110 |
|
Also available in: Unified diff