diff options
Diffstat (limited to 'meta/classes/package_deb.bbclass')
-rw-r--r-- | meta/classes/package_deb.bbclass | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/meta/classes/package_deb.bbclass b/meta/classes/package_deb.bbclass index 30605344f4..5d297939b6 100644 --- a/meta/classes/package_deb.bbclass +++ b/meta/classes/package_deb.bbclass @@ -41,7 +41,29 @@ def debian_arch_map(arch, tune): return arch python do_package_deb () { - from multiprocessing import Process + + import multiprocessing + import traceback + + class DebianWritePkgProcess(multiprocessing.Process): + def __init__(self, *args, **kwargs): + multiprocessing.Process.__init__(self, *args, **kwargs) + self._pconn, self._cconn = multiprocessing.Pipe() + self._exception = None + + def run(self): + try: + multiprocessing.Process.run(self) + self._cconn.send(None) + except Exception as e: + tb = traceback.format_exc() + self._cconn.send((e, tb)) + + @property + def exception(self): + if self._pconn.poll(): + self._exception = self._pconn.recv() + return self._exception oldcwd = os.getcwd() @@ -56,20 +78,28 @@ python do_package_deb () { max_process = int(d.getVar("BB_NUMBER_THREADS") or os.cpu_count() or 1) launched = [] + error = None pkgs = packages.split() - while pkgs: + while not error and pkgs: if len(launched) < max_process: - p = Process(target=deb_write_pkg, args=(pkgs.pop(), d)) + p = DebianWritePkgProcess(target=deb_write_pkg, args=(pkgs.pop(), d)) p.start() launched.append(p) for q in launched: # The finished processes are joined when calling is_alive() if not q.is_alive(): launched.remove(q) + if q.exception: + error, traceback = q.exception + break + for p in launched: p.join() os.chdir(oldcwd) + + if error: + raise error } do_package_deb[vardeps] += "deb_write_pkg" do_package_deb[vardepsexclude] = "BB_NUMBER_THREADS" |