diff options
author | Zac Medico <zmedico@gentoo.org> | 2011-03-18 14:05:07 -0700 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2011-03-18 14:05:07 -0700 |
commit | e8fc5d66e57a8a84214fec16610c6a44804e219a (patch) | |
tree | 809a4510b57e8de5e5a684c8b30c392fac2d2127 | |
parent | 09c9eaf22ac7453ef8a6067711e27a7756dd3d92 (diff) | |
download | portage-e8fc5d66e57a8a84214fec16610c6a44804e219a.tar.gz portage-e8fc5d66e57a8a84214fec16610c6a44804e219a.tar.bz2 portage-e8fc5d66e57a8a84214fec16610c6a44804e219a.zip |
CompositeTask: fix _wait for TASK_QUEUED
Though this case might never have been triggered, the logic was broken
for cases in which self.cancelled was false and a task was queued. In
this case we need to call back into the scheduler until the queued task
is started or we are cancelled, whichever comes first.
-rw-r--r-- | pym/_emerge/CompositeTask.py | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/pym/_emerge/CompositeTask.py b/pym/_emerge/CompositeTask.py index edc0768d7..644a69bb2 100644 --- a/pym/_emerge/CompositeTask.py +++ b/pym/_emerge/CompositeTask.py @@ -55,9 +55,21 @@ class CompositeTask(AsynchronousTask): # don't wait for the same task more than once break if task is self._TASK_QUEUED: - self.returncode = 1 - self._current_task = None - break + if self.cancelled: + self.returncode = 1 + self._current_task = None + break + else: + self.scheduler.schedule(condition=self._task_queued_wait) + if self.returncode is not None: + break + elif self.cancelled: + self.returncode = 1 + self._current_task = None + break + else: + # try this again with new _current_task value + continue if task is prev: if self.returncode is not None: # This is expected if we're being @@ -139,3 +151,7 @@ class CompositeTask(AsynchronousTask): def _task_queued_start_handler(self, task): self._current_task = task + + def _task_queued_wait(self): + return self._current_task is not self._TASK_QUEUED or \ + self.cancelled or self.returncode is not None |