summaryrefslogtreecommitdiff
path: root/sleekxmpp/xmlstream/scheduler.py
diff options
context:
space:
mode:
authorLance Stout <lancestout@gmail.com>2012-07-27 10:45:52 -0700
committerLance Stout <lancestout@gmail.com>2012-07-27 10:45:52 -0700
commitc2189b4ecd6b022ed9900a6f411bd7e9d57c47ce (patch)
tree88b7dabe06edbbfeb45403c06628230c18301458 /sleekxmpp/xmlstream/scheduler.py
parentc9b2cf60431f415584c1d12a7855e0d2ac148ec4 (diff)
parente3fab66dfb27abdd8aa28a8d15367a490d4b42dd (diff)
downloadslixmpp-c2189b4ecd6b022ed9900a6f411bd7e9d57c47ce.tar.gz
slixmpp-c2189b4ecd6b022ed9900a6f411bd7e9d57c47ce.tar.bz2
slixmpp-c2189b4ecd6b022ed9900a6f411bd7e9d57c47ce.tar.xz
slixmpp-c2189b4ecd6b022ed9900a6f411bd7e9d57c47ce.zip
Merge branch 'master' into develop
Diffstat (limited to 'sleekxmpp/xmlstream/scheduler.py')
-rw-r--r--sleekxmpp/xmlstream/scheduler.py28
1 files changed, 17 insertions, 11 deletions
diff --git a/sleekxmpp/xmlstream/scheduler.py b/sleekxmpp/xmlstream/scheduler.py
index d98dc6c8..b3e50983 100644
--- a/sleekxmpp/xmlstream/scheduler.py
+++ b/sleekxmpp/xmlstream/scheduler.py
@@ -15,6 +15,7 @@
import time
import threading
import logging
+import itertools
from sleekxmpp.util import Queue, QueueEmpty
@@ -156,17 +157,23 @@ class Scheduler(object):
newtask = self.addq.get(True, 0.1)
elapsed += 0.1
except QueueEmpty:
- cleanup = []
self.schedule_lock.acquire()
- for task in self.schedule:
- if time.time() >= task.next:
- updated = True
- if not task.run():
- cleanup.append(task)
+ # select only those tasks which are to be executed now
+ relevant = itertools.takewhile(
+ lambda task: time.time() >= task.next, self.schedule)
+ # run the tasks and keep the return value in a tuple
+ status = map(lambda task: (task, task.run()), relevant)
+ # remove non-repeating tasks
+ for task, doRepeat in status:
+ if not doRepeat:
+ try:
+ self.schedule.remove(task)
+ except ValueError:
+ pass
else:
- break
- for task in cleanup:
- self.schedule.pop(self.schedule.index(task))
+ # only need to resort tasks if a repeated task has
+ # been kept in the list.
+ updated = True
else:
updated = True
self.schedule_lock.acquire()
@@ -174,8 +181,7 @@ class Scheduler(object):
self.schedule.append(newtask)
finally:
if updated:
- self.schedule = sorted(self.schedule,
- key=lambda task: task.next)
+ self.schedule.sort(key=lambda task: task.next)
self.schedule_lock.release()
except KeyboardInterrupt:
self.run = False