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()
openSUSE Build Service is sponsored by