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:05:07 -0700
commite8fc5d66e57a8a84214fec16610c6a44804e219a (patch)
tree809a4510b57e8de5e5a684c8b30c392fac2d2127
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.
-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