summaryrefslogtreecommitdiffstats
path: root/pym/_emerge/SequentialTaskQueue.py
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2012-02-13 18:35:03 -0800
committerZac Medico <zmedico@gentoo.org>2012-02-13 18:35:03 -0800
commit07823ba56f63309da9547e02e96b043005932be0 (patch)
treeecdfa774f9def6fb215b5c89e77312f131b14764 /pym/_emerge/SequentialTaskQueue.py
parent6afd0e508eaf1f9040a20ed670cd6cf7a3a07517 (diff)
downloadportage-07823ba56f63309da9547e02e96b043005932be0.tar.gz
portage-07823ba56f63309da9547e02e96b043005932be0.tar.bz2
portage-07823ba56f63309da9547e02e96b043005932be0.zip
AsynchronousTask: don't wait for exit status
Synchronous waiting for status is not supported, since it would be vulnerable to hitting the recursion limit when a large number of tasks need to be terminated simultaneously, like in bug #402335.
Diffstat (limited to 'pym/_emerge/SequentialTaskQueue.py')
-rw-r--r--pym/_emerge/SequentialTaskQueue.py15
1 files changed, 11 insertions, 4 deletions
diff --git a/pym/_emerge/SequentialTaskQueue.py b/pym/_emerge/SequentialTaskQueue.py
index 3cd56d2d6..ebff430e3 100644
--- a/pym/_emerge/SequentialTaskQueue.py
+++ b/pym/_emerge/SequentialTaskQueue.py
@@ -55,13 +55,20 @@ class SequentialTaskQueue(SlotObject):
self.schedule()
def clear(self):
+ """
+ Clear the task queue and asynchronously terminate any running tasks.
+ """
self._task_queue.clear()
- running_tasks = self.running_tasks
- while running_tasks:
- task = running_tasks.pop()
- task.removeExitListener(self._task_exit)
+ for task in list(self.running_tasks):
task.cancel()
+ def wait(self):
+ """
+ Synchronously wait for all running tasks to exit.
+ """
+ while self.running_tasks:
+ next(iter(self.running_tasks)).wait()
+
def __bool__(self):
return bool(self._task_queue or self.running_tasks)