event keeps a ref to its event_base - needed for later error propagation, and to ensure method calls remain valid
authorTero Marttila <terom@fixme.fi>
Sat, 26 Sep 2009 23:51:31 +0300
changeset 57 8c4032265c8c
parent 56 07ed878c847b
child 58 ecd89f9605ac
event keeps a ref to its event_base - needed for later error propagation, and to ensure method calls remain valid
qmsk/net/lib/event2/event.pxd
qmsk/net/lib/event2/event.pyx
--- a/qmsk/net/lib/event2/event.pxd	Sat Sep 26 23:38:02 2009 +0300
+++ b/qmsk/net/lib/event2/event.pxd	Sat Sep 26 23:51:31 2009 +0300
@@ -4,6 +4,8 @@
 
 cimport qmsk.net.lib.event2.lib as lib
 
+from qmsk.net.lib.event2.base cimport event_base
+
 # internal helper method for handling timeout arguments
 cdef lib.timeval* build_timeout (lib.timeval *tv, object timeout = ?) except? <lib.timeval *>-1
 
@@ -26,12 +28,12 @@
         themselves while "active". In other words, .add() will aquire an internal reference, which will be released
         before the __call__().
 
-        XXX: it might be better for refcounting if the event_base were to keep a reference to each event
-        XXX: or if we kept a reference to the event_base? Might be even better
-
         XXX: propagate errors (including e.g. KeyboardInterrupt?) from __call__ to event_base.loop()?
     """
 
+    # reference to our supporting event_base to ensure we don't lose it
+    cdef readonly event_base base
+
     # the underlying event object
     cdef lib.event *ev
 
--- a/qmsk/net/lib/event2/event.pyx	Sat Sep 26 23:38:02 2009 +0300
+++ b/qmsk/net/lib/event2/event.pyx	Sat Sep 26 23:51:31 2009 +0300
@@ -45,6 +45,9 @@
 cdef class event :
 
     def __init__ (self, event_base base not None, lib.evutil_socket_t fd, short events) :
+        # hold on to our event_base
+        self.base = base
+
         # we don't hold a self-reference yet
         self.alive = False