PollScheduler: call _terminate_tasks in _schedule
authorZac Medico <zmedico@gentoo.org>
Fri, 11 Mar 2011 05:21:19 +0000 (21:21 -0800)
committerZac Medico <zmedico@gentoo.org>
Mon, 14 Mar 2011 16:23:47 +0000 (09:23 -0700)
This prevents it from being called while the _schedule_tasks()
implementation is running, in order to avoid potential interference.

pym/_emerge/PollScheduler.py

index a319066c0f611ad8270b48fa9aa55818ceba5044..94fd92407c41d5ef6076c4addfbbca38f5b5183b 100644 (file)
@@ -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: