qmsk/net/lib/event2/base.pyx
changeset 41 02f7c0539843
parent 39 075eaafa80a7
child 51 c6b4abfc21da
--- a/qmsk/net/lib/event2/base.pyx	Mon Aug 31 21:34:54 2009 +0300
+++ b/qmsk/net/lib/event2/base.pyx	Mon Aug 31 21:36:15 2009 +0300
@@ -1,6 +1,24 @@
 from qmsk.net.lib.event2.base cimport *
 from qmsk.net.lib.event2.event cimport build_timeout
 
+class EventError (Exception) :
+    """
+        Base class of errors raised by lib.event2 code
+    """
+
+    pass
+
+class EventCallError (EventError) :
+    """
+        Some libevent function returned an error code.
+    """
+    
+    def __init__ (self, func, msg=None) :
+        super(EventCallError, self).__init__(func)
+
+        self.func = func
+        self.msg = msg
+
 cdef class event_base :
 
     def __init__ (self) :
@@ -9,7 +27,7 @@
         self.ev_base = lib.event_base_new()
 
         if self.ev_base == NULL :
-            raise Exception("event_base_new")
+            raise EventCallError("event_base_new")
 
     def reinit (self) :
         """
@@ -19,7 +37,7 @@
         """
 
         if lib.event_reinit(self.ev_base) < 0 :
-            raise Exception("event_reinit: could not re-add all events")
+            raise EventCallError("event_reinit", "could not re-add all events")
 
     property method :
         def __get__ (self) :
@@ -29,13 +47,14 @@
 
             return lib.event_base_get_method(self.ev_base)
 
-
     def loop (self, once = False, nonblock = False) :
         """
             Run the event loop.
 
                 once        - only run the event loop once, at most
                 nonblock    - do not block waiting for events
+
+            Returns True if succesfull, False if no events were registered
         """
 
         cdef int flags = 0
@@ -48,8 +67,16 @@
             flags |= lib.EVLOOP_NONBLOCK
 
         # event_base_loop()
-        if lib.event_base_loop(self.ev_base, flags) < 0 :
-            raise Exception("event_base_loop")
+        ret = lib.event_base_loop(self.ev_base, flags)
+
+        if ret < 0 :
+            raise EventCallError("event_base_loop")
+
+        elif ret > 0 :
+            return False
+
+        else :
+            return True
 
     def loopexit (self, timeout = None) :
         """
@@ -62,7 +89,7 @@
         cdef lib.timeval tv
 
         if lib.event_base_loopexit(self.ev_base, build_timeout(&tv, timeout)) < 0 :
-            raise Exception("event_base_loopexit")
+            raise EventCallError("event_base_loopexit")
 
     def loopbreak (self) :
         """
@@ -73,7 +100,7 @@
         """
 
         if lib.event_base_loopbreak(self.ev_base) < 0 :
-            raise Exception("event_base_loopbreak")
+            raise EventCallError("event_base_loopbreak")
 
     def __dealloc__ (self) :
         """