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')
+__ALL__ = ('EventLoop', 'LoopInterruptedError')
+
+class LoopInterruptedError(RuntimeError):
+ r"""
+ LoopInterruptedError(select_error) -> LoopInterruptedError instance.
+
+ This class is raised when the event loop is interrupted in an unexpected
+ way. It wraps a select error, which can be accessed using the 'select_error'
+ attribute.
+ """
+
+ def __init__(self, select_error):
+ r"""Initialize the object.
+
+ See the class documentation for more info.
+ """
+ self.select_error = select_error
+
+ def __repr__(self):
+ r"repr(obj) -> Object representation."
+ return 'LoopInterruptedError(select_error=%r)' % self.select_error
+
+ def __str__(self):
+ r"str(obj) -> String representation."
+ return 'Loop interrupted: %s' % self.select_error
class EventLoop:
r"""EventLoop(file[, handler]) -> EventLoop instance
See EventLoop class documentation for more info.
"""
- self.poll = poll()
+ self.poll = select.poll()
self._stop = False
self.__register(file)
self.handler = handler
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: