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] |