aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2011-03-10 21:21:19 -0800
committerZac Medico <zmedico@gentoo.org>2011-03-10 21:21:19 -0800
commit33946e6594e16d1c8ff493cf71b8587878ec7b29 (patch)
tree4a032d02760d7530d97c5d72067f3175253de891 /pym/_emerge/PollScheduler.py
parentScheduler: avoid infinite loop after CTRL-C (diff)
downloadportage-33946e6594e16d1c8ff493cf71b8587878ec7b29.tar.gz
portage-33946e6594e16d1c8ff493cf71b8587878ec7b29.tar.bz2
portage-33946e6594e16d1c8ff493cf71b8587878ec7b29.zip
PollScheduler: call _terminate_tasks in _schedule
This prevents it from being called while the _schedule_tasks() implementation is running, in order to avoid potential interference.
Diffstat (limited to 'pym/_emerge/PollScheduler.py')
-rw-r--r--pym/_emerge/PollScheduler.py18
1 files changed, 11 insertions, 7 deletions
diff --git a/pym/_emerge/PollScheduler.py b/pym/_emerge/PollScheduler.py
index a319066c0..94fd92407 100644
--- a/pym/_emerge/PollScheduler.py
+++ b/pym/_emerge/PollScheduler.py
@@ -57,9 +57,11 @@ class PollScheduler(object):
def _terminate_tasks(self):
"""
Send signals to terminate all tasks. This is called once
- from the event dispatching thread. All task should be
- cleaned up at the earliest opportunity, but not necessarily
- before this method returns.
+ from self._schedule() in the event dispatching thread. This
+ prevents it from being called while the _schedule_tasks()
+ implementation is running, in order to avoid potential
+ interference. All tasks should be cleaned up at the earliest
+ opportunity, but not necessarily before this method returns.
"""
raise NotImplementedError()
@@ -74,6 +76,12 @@ class PollScheduler(object):
return False
self._scheduling = True
try:
+
+ if self._terminated.is_set() and \
+ not self._terminated_tasks:
+ self._terminated_tasks = True
+ self._terminate_tasks()
+
return self._schedule_tasks()
finally:
self._scheduling = False
@@ -145,10 +153,6 @@ class PollScheduler(object):
raises StopIteration if timeout is None and there are
no file descriptors to poll.
"""
- if self._terminated.is_set() and \
- not self._terminated_tasks:
- self._terminated_tasks = True
- self._terminate_tasks()
if not self._poll_event_queue:
self._poll(timeout)
if not self._poll_event_queue: