mirror of
https://git.yoctoproject.org/poky
synced 2026-06-12 16:50:07 +00:00
insane.bbclass: use multiprocessing for collecting 'objdump -p' output
This was prompted by ltp's unreasonably long package_qa times; it has a massive amount of executables and insane runs objdump for all of them, serially. This reduces the time from 4 minutes to 1m20s on my machine. (From OE-Core rev: fac984b99fdb46949879516cb87153860f402c75) Signed-off-by: Alexander Kanavin <alex@linutronix.de> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
committed by
Richard Purdie
parent
1dfdf2bb92
commit
18f165c9e8
@@ -684,6 +684,10 @@ def package_qa_recipe(warnfuncs, errorfuncs, pn, d):
|
||||
|
||||
return len(errors) == 0
|
||||
|
||||
def prepopulate_objdump_p(elf, d):
|
||||
output = elf.run_objdump("-p", d)
|
||||
return (elf.name, output)
|
||||
|
||||
# Walk over all files in a directory and call func
|
||||
def package_qa_walk(warnfuncs, errorfuncs, package, d):
|
||||
#if this will throw an exception, then fix the dict above
|
||||
@@ -692,18 +696,32 @@ def package_qa_walk(warnfuncs, errorfuncs, package, d):
|
||||
|
||||
warnings = {}
|
||||
errors = {}
|
||||
elves = {}
|
||||
for path in pkgfiles[package]:
|
||||
elf = None
|
||||
if os.path.isfile(path):
|
||||
elf = oe.qa.ELFFile(path)
|
||||
try:
|
||||
elf.open()
|
||||
elf.close()
|
||||
except oe.qa.NotELFFileError:
|
||||
elf = None
|
||||
if elf:
|
||||
elves[path] = elf
|
||||
|
||||
results = oe.utils.multiprocess_launch(prepopulate_objdump_p, elves.values(), d, extraargs=(d,))
|
||||
for item in results:
|
||||
elves[item[0]].set_objdump("-p", item[1])
|
||||
|
||||
for path in pkgfiles[package]:
|
||||
if path in elves:
|
||||
elves[path].open()
|
||||
for func in warnfuncs:
|
||||
func(path, package, d, elf, warnings)
|
||||
func(path, package, d, elves.get(path), warnings)
|
||||
for func in errorfuncs:
|
||||
func(path, package, d, elf, errors)
|
||||
func(path, package, d, elves.get(path), errors)
|
||||
if path in elves:
|
||||
elves[path].close()
|
||||
|
||||
for w in warnings:
|
||||
oe.qa.handle_error(w, warnings[w], d)
|
||||
|
||||
@@ -48,6 +48,9 @@ class ELFFile:
|
||||
return self
|
||||
|
||||
def __exit__(self, exc_type, exc_value, traceback):
|
||||
self.close()
|
||||
|
||||
def close(self):
|
||||
if self.data:
|
||||
self.data.close()
|
||||
|
||||
@@ -128,6 +131,9 @@ class ELFFile:
|
||||
"""
|
||||
return self.getShort(ELFFile.E_MACHINE)
|
||||
|
||||
def set_objdump(self, cmd, output):
|
||||
self.objdump_output[cmd] = output
|
||||
|
||||
def run_objdump(self, cmd, d):
|
||||
import bb.process
|
||||
import sys
|
||||
|
||||
Reference in New Issue
Block a user