diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2021-11-10 11:29:50 +0000 |
---|---|---|
committer | Anuj Mittal <anuj.mittal@intel.com> | 2021-11-16 13:13:01 +0800 |
commit | 8eaddb92a5fd14de6b5995aa92a6eed03b90a252 (patch) | |
tree | 5fc9b4fbff63b976ce29ea8974a21eeaafb61443 | |
parent | ae1bfbf9523e8f6155bb43ee3adba17af3ec9630 (diff) | |
download | bitbake-8eaddb92a5fd14de6b5995aa92a6eed03b90a252.tar.gz |
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.
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
(cherry picked from commit 8e7f2b6500e26610f52d128b48ca0a09bf6fb2cb)
Signed-off-by: Anuj Mittal <anuj.mittal@intel.com>
-rw-r--r-- | lib/bb/cooker.py | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/lib/bb/cooker.py b/lib/bb/cooker.py index 9be6603f3..c032762f8 100644 --- a/lib/bb/cooker.py +++ b/lib/bb/cooker.py @@ -2218,24 +2218,28 @@ class CookerParser(object): yield not cached, mc, infos def parse_generator(self): - while self.processes: + empty = False + while self.processes or not empty: + for process in self.processes.copy(): + if not process.is_alive(): + process.join() + self.processes.remove(process) + if self.parsed >= self.toparse: break try: result = self.result_queue.get(timeout=0.25) except queue.Empty: + empty = True pass else: + empty = False value = result[1] if isinstance(value, BaseException): raise value else: yield result - for process in self.processes.copy(): - if not process.is_alive(): - process.join() - self.processes.remove(process) if not (self.parsed >= self.toparse): raise bb.parse.ParseError("Not all recipes parsed, parser thread killed/died? Exiting.", None) |