File pyevent-0.3-libevent-2_0.patch of Package python-event
Index: b/event.pyx
===================================================================
--- a/event.pyx
+++ b/event.pyx
@@ -47,8 +47,9 @@ cdef extern from "event.h":
void evtimer_set(event_t *ev, event_handler handler, void *arg)
int event_add(event_t *ev, timeval *tv)
int event_del(event_t *ev)
- int event_dispatch()
- int event_loop(int loop)
+ int event_dispatch() nogil
+ int event_loop(int loop) nogil
+ int event_loopbreak()
int event_pending(event_t *ev, short, timeval *tv)
int EVLOOP_ONCE
@@ -62,13 +63,18 @@ EV_PERSIST = 0x10
__event_exc = None
-cdef int __event_sigcb():
- return -1
+cdef void __event_abort():
+ global __event_exc
+
+ event_loopbreak()
+ __event_exc = sys.exc_info()
+ if __event_exc[0] is None:
+ __event_exc = None
-cdef void __event_handler(int fd, short evtype, void *arg):
+cdef void __event_handler(int fd, short evtype, void *arg) with gil:
(<object>arg).__callback(evtype)
-cdef void __simple_event_handler(int fd, short evtype, void *arg):
+cdef void __simple_event_handler(int fd, short evtype, void *arg) with gil:
(<object>arg).__simple_callback(evtype)
cdef class event:
@@ -109,9 +115,6 @@ cdef class event:
event_set(&self.ev, handle, evtype, handler, <void *>self)
def __simple_callback(self, short evtype):
- cdef extern int event_gotsig
- cdef extern int (*event_sigcb)()
- global __event_exc
try:
if self.callback(*self.args) != None:
if self.tv.tv_sec or self.tv.tv_usec:
@@ -119,24 +122,17 @@ cdef class event:
else:
event_add(&self.ev, NULL)
except:
- __event_exc = sys.exc_info()
- event_sigcb = __event_sigcb
- event_gotsig = 1
+ __event_abort()
# XXX - account for event.signal() EV_PERSIST
if not (evtype & EV_SIGNAL) and \
not event_pending(&self.ev, EV_READ|EV_WRITE|EV_SIGNAL|EV_TIMEOUT, NULL):
Py_DECREF(self)
def __callback(self, short evtype):
- cdef extern int event_gotsig
- cdef extern int (*event_sigcb)()
- global __event_exc
try:
self.callback(self, self.handle, evtype, self.args)
except:
- __event_exc = sys.exc_info()
- event_sigcb = __event_sigcb
- event_gotsig = 1
+ __event_abort()
if not event_pending(&self.ev, EV_READ|EV_WRITE|EV_SIGNAL|EV_TIMEOUT, NULL):
Py_DECREF(self)
@@ -255,26 +251,39 @@ def init():
event_init()
def dispatch():
- """Dispatch all events on the event queue."""
+ """Dispatch all events on the event queue.
+ Returns -1 on error, 0 on success, and 1 if no events are registered.
+ """
+ cdef int ret
global __event_exc
- event_dispatch()
+ with nogil:
+ ret = event_dispatch()
if __event_exc:
- raise __event_exc[0], __event_exc[1], __event_exc[2]
+ t = __event_exc
+ __event_exc = None
+ raise t[0], t[1], t[2]
+ return ret
def loop(nonblock=False):
- """Dispatch all pending events on queue in a single pass."""
- cdef int flags
+ """Dispatch all pending events on queue in a single pass.
+ Returns -1 on error, 0 on success, and 1 if no events are registered.
+ """
+ cdef int flags, ret
+ global __event_exc
flags = EVLOOP_ONCE
if nonblock:
flags = EVLOOP_ONCE|EVLOOP_NONBLOCK
- event_loop(flags)
+ with nogil:
+ ret = event_loop(flags)
+ if __event_exc:
+ t = __event_exc
+ __event_exc = None
+ raise t[0], t[1], t[2]
+ return ret
def abort():
"""Abort event dispatch loop."""
- cdef extern int event_gotsig
- cdef extern int (*event_sigcb)()
- event_sigcb = __event_sigcb
- event_gotsig = 1
+ __event_abort()
# XXX - make sure event queue is always initialized.
init()