diff options
author | Zac Medico <zmedico@gentoo.org> | 2012-02-07 11:40:55 -0800 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2012-02-07 15:23:59 -0800 |
commit | a3162633773ce5efd3b1cc459df147c93877d953 (patch) | |
tree | 741c30f96144661757b2473b8bd1e336ebd97233 /pym/_emerge/Scheduler.py | |
parent | 445a6ea22c132f4c06c2cc7c48ec6e7af7116962 (diff) | |
download | portage-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.py | 46 |
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 |