summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2017-03-30 22:02:45 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2017-06-22 09:16:00 +0100
commit1b489073dcf1e0836f7f2db8cb171debeb7a02e7 (patch)
treea0f4d93315d65bca27ed89271796d4581199aef6
parentd28f9b0c8636f27065c3261caa7a9c48a503460d (diff)
downloadpoky-1b489073dcf1e0836f7f2db8cb171debeb7a02e7.tar.gz
package_ipk: Parallelise ipk creation
Allow the creation of ipks to happen in parallel, making best use of resources on multiprocessor systems. (From OE-Core rev: 07f6c0b464f0671bc39116317138e4ddf27bdae9) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/classes/package_ipk.bbclass20
1 files changed, 18 insertions, 2 deletions
diff --git a/meta/classes/package_ipk.bbclass b/meta/classes/package_ipk.bbclass
index 8e69b5da36..d58b824d3a 100644
--- a/meta/classes/package_ipk.bbclass
+++ b/meta/classes/package_ipk.bbclass
@@ -17,6 +17,8 @@ OPKG_ARGS += "${@['', '--add-exclude ' + ' --add-exclude '.join((d.getVar('PACKA
17OPKGLIBDIR = "${localstatedir}/lib" 17OPKGLIBDIR = "${localstatedir}/lib"
18 18
19python do_package_ipk () { 19python do_package_ipk () {
20 from multiprocessing import Process
21
20 oldcwd = os.getcwd() 22 oldcwd = os.getcwd()
21 23
22 workdir = d.getVar('WORKDIR') 24 workdir = d.getVar('WORKDIR')
@@ -37,11 +39,25 @@ python do_package_ipk () {
37 if os.access(os.path.join(tmpdir, "stamps", "IPK_PACKAGE_INDEX_CLEAN"), os.R_OK): 39 if os.access(os.path.join(tmpdir, "stamps", "IPK_PACKAGE_INDEX_CLEAN"), os.R_OK):
38 os.unlink(os.path.join(tmpdir, "stamps", "IPK_PACKAGE_INDEX_CLEAN")) 40 os.unlink(os.path.join(tmpdir, "stamps", "IPK_PACKAGE_INDEX_CLEAN"))
39 41
40 for pkg in packages.split(): 42 max_process = int(d.getVar("BB_NUMBER_THREADS") or os.cpu_count() or 1)
41 ipk_write_pkg(pkg, d) 43 launched = []
44 pkgs = packages.split()
45 while pkgs:
46 if len(launched) < max_process:
47 p = Process(target=ipk_write_pkg, args=(pkgs.pop(), d))
48 p.start()
49 launched.append(p)
50 for q in launched:
51 # The finished processes are joined when calling is_alive()
52 if not q.is_alive():
53 launched.remove(q)
54 for p in launched:
55 p.join()
42 56
43 os.chdir(oldcwd) 57 os.chdir(oldcwd)
44} 58}
59do_package_ipk[vardeps] += "ipk_write_pkg"
60do_package_ipk[vardepsexclude] = "BB_NUMBER_THREADS"
45 61
46def ipk_write_pkg(pkg, d): 62def ipk_write_pkg(pkg, d):
47 import re, copy 63 import re, copy