diff options
author | Zac Medico <zmedico@gentoo.org> | 2010-10-23 16:08:41 -0700 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2010-10-27 07:35:33 -0700 |
commit | 1383371aa816f96f930b52e3685e0afe5f0e566f (patch) | |
tree | 9d234e4c6d2169c60b0e89ab68acd01f3625259e | |
parent | 10c63440bba359bf91d69c2b9ce7a4e9e92e6c22 (diff) | |
download | portage-1383371aa816f96f930b52e3685e0afe5f0e566f.tar.gz portage-1383371aa816f96f930b52e3685e0afe5f0e566f.tar.bz2 portage-1383371aa816f96f930b52e3685e0afe5f0e566f.zip |
Scheduler: ensure display update every 3 seconds
-rw-r--r-- | pym/_emerge/Scheduler.py | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py index 565fe48ca..33e3379fb 100644 --- a/pym/_emerge/Scheduler.py +++ b/pym/_emerge/Scheduler.py @@ -62,6 +62,9 @@ if sys.hexversion >= 0x3000000: class Scheduler(PollScheduler): + # max time between display status updates (milliseconds) + _max_display_latency = 3000 + _opts_ignore_blockers = \ frozenset(["--buildpkgonly", "--fetchonly", "--fetch-all-uri", @@ -317,8 +320,40 @@ class Scheduler(PollScheduler): gc.collect() def _poll(self, timeout=None): + self._schedule() - PollScheduler._poll(self, timeout=timeout) + + if timeout is None: + while True: + 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) + 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 def _set_max_jobs(self, max_jobs): self._max_jobs = max_jobs |