Gentoo Archives: gentoo-commits

From: Zac Medico <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/portage:master commit in: pym/_emerge/
Date: Thu, 09 Feb 2012 04:04:49
Message-Id: 6823977b783a7205154af5f4234fe02982c62666.zmedico@gentoo
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 \