QueueScheduler: use timeout_add
authorZac Medico <zmedico@gentoo.org>
Wed, 8 Feb 2012 04:24:47 +0000 (20:24 -0800)
committerZac Medico <zmedico@gentoo.org>
Wed, 8 Feb 2012 04:24:47 +0000 (20:24 -0800)
pym/_emerge/QueueScheduler.py

index a4ab328e810c4adc135cec9fe41d029917e329d9..91a2831f637bf176f3cbb3bf3cce0eead6a3dc8d 100644 (file)
@@ -36,42 +36,25 @@ class QueueScheduler(PollScheduler):
 
        def run(self, timeout=None):
 
-               start_time = None
-               timed_out = False
-               remaining_timeout = timeout
+               timeout_id = None
                if timeout is not None:
-                       start_time = time.time()
-
-               while self._schedule():
-                       self._schedule_wait(timeout=remaining_timeout)
-                       if timeout is not None:
-                               elapsed_time = time.time() - start_time
-                               if elapsed_time < 0:
-                                       # The system clock has changed such that start_time
-                                       # is now in the future, so just assume that the
-                                       # timeout has already elapsed.
-                                       timed_out = True
-                                       break
-                               remaining_timeout = timeout - 1000 * elapsed_time
-                               if remaining_timeout <= 0:
-                                       timed_out = True
-                                       break
-
-               if timeout is None or not timed_out:
+                       def timeout_callback():
+                               raise StopIteration()
+                       timeout_id = self._timeout_add(timeout, timeout_callback)
+
+               try:
+
+                       while self._schedule():
+                               self._iteration()
+
                        while self._running_job_count():
-                               self._schedule_wait(timeout=remaining_timeout)
-                               if timeout is not None:
-                                       elapsed_time = time.time() - start_time
-                                       if elapsed_time < 0:
-                                               # The system clock has changed such that start_time
-                                               # is now in the future, so just assume that the
-                                               # timeout has already elapsed.
-                                               timed_out = True
-                                               break
-                                       remaining_timeout = timeout - 1000 * elapsed_time
-                                       if remaining_timeout <= 0:
-                                               timed_out = True
-                                               break
+                               self._iteration()
+
+               except StopIteration:
+                       pass
+
+               if timeout_id is not None:
+                       self._unregister(timeout_id)
 
        def _schedule_tasks(self):
                """