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

gevent.signal: spawn Greenlet instead of raw greenlet; switch into the...

gevent.signal: spawn Greenlet instead of raw greenlet; switch into the greenlet immediatelly when the signal handler is called
parent 88709ccd
...@@ -108,10 +108,18 @@ def kill(greenlet, exception=GreenletExit): ...@@ -108,10 +108,18 @@ def kill(greenlet, exception=GreenletExit):
class signal(object): class signal(object):
greenlet_class = None
def __init__(self, signalnum, handler, *args, **kwargs): def __init__(self, signalnum, handler, *args, **kwargs):
self.hub = get_hub() self.hub = get_hub()
self.watcher = self.hub.loop.signal(signalnum, ref=False) self.watcher = self.hub.loop.signal(signalnum, ref=False)
self.watcher.start(spawn_raw, self.handle, handler, args, kwargs) self.watcher.start(self._start)
self.handler = handler
self.args = args
self.kwargs = kwargs
if self.greenlet_class is None:
from gevent import Greenlet
self.greenlet_class = Greenlet
def _get_ref(self): def _get_ref(self):
return self.watcher.ref return self.watcher.ref
...@@ -125,13 +133,24 @@ class signal(object): ...@@ -125,13 +133,24 @@ class signal(object):
def cancel(self): def cancel(self):
self.watcher.stop() self.watcher.stop()
def handle(self, handler, args, kwargs): def _start(self):
greenlet = self.greenlet_class(self.handle)
greenlet._start_event = _Dummy()
greenlet.switch()
def handle(self):
try: try:
handler(*args, **kwargs) self.handler(*self.args, **self.kwargs)
except: except:
self.hub.handle_error(None, *sys.exc_info()) self.hub.handle_error(None, *sys.exc_info())
class _Dummy(object):
def stop(self):
pass
if _original_fork is not None: if _original_fork is not None:
def fork(): def fork():
......
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