1 |
commit: 6823977b783a7205154af5f4234fe02982c62666 |
2 |
Author: Zac Medico <zmedico <AT> gentoo <DOT> org> |
3 |
AuthorDate: Thu Feb 9 04:04:09 2012 +0000 |
4 |
Commit: Zac Medico <zmedico <AT> gentoo <DOT> org> |
5 |
CommitDate: Thu Feb 9 04:04:09 2012 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=6823977b |
7 |
|
8 |
PollScheduler: remove _poll_loop |
9 |
|
10 |
We can use iteration() instead, and _poll_loop's exit behavior doesn't |
11 |
seem practical to emulate with glib.MainLoop. |
12 |
|
13 |
--- |
14 |
pym/_emerge/MetadataRegen.py | 9 ++++++--- |
15 |
pym/_emerge/PollScheduler.py | 24 ++---------------------- |
16 |
pym/_emerge/Scheduler.py | 13 +++++-------- |
17 |
3 files changed, 13 insertions(+), 33 deletions(-) |
18 |
|
19 |
diff --git a/pym/_emerge/MetadataRegen.py b/pym/_emerge/MetadataRegen.py |
20 |
index 07fd397..1ebc532 100644 |
21 |
--- a/pym/_emerge/MetadataRegen.py |
22 |
+++ b/pym/_emerge/MetadataRegen.py |
23 |
@@ -33,6 +33,7 @@ class MetadataRegen(PollScheduler): |
24 |
self.returncode = os.EX_OK |
25 |
self._error_count = 0 |
26 |
self._running_tasks = set() |
27 |
+ self._remaining_tasks = True |
28 |
|
29 |
def _terminate_tasks(self): |
30 |
while self._running_tasks: |
31 |
@@ -87,11 +88,12 @@ class MetadataRegen(PollScheduler): |
32 |
from portage.cache.cache_errors import CacheError |
33 |
dead_nodes = {} |
34 |
|
35 |
- while self._schedule(): |
36 |
- self.sched_iface.run() |
37 |
+ self._schedule() |
38 |
+ while self._remaining_tasks and not self._terminated_tasks: |
39 |
+ self.sched_iface.iteration() |
40 |
|
41 |
while self._jobs: |
42 |
- self.sched_iface.run() |
43 |
+ self.sched_iface.iteration() |
44 |
|
45 |
if self._terminated_tasks: |
46 |
self.returncode = 1 |
47 |
@@ -151,6 +153,7 @@ class MetadataRegen(PollScheduler): |
48 |
try: |
49 |
metadata_process = next(self._process_iter) |
50 |
except StopIteration: |
51 |
+ self._remaining_tasks = False |
52 |
return False |
53 |
|
54 |
self._jobs += 1 |
55 |
|
56 |
diff --git a/pym/_emerge/PollScheduler.py b/pym/_emerge/PollScheduler.py |
57 |
index ab65054..018188b 100644 |
58 |
--- a/pym/_emerge/PollScheduler.py |
59 |
+++ b/pym/_emerge/PollScheduler.py |
60 |
@@ -130,9 +130,8 @@ class EventLoop(object): |
61 |
|
62 |
def _next_poll_event(self, timeout=None): |
63 |
""" |
64 |
- Since the _schedule_wait() loop is called by event |
65 |
- handlers from _poll_loop(), maintain a central event |
66 |
- queue for both of them to share events from a single |
67 |
+ Since iteration() can be called recursively, maintain |
68 |
+ a central event queue to share events from a single |
69 |
poll() call. In order to avoid endless blocking, this |
70 |
raises StopIteration if timeout is None and there are |
71 |
no file descriptors to poll. |
72 |
@@ -143,24 +142,6 @@ class EventLoop(object): |
73 |
raise StopIteration() |
74 |
return self._poll_event_queue.pop() |
75 |
|
76 |
- def _poll_loop(self): |
77 |
- |
78 |
- event_handlers = self._poll_event_handlers |
79 |
- event_handled = False |
80 |
- |
81 |
- try: |
82 |
- while event_handlers: |
83 |
- f, event = self._next_poll_event() |
84 |
- x = event_handlers[f] |
85 |
- if not x.callback(f, event, *x.args): |
86 |
- self.source_remove(x.source_id) |
87 |
- event_handled = True |
88 |
- except StopIteration: |
89 |
- event_handled = True |
90 |
- |
91 |
- if not event_handled: |
92 |
- raise AssertionError("tight loop") |
93 |
- |
94 |
def iteration(self, *args): |
95 |
""" |
96 |
Like glib.MainContext.iteration(), runs a single iteration. |
97 |
@@ -376,7 +357,6 @@ class PollScheduler(object): |
98 |
iteration=self._event_loop.iteration, |
99 |
output=self._task_output, |
100 |
register=self._event_loop.io_add_watch, |
101 |
- run=self._event_loop._poll_loop, |
102 |
source_remove=self._event_loop.source_remove, |
103 |
timeout_add=self._event_loop.timeout_add, |
104 |
unregister=self._event_loop.source_remove) |
105 |
|
106 |
diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py |
107 |
index 6502f71..12f0871 100644 |
108 |
--- a/pym/_emerge/Scheduler.py |
109 |
+++ b/pym/_emerge/Scheduler.py |
110 |
@@ -222,7 +222,6 @@ class Scheduler(PollScheduler): |
111 |
io_add_watch=self._event_loop.io_add_watch, |
112 |
iteration=self._event_loop.iteration, |
113 |
register=self._event_loop.io_add_watch, |
114 |
- schedule=self._event_loop._poll_loop, |
115 |
scheduleSetup=self._schedule_setup, |
116 |
scheduleUnpack=self._schedule_unpack, |
117 |
source_remove=self._event_loop.source_remove, |
118 |
@@ -1492,14 +1491,12 @@ class Scheduler(PollScheduler): |
119 |
if self._opts_no_background.intersection(self.myopts): |
120 |
self._set_max_jobs(1) |
121 |
|
122 |
- while self._schedule(): |
123 |
- self.sched_iface.run() |
124 |
+ self._schedule() |
125 |
+ while self._keep_scheduling(): |
126 |
+ self.sched_iface.iteration() |
127 |
|
128 |
- while True: |
129 |
- self._schedule() |
130 |
- if not self._is_work_scheduled(): |
131 |
- break |
132 |
- self.sched_iface.run() |
133 |
+ while self._is_work_scheduled(): |
134 |
+ self.sched_iface.iteration() |
135 |
|
136 |
def _keep_scheduling(self): |
137 |
return bool(not self._terminated_tasks and self._pkg_queue and \ |