Mercurial > bitten > bitten-test
changeset 375:79262e20b073
Protect the main beep loop from exceptions-- either problems in callbacks or errors in the asyncore handlers, which can stop the scheduled events from getting run. Also move over to using the asyncore.loop function over the poll function-- using poll as we were seeing use_poll=False (the default) hang forever, making scheduled events not get run.
author | wbell |
---|---|
date | Mon, 23 Jul 2007 22:03:07 +0000 |
parents | 446092a2d2fe |
children | 05c684ceb8c6 |
files | bitten/util/beep.py |
diffstat | 1 files changed, 22 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/bitten/util/beep.py +++ b/bitten/util/beep.py @@ -122,17 +122,28 @@ granularity = timedelta(seconds=granularity) socket_map = asyncore.socket_map last_event_check = datetime.min - while socket_map: - now = datetime.now() - if now - last_event_check >= granularity: - last_event_check = now - while self.eventqueue: - when, callback = heappop(self.eventqueue) - if now < when: - heappush(self.eventqueue, (when, callback)) - break - callback() - asyncore.poll(timeout) + try: + while socket_map: + now = datetime.now() + if now - last_event_check >= granularity: + last_event_check = now + while self.eventqueue: + when, callback = heappop(self.eventqueue) + if now < when: + heappush(self.eventqueue, (when, callback)) + log.debug('Checking done %d events.', len(self.eventqueue)) + break + try: + callback() + except: + log.error('Exception caught firing callback %s. Ignoring.', callback.__name__) + try: + asyncore.loop(timeout, True, None, 1) + except: + log.error('Exception caught in asyncore.loop, ignoring.'); + except: + log.error('Exception caught in run()'); + def schedule(self, delta, callback): """Schedule a function to be called.