]> git.llucax.com Git - software/pymin.git/commitdiff
Add a LoopInterruptedError to the EventLoop.
authorLeandro Lucarella <llucarella@integratech.com.ar>
Mon, 24 Sep 2007 16:51:02 +0000 (13:51 -0300)
committerLeandro Lucarella <llucarella@integratech.com.ar>
Mon, 24 Sep 2007 16:51:02 +0000 (13:51 -0300)
This error is raised as a translation for the select.error, raised when
the system call is interrupted by a signal, so EventLoop users don't have
to know the details about the loop.

eventloop.py
pymindaemon.py

index 7da492db90de7387c1fae3c48d962d2648a69df2..acc370ab03b439730d3eb242d50d6985dc13b349 100644 (file)
@@ -6,10 +6,19 @@ A simple event loop.
 Please see EventLoop class documentation for more info.
 """
 
-from select import poll, POLLIN, POLLPRI, POLLERR
+import select
+from select import POLLIN, POLLPRI, POLLERR
 
 __ALL__ = ('EventLoop')
 
+class LoopInterruptedError(RuntimeError):
+    def __init__(self, select_error):
+        self.select_error = select_error
+    def __repr__(self):
+        return 'LoopInterruptedError(select_error=%r)' % self.select_error
+    def __str__(self):
+        return 'Loop interrupted: %s' % self.select_error
+
 class EventLoop:
     r"""EventLoop(file[, handler]) -> EventLoop instance
 
@@ -53,7 +62,7 @@ class EventLoop:
 
         See EventLoop class documentation for more info.
         """
-        self.poll = poll()
+        self.poll = select.poll()
         self._stop = False
         self.__register(file)
         self.handler = handler
@@ -101,7 +110,10 @@ class EventLoop:
         then only 1 event is processed and then this method returns.
         """
         while True:
-            res = self.poll.poll()
+            try:
+                res = self.poll.poll()
+            except select.error, e:
+                raise LoopInterruptedError(e)
             if self.handler is not None:
                 self.handler(self)
             else:
index 1868ae245305d74b5554478e0baa0833a1d7cd3e..b7c64e4104bbe8a2376ae315910a8e7df5c4f055 100644 (file)
@@ -11,7 +11,7 @@ command-line.
 import signal
 import socket
 from dispatcher import Dispatcher
-from eventloop import EventLoop
+from eventloop import EventLoop, LoopInterruptedError
 
 class PyminDaemon(EventLoop):
     r"""PyminDaemon(bind_addr, routes) -> PyminDaemon instance
@@ -68,7 +68,10 @@ class PyminDaemon(EventLoop):
 
     def run(self):
         r"run() -> None :: Run the event loop (shortcut to loop())"
-        return self.loop()
+        try:
+            return self.loop()
+        except LoopInterruptedError, e:
+            pass
 
 if __name__ == '__main__':