aboutsummaryrefslogtreecommitdiff
path: root/pym
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2012-02-09 01:12:40 -0800
committerZac Medico <zmedico@gentoo.org>2012-02-09 01:12:40 -0800
commit7a6c34cc6bd6eb20a97e05347f87a0157f4ae58a (patch)
treed392511c57319c79f8e5d60c0a399b1ed80e2cd5 /pym
parentQueueScheduler: fix for IpcDaemonTestCase (diff)
downloadportage-7a6c34cc6bd6eb20a97e05347f87a0157f4ae58a.tar.gz
portage-7a6c34cc6bd6eb20a97e05347f87a0157f4ae58a.tar.bz2
portage-7a6c34cc6bd6eb20a97e05347f87a0157f4ae58a.zip
AsynchronousTask: exit listeners reverse order
This should fix a Scheduler hang which is triggered when that merge queue, a SequentialTaskQueue, doesn't decrement its merge count until after other exit listeners have already run.
Diffstat (limited to 'pym')
-rw-r--r--pym/_emerge/AsynchronousTask.py6
1 files changed, 5 insertions, 1 deletions
diff --git a/pym/_emerge/AsynchronousTask.py b/pym/_emerge/AsynchronousTask.py
index 4aa598085..d57ccab2b 100644
--- a/pym/_emerge/AsynchronousTask.py
+++ b/pym/_emerge/AsynchronousTask.py
@@ -129,7 +129,11 @@ class AsynchronousTask(SlotObject):
self._exit_listener_stack = self._exit_listeners
self._exit_listeners = None
- self._exit_listener_stack.reverse()
+ # Execute exit listeners in reverse order, so that
+ # the last added listener is executed first. This
+ # allows SequentialTaskQueue to decrement its running
+ # task count as soon as one of its tasks exits, so that
+ # the value is accurate when other listeners execute.
while self._exit_listener_stack:
self._exit_listener_stack.pop()(self)