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:12:19 -0700 |
commit | ca312327324fac20c1b4d8cb548789c6114e91d3 (patch) | |
tree | 236578c0f14c345698978e8f1cea3b0c718da6c4 /pym | |
parent | ccdce6f2f8026a7b2478c0dfd5d5e51aba22422e (diff) | |
download | portage-ca312327324fac20c1b4d8cb548789c6114e91d3.tar.gz portage-ca312327324fac20c1b4d8cb548789c6114e91d3.tar.bz2 portage-ca312327324fac20c1b4d8cb548789c6114e91d3.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.
Diffstat (limited to 'pym')
-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 |