summaryrefslogtreecommitdiffstats
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
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.
-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