diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2021-11-22 10:24:48 +0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2021-11-24 10:08:28 +0000 |
commit | e1b119ca21584fea5ba7076d9027d9154b6cbc4f (patch) | |
tree | 4c3f25d44c7c368ef62ab5b29caed5acaa856c70 /bitbake | |
parent | ad2459fc1d4f640ab298d0eba1b4efa88970edb4 (diff) | |
download | poky-e1b119ca21584fea5ba7076d9027d9154b6cbc4f.tar.gz |
bitbake: cooker: Handle parsing results queue race
The previous fix introduced a race where the queue might not be empty
but all the parser processes have exited. Handle this correctly to avoid
occasional errors.
(Bitbake rev: 4a06b2fa37648204cab41a5cbfb6fa217aa32686)
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
(cherry picked from commit 8e7f2b6500e26610f52d128b48ca0a09bf6fb2cb)
Signed-off-by: Anuj Mittal <anuj.mittal@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake')
-rw-r--r-- | bitbake/lib/bb/cooker.py | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index c952c57483..e2a5dc43a9 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py | |||
@@ -2214,24 +2214,28 @@ class CookerParser(object): | |||
2214 | yield not cached, mc, infos | 2214 | yield not cached, mc, infos |
2215 | 2215 | ||
2216 | def parse_generator(self): | 2216 | def parse_generator(self): |
2217 | while self.processes: | 2217 | empty = False |
2218 | while self.processes or not empty: | ||
2219 | for process in self.processes.copy(): | ||
2220 | if not process.is_alive(): | ||
2221 | process.join() | ||
2222 | self.processes.remove(process) | ||
2223 | |||
2218 | if self.parsed >= self.toparse: | 2224 | if self.parsed >= self.toparse: |
2219 | break | 2225 | break |
2220 | 2226 | ||
2221 | try: | 2227 | try: |
2222 | result = self.result_queue.get(timeout=0.25) | 2228 | result = self.result_queue.get(timeout=0.25) |
2223 | except queue.Empty: | 2229 | except queue.Empty: |
2230 | empty = True | ||
2224 | pass | 2231 | pass |
2225 | else: | 2232 | else: |
2233 | empty = False | ||
2226 | value = result[1] | 2234 | value = result[1] |
2227 | if isinstance(value, BaseException): | 2235 | if isinstance(value, BaseException): |
2228 | raise value | 2236 | raise value |
2229 | else: | 2237 | else: |
2230 | yield result | 2238 | yield result |
2231 | for process in self.processes.copy(): | ||
2232 | if not process.is_alive(): | ||
2233 | process.join() | ||
2234 | self.processes.remove(process) | ||
2235 | 2239 | ||
2236 | if not (self.parsed >= self.toparse): | 2240 | if not (self.parsed >= self.toparse): |
2237 | raise bb.parse.ParseError("Not all recipes parsed, parser thread killed/died? Exiting.", None) | 2241 | raise bb.parse.ParseError("Not all recipes parsed, parser thread killed/died? Exiting.", None) |