summaryrefslogtreecommitdiffstats
path: root/pym/_emerge/Scheduler.py
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2012-02-07 11:40:55 -0800
committerZac Medico <zmedico@gentoo.org>2012-02-07 15:23:59 -0800
commita3162633773ce5efd3b1cc459df147c93877d953 (patch)
tree741c30f96144661757b2473b8bd1e336ebd97233 /pym/_emerge/Scheduler.py
parent445a6ea22c132f4c06c2cc7c48ec6e7af7116962 (diff)
downloadportage-a3162633773ce5efd3b1cc459df147c93877d953.tar.gz
portage-a3162633773ce5efd3b1cc459df147c93877d953.tar.bz2
portage-a3162633773ce5efd3b1cc459df147c93877d953.zip
PollScheduler: timeouts regardless of IO events
Now PollScheduler will execute timeouts predictably, even when there no IO events being generated. This allows the Scheduler's display updates to be handled via timeout_add.
Diffstat (limited to 'pym/_emerge/Scheduler.py')
-rw-r--r--pym/_emerge/Scheduler.py46
1 files changed, 3 insertions, 43 deletions
diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py
index 5b56650f3..e6f3e0e5c 100644
--- a/pym/_emerge/Scheduler.py
+++ b/pym/_emerge/Scheduler.py
@@ -196,6 +196,8 @@ class Scheduler(PollScheduler):
self._status_display = JobStatusDisplay(
xterm_titles=('notitles' not in settings.features))
+ self._timeout_add(self._max_display_latency,
+ self._status_display.display)
self._max_load = myopts.get("--load-average")
max_jobs = myopts.get("--jobs")
if max_jobs is None:
@@ -352,50 +354,8 @@ class Scheduler(PollScheduler):
gc.collect()
def _poll(self, timeout=None):
-
self._schedule()
-
- if timeout is None:
- while True:
- if not self._poll_event_handlers:
- self._schedule()
- if not self._poll_event_handlers:
- raise StopIteration(
- "timeout is None and there are no poll() event handlers")
- previous_count = len(self._poll_event_queue)
- PollScheduler._poll(self, timeout=self._max_display_latency)
- self._status_display.display()
- if previous_count != len(self._poll_event_queue):
- break
-
- elif timeout <= self._max_display_latency:
- PollScheduler._poll(self, timeout=timeout)
- if timeout == 0:
- # The display is updated by _schedule() above, so it would be
- # redundant to update it here when timeout is 0.
- pass
- else:
- self._status_display.display()
-
- else:
- remaining_timeout = timeout
- start_time = time.time()
- while True:
- previous_count = len(self._poll_event_queue)
- PollScheduler._poll(self,
- timeout=min(self._max_display_latency, remaining_timeout))
- self._status_display.display()
- if previous_count != len(self._poll_event_queue):
- break
- 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.
- break
- remaining_timeout = timeout - 1000 * elapsed_time
- if remaining_timeout <= 0:
- break
+ PollScheduler._poll(self, timeout=timeout)
def _set_max_jobs(self, max_jobs):
self._max_jobs = max_jobs