diff options
Diffstat (limited to 'meta/classes/package_ipk.bbclass')
-rw-r--r-- | meta/classes/package_ipk.bbclass | 51 |
1 files changed, 1 insertions, 50 deletions
diff --git a/meta/classes/package_ipk.bbclass b/meta/classes/package_ipk.bbclass index a0b34fa7a5..5eb910ca31 100644 --- a/meta/classes/package_ipk.bbclass +++ b/meta/classes/package_ipk.bbclass | |||
@@ -17,32 +17,6 @@ OPKG_ARGS += "${@['', '--add-exclude ' + ' --add-exclude '.join((d.getVar('PACKA | |||
17 | OPKGLIBDIR = "${localstatedir}/lib" | 17 | OPKGLIBDIR = "${localstatedir}/lib" |
18 | 18 | ||
19 | python do_package_ipk () { | 19 | python do_package_ipk () { |
20 | import multiprocessing | ||
21 | import traceback | ||
22 | |||
23 | class IPKWritePkgProcess(multiprocessing.Process): | ||
24 | def __init__(self, *args, **kwargs): | ||
25 | multiprocessing.Process.__init__(self, *args, **kwargs) | ||
26 | self._pconn, self._cconn = multiprocessing.Pipe() | ||
27 | self._exception = None | ||
28 | |||
29 | def run(self): | ||
30 | try: | ||
31 | multiprocessing.Process.run(self) | ||
32 | self._cconn.send(None) | ||
33 | except Exception as e: | ||
34 | tb = traceback.format_exc() | ||
35 | self._cconn.send((e, tb)) | ||
36 | |||
37 | @property | ||
38 | def exception(self): | ||
39 | if self._pconn.poll(): | ||
40 | self._exception = self._pconn.recv() | ||
41 | return self._exception | ||
42 | |||
43 | |||
44 | oldcwd = os.getcwd() | ||
45 | |||
46 | workdir = d.getVar('WORKDIR') | 20 | workdir = d.getVar('WORKDIR') |
47 | outdir = d.getVar('PKGWRITEDIRIPK') | 21 | outdir = d.getVar('PKGWRITEDIRIPK') |
48 | tmpdir = d.getVar('TMPDIR') | 22 | tmpdir = d.getVar('TMPDIR') |
@@ -61,30 +35,7 @@ python do_package_ipk () { | |||
61 | if os.access(os.path.join(tmpdir, "stamps", "IPK_PACKAGE_INDEX_CLEAN"), os.R_OK): | 35 | if os.access(os.path.join(tmpdir, "stamps", "IPK_PACKAGE_INDEX_CLEAN"), os.R_OK): |
62 | os.unlink(os.path.join(tmpdir, "stamps", "IPK_PACKAGE_INDEX_CLEAN")) | 36 | os.unlink(os.path.join(tmpdir, "stamps", "IPK_PACKAGE_INDEX_CLEAN")) |
63 | 37 | ||
64 | max_process = int(d.getVar("BB_NUMBER_THREADS") or os.cpu_count() or 1) | 38 | oe.utils.multiprocess_launch(ipk_write_pkg, packages.split(), d, extraargs=(d,)) |
65 | launched = [] | ||
66 | error = None | ||
67 | pkgs = packages.split() | ||
68 | while not error and pkgs: | ||
69 | if len(launched) < max_process: | ||
70 | p = IPKWritePkgProcess(target=ipk_write_pkg, args=(pkgs.pop(), d)) | ||
71 | p.start() | ||
72 | launched.append(p) | ||
73 | for q in launched: | ||
74 | # The finished processes are joined when calling is_alive() | ||
75 | if not q.is_alive(): | ||
76 | launched.remove(q) | ||
77 | if q.exception: | ||
78 | error, traceback = q.exception | ||
79 | break | ||
80 | |||
81 | for p in launched: | ||
82 | p.join() | ||
83 | |||
84 | os.chdir(oldcwd) | ||
85 | |||
86 | if error: | ||
87 | raise error | ||
88 | } | 39 | } |
89 | do_package_ipk[vardeps] += "ipk_write_pkg" | 40 | do_package_ipk[vardeps] += "ipk_write_pkg" |
90 | do_package_ipk[vardepsexclude] = "BB_NUMBER_THREADS" | 41 | do_package_ipk[vardepsexclude] = "BB_NUMBER_THREADS" |