From: Zac Medico Date: Fri, 11 Mar 2011 05:21:19 +0000 (-0800) Subject: PollScheduler: call _terminate_tasks in _schedule X-Git-Tag: v2.2.0_alpha27~5 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=33946e6594e16d1c8ff493cf71b8587878ec7b29;p=portage.git 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. --- 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: