From bcb3ead57e5f207652f506a13604f60dbebf047b Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Thu, 10 Mar 2011 21:21:19 -0800 Subject: 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. --- pym/_emerge/PollScheduler.py | 18 +++++++++++------- 1 file 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: -- cgit v1.2.3-1-g7c22