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: Mon, 31 Dec 2012 01:05:35
Message-Id: 1356915867.a3100be184ba1cac2f672f0a1cadcf01690c6d3f.zmedico@gentoo
1 commit: a3100be184ba1cac2f672f0a1cadcf01690c6d3f
2 Author: Zac Medico <zmedico <AT> gentoo <DOT> org>
3 AuthorDate: Mon Dec 31 01:01:59 2012 +0000
4 Commit: Zac Medico <zmedico <AT> gentoo <DOT> org>
5 CommitDate: Mon Dec 31 01:04:27 2012 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=a3100be1
7
8 AsynchronousTask: add _async_wait method
9
10 For cases where _start returns synchronously, this method is a
11 convenient way to trigger an asynchronous call to self.wait()
12 (in order to notify exit listeners), avoiding excessive event
13 loop recursion (or stack overflow) that synchronous calling of
14 exit listeners can cause.
15
16 ---
17 pym/_emerge/AbstractEbuildProcess.py | 2 +-
18 pym/_emerge/AsynchronousLock.py | 2 +-
19 pym/_emerge/AsynchronousTask.py | 14 ++++++++++++++
20 pym/_emerge/BinpkgFetcher.py | 2 +-
21 pym/_emerge/BinpkgVerifier.py | 5 ++---
22 pym/_emerge/EbuildBuild.py | 4 ++--
23 pym/_emerge/EbuildFetcher.py | 6 +++---
24 pym/_emerge/EbuildMetadataPhase.py | 6 +++---
25 pym/_emerge/MergeListItem.py | 2 +-
26 pym/_emerge/PackageUninstall.py | 6 +++---
27 pym/_emerge/SpawnProcess.py | 2 +-
28 11 files changed, 32 insertions(+), 19 deletions(-)
29
30 diff --git a/pym/_emerge/AbstractEbuildProcess.py b/pym/_emerge/AbstractEbuildProcess.py
31 index 597208f..6d12cd9 100644
32 --- a/pym/_emerge/AbstractEbuildProcess.py
33 +++ b/pym/_emerge/AbstractEbuildProcess.py
34 @@ -56,7 +56,7 @@ class AbstractEbuildProcess(SpawnProcess):
35 (self.phase, self.settings['PORTAGE_BUILDDIR'])
36 self._eerror(textwrap.wrap(msg, 72))
37 self._set_returncode((self.pid, 1 << 8))
38 - self.wait()
39 + self._async_wait()
40 return
41
42 if self.background:
43
44 diff --git a/pym/_emerge/AsynchronousLock.py b/pym/_emerge/AsynchronousLock.py
45 index b4de779..5bb9663 100644
46 --- a/pym/_emerge/AsynchronousLock.py
47 +++ b/pym/_emerge/AsynchronousLock.py
48 @@ -49,7 +49,7 @@ class AsynchronousLock(AsynchronousTask):
49 pass
50 else:
51 self.returncode = os.EX_OK
52 - self.wait()
53 + self._async_wait()
54 return
55
56 if self._force_process or \
57
58 diff --git a/pym/_emerge/AsynchronousTask.py b/pym/_emerge/AsynchronousTask.py
59 index 7a193ce..b540575 100644
60 --- a/pym/_emerge/AsynchronousTask.py
61 +++ b/pym/_emerge/AsynchronousTask.py
62 @@ -60,6 +60,20 @@ class AsynchronousTask(SlotObject):
63 def _wait(self):
64 return self.returncode
65
66 + def _async_wait(self):
67 + """
68 + For cases where _start exits synchronously, this method is a
69 + convenient way to trigger an asynchronous call to self.wait()
70 + (in order to notify exit listeners), avoiding excessive event
71 + loop recursion (or stack overflow) that synchronous calling of
72 + exit listeners can cause.
73 + """
74 + self.scheduler.idle_add(self._async_wait_cb)
75 +
76 + def _async_wait_cb(self):
77 + self.wait()
78 + return False
79 +
80 def cancel(self):
81 """
82 Cancel the task, but do not wait for exit status. If asynchronous exit
83
84 diff --git a/pym/_emerge/BinpkgFetcher.py b/pym/_emerge/BinpkgFetcher.py
85 index 14f2552..099d3c4 100644
86 --- a/pym/_emerge/BinpkgFetcher.py
87 +++ b/pym/_emerge/BinpkgFetcher.py
88 @@ -63,7 +63,7 @@ class BinpkgFetcher(SpawnProcess):
89 if pretend:
90 portage.writemsg_stdout("\n%s\n" % uri, noiselevel=-1)
91 self._set_returncode((self.pid, os.EX_OK << 8))
92 - self.wait()
93 + self._async_wait()
94 return
95
96 protocol = urllib_parse_urlparse(uri)[0]
97
98 diff --git a/pym/_emerge/BinpkgVerifier.py b/pym/_emerge/BinpkgVerifier.py
99 index 0052967..fd4f266 100644
100 --- a/pym/_emerge/BinpkgVerifier.py
101 +++ b/pym/_emerge/BinpkgVerifier.py
102 @@ -1,4 +1,4 @@
103 -# Copyright 1999-2011 Gentoo Foundation
104 +# Copyright 1999-2012 Gentoo Foundation
105 # Distributed under the terms of the GNU General Public License v2
106
107 from _emerge.AsynchronousTask import AsynchronousTask
108 @@ -71,5 +71,4 @@ class BinpkgVerifier(AsynchronousTask):
109 background=self.background)
110
111 self.returncode = rval
112 - self.wait()
113 -
114 + self._async_wait()
115
116 diff --git a/pym/_emerge/EbuildBuild.py b/pym/_emerge/EbuildBuild.py
117 index cec63d9..599875a 100644
118 --- a/pym/_emerge/EbuildBuild.py
119 +++ b/pym/_emerge/EbuildBuild.py
120 @@ -35,7 +35,7 @@ class EbuildBuild(CompositeTask):
121 if rval != os.EX_OK:
122 self.returncode = rval
123 self._current_task = None
124 - self.wait()
125 + self._async_wait()
126 return
127
128 root_config = pkg.root_config
129 @@ -60,7 +60,7 @@ class EbuildBuild(CompositeTask):
130 if not self._check_manifest():
131 self.returncode = 1
132 self._current_task = None
133 - self.wait()
134 + self._async_wait()
135 return
136
137 prefetcher = self.prefetcher
138
139 diff --git a/pym/_emerge/EbuildFetcher.py b/pym/_emerge/EbuildFetcher.py
140 index 3cbe1b8..df790b0 100644
141 --- a/pym/_emerge/EbuildFetcher.py
142 +++ b/pym/_emerge/EbuildFetcher.py
143 @@ -117,13 +117,13 @@ class EbuildFetcher(ForkProcess):
144 msg_lines.append(msg)
145 self._eerror(msg_lines)
146 self._set_returncode((self.pid, 1 << 8))
147 - self.wait()
148 + self._async_wait()
149 return
150
151 if not uri_map:
152 # Nothing to fetch.
153 self._set_returncode((self.pid, os.EX_OK << 8))
154 - self.wait()
155 + self._async_wait()
156 return
157
158 settings = self.config_pool.allocate()
159 @@ -135,7 +135,7 @@ class EbuildFetcher(ForkProcess):
160 self._prefetch_size_ok(uri_map, settings, ebuild_path):
161 self.config_pool.deallocate(settings)
162 self._set_returncode((self.pid, os.EX_OK << 8))
163 - self.wait()
164 + self._async_wait()
165 return
166
167 nocolor = settings.get("NOCOLOR")
168
169 diff --git a/pym/_emerge/EbuildMetadataPhase.py b/pym/_emerge/EbuildMetadataPhase.py
170 index cc8d775..89734e0 100644
171 --- a/pym/_emerge/EbuildMetadataPhase.py
172 +++ b/pym/_emerge/EbuildMetadataPhase.py
173 @@ -51,14 +51,14 @@ class EbuildMetadataPhase(SubProcess):
174 # An empty EAPI setting is invalid.
175 self._eapi_invalid(None)
176 self._set_returncode((self.pid, 1 << 8))
177 - self.wait()
178 + self._async_wait()
179 return
180
181 self.eapi_supported = portage.eapi_is_supported(parsed_eapi)
182 if not self.eapi_supported:
183 self.metadata = {"EAPI": parsed_eapi}
184 self._set_returncode((self.pid, os.EX_OK << 8))
185 - self.wait()
186 + self._async_wait()
187 return
188
189 settings = self.settings
190 @@ -114,7 +114,7 @@ class EbuildMetadataPhase(SubProcess):
191 # doebuild failed before spawning
192 self._unregister()
193 self._set_returncode((self.pid, retval << 8))
194 - self.wait()
195 + self._async_wait()
196 return
197
198 self.pid = retval[0]
199
200 diff --git a/pym/_emerge/MergeListItem.py b/pym/_emerge/MergeListItem.py
201 index 371e2e2..172dfcc 100644
202 --- a/pym/_emerge/MergeListItem.py
203 +++ b/pym/_emerge/MergeListItem.py
204 @@ -32,7 +32,7 @@ class MergeListItem(CompositeTask):
205 if pkg.installed:
206 # uninstall, executed by self.merge()
207 self.returncode = os.EX_OK
208 - self.wait()
209 + self._async_wait()
210 return
211
212 args_set = self.args_set
213
214 diff --git a/pym/_emerge/PackageUninstall.py b/pym/_emerge/PackageUninstall.py
215 index eb6a947..16c2f74 100644
216 --- a/pym/_emerge/PackageUninstall.py
217 +++ b/pym/_emerge/PackageUninstall.py
218 @@ -1,4 +1,4 @@
219 -# Copyright 1999-2011 Gentoo Foundation
220 +# Copyright 1999-2012 Gentoo Foundation
221 # Distributed under the terms of the GNU General Public License v2
222
223 import logging
224 @@ -33,7 +33,7 @@ class PackageUninstall(CompositeTask):
225 # Apparently the package got uninstalled
226 # already, so we can safely return early.
227 self.returncode = os.EX_OK
228 - self.wait()
229 + self._async_wait()
230 return
231
232 self.settings.setcpv(self.pkg)
233 @@ -67,7 +67,7 @@ class PackageUninstall(CompositeTask):
234 if retval != os.EX_OK:
235 self._builddir_lock.unlock()
236 self.returncode = retval
237 - self.wait()
238 + self._async_wait()
239 return
240
241 self._writemsg_level(">>> Unmerging %s...\n" % (self.pkg.cpv,),
242
243 diff --git a/pym/_emerge/SpawnProcess.py b/pym/_emerge/SpawnProcess.py
244 index 45d7095..2045b2e 100644
245 --- a/pym/_emerge/SpawnProcess.py
246 +++ b/pym/_emerge/SpawnProcess.py
247 @@ -96,7 +96,7 @@ class SpawnProcess(SubProcess):
248 # spawn failed
249 self._unregister()
250 self._set_returncode((self.pid, retval))
251 - self.wait()
252 + self._async_wait()
253 return
254
255 self.pid = retval[0]