Commit 7a664a5e authored by Denis Bilenko's avatar Denis Bilenko

gevent.signal: take advantage of "ref" feature

convert signal() into a class; the usage did not change; added property 'ref' that is forwarded to watcher
parent 18fd6898
...@@ -106,39 +106,30 @@ def kill(greenlet, exception=GreenletExit): ...@@ -106,39 +106,30 @@ def kill(greenlet, exception=GreenletExit):
get_hub().loop.run_callback(greenlet.throw, exception) get_hub().loop.run_callback(greenlet.throw, exception)
class Signal(object): class signal(object):
def __init__(self, signalnum): def __init__(self, signalnum, handler, *args, **kwargs):
self.hub = get_hub() self.hub = get_hub()
self.watcher = self.hub.loop.signal(signalnum) self.watcher = self.hub.loop.signal(signalnum, ref=False)
self._unref = 0
def start(self, handler, *args, **kwargs):
self.watcher.start(spawn_raw, self.handle, handler, args, kwargs) self.watcher.start(spawn_raw, self.handle, handler, args, kwargs)
if self._unref == 0:
self.hub.loop.unref() def _get_ref(self):
self._unref = 1 return self.watcher.ref
def _set_ref(self, value):
self.watcher.ref = value
ref = property(_get_ref, _set_ref)
del _get_ref, _set_ref
def cancel(self): def cancel(self):
self.watcher.stop() self.watcher.stop()
if self._unref == 1:
self.hub.loop.ref()
self._unref = 0
def handle(self, handler, args, kwargs): def handle(self, handler, args, kwargs):
try: try:
handler(*args, **kwargs) handler(*args, **kwargs)
except: except:
self.hub.handle_error(None, *sys.exc_info()) self.hub.handle_error(None, *sys.exc_info())
if not self.watcher.active and self._unref == 1:
self.hub.loop.ref()
self._unref = 0
def signal(signalnum, handler, *args, **kwargs):
obj = Signal(signalnum)
obj.start(handler, *args, **kwargs)
return obj
if _original_fork is not None: if _original_fork is not None:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment