summaryrefslogtreecommitdiffstats
path: root/pym/_emerge/CompositeTask.py
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:05:07 -0700
commite8fc5d66e57a8a84214fec16610c6a44804e219a (patch)
tree809a4510b57e8de5e5a684c8b30c392fac2d2127 /pym/_emerge/CompositeTask.py
parent09c9eaf22ac7453ef8a6067711e27a7756dd3d92 (diff)
downloadportage-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.
Diffstat (limited to 'pym/_emerge/CompositeTask.py')
-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