diff options
author | Zac Medico <zmedico@gentoo.org> | 2012-02-13 18:35:03 -0800 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2012-02-13 18:35:03 -0800 |
commit | 07823ba56f63309da9547e02e96b043005932be0 (patch) | |
tree | ecdfa774f9def6fb215b5c89e77312f131b14764 /pym/_emerge/SequentialTaskQueue.py | |
parent | 6afd0e508eaf1f9040a20ed670cd6cf7a3a07517 (diff) | |
download | portage-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.py | 15 |
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) |