summaryrefslogtreecommitdiffstats
path: root/pym
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2011-03-18 14:05:07 -0700
committerZac Medico <zmedico@gentoo.org>2011-03-18 14:12:19 -0700
commitca312327324fac20c1b4d8cb548789c6114e91d3 (patch)
tree236578c0f14c345698978e8f1cea3b0c718da6c4 /pym
parentccdce6f2f8026a7b2478c0dfd5d5e51aba22422e (diff)
downloadportage-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.py22
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