X-Git-Url: https://git.llucax.com/software/pymin.git/blobdiff_plain/026f5f3a6274709b7863c619c979dd32f0ee686f..70ec9c970b451ee166087a3327a6b906a4777500:/eventloop.py diff --git a/eventloop.py b/eventloop.py index 7da492d..06922a7 100644 --- a/eventloop.py +++ b/eventloop.py @@ -6,9 +6,34 @@ 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') +__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 @@ -53,7 +78,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 +126,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: