diff options
-rw-r--r-- | meta/lib/oe/package_manager.py | 32 | ||||
-rw-r--r-- | meta/lib/oe/utils.py | 29 |
2 files changed, 33 insertions, 28 deletions
diff --git a/meta/lib/oe/package_manager.py b/meta/lib/oe/package_manager.py index 8be3d41706..f8fc3c28bf 100644 --- a/meta/lib/oe/package_manager.py +++ b/meta/lib/oe/package_manager.py @@ -7,6 +7,7 @@ import multiprocessing import re import bb import tempfile +import oe.utils # this can be used by all PM backends to create the index files in parallel @@ -116,16 +117,7 @@ class RpmIndexer(Indexer): bb.note("There are no packages in %s" % self.deploy_dir) return - nproc = multiprocessing.cpu_count() - pool = bb.utils.multiprocessingpool(nproc) - results = list(pool.imap(create_index, index_cmds)) - pool.close() - pool.join() - - for result in results: - if result is not None: - return(result) - + oe.utils.multiprocess_exec(index_cmds, create_index) class OpkgIndexer(Indexer): def write_index(self): @@ -161,15 +153,7 @@ class OpkgIndexer(Indexer): bb.note("There are no packages in %s!" % self.deploy_dir) return - nproc = multiprocessing.cpu_count() - pool = bb.utils.multiprocessingpool(nproc) - results = list(pool.imap(create_index, index_cmds)) - pool.close() - pool.join() - - for result in results: - if result is not None: - return(result) + oe.utils.multiprocess_exec(index_cmds, create_index) class DpkgIndexer(Indexer): @@ -210,15 +194,7 @@ class DpkgIndexer(Indexer): bb.note("There are no packages in %s" % self.deploy_dir) return - nproc = multiprocessing.cpu_count() - pool = bb.utils.multiprocessingpool(nproc) - results = list(pool.imap(create_index, index_cmds)) - pool.close() - pool.join() - - for result in results: - if result is not None: - return(result) + oe.utils.multiprocess_exec(index_cmds, create_index) class PkgsList(object): diff --git a/meta/lib/oe/utils.py b/meta/lib/oe/utils.py index 0a1d1080c9..92e21a4e0e 100644 --- a/meta/lib/oe/utils.py +++ b/meta/lib/oe/utils.py @@ -151,3 +151,32 @@ def execute_pre_post_process(d, cmds): if cmd != '': bb.note("Executing %s ..." % cmd) bb.build.exec_func(cmd, d) + +def multiprocess_exec(commands, function): + import signal + import multiprocessing + + if not commands: + return [] + + def init_worker(): + signal.signal(signal.SIGINT, signal.SIG_IGN) + + nproc = min(multiprocessing.cpu_count(), len(commands)) + pool = bb.utils.multiprocessingpool(nproc, init_worker) + imap = pool.imap(function, commands) + + try: + results = list(imap) + pool.close() + pool.join() + results = [] + for result in results: + if result is not None: + results.append(result) + return results + + except KeyboardInterrupt: + pool.terminate() + pool.join() + raise |