diff options
| author | Richard Purdie <rpurdie@linux.intel.com> | 2010-09-28 22:24:13 +0100 |
|---|---|---|
| committer | Richard Purdie <rpurdie@linux.intel.com> | 2010-09-29 10:47:17 +0100 |
| commit | 9747616600b424e8c0d7075a9b516a12d65a17c3 (patch) | |
| tree | 5a59f32ae06bb18565bdffe12414902337b8fa93 /bitbake/lib/bb/siggen.py | |
| parent | 8976fa69d0ddfdad24fe041f4b88c853dc7a33a2 (diff) | |
| download | poky-9747616600b424e8c0d7075a9b516a12d65a17c3.tar.gz | |
bitbake/siggen: Ensure full signature data is not held unless needed, reducing memory consumption
Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
Diffstat (limited to 'bitbake/lib/bb/siggen.py')
| -rw-r--r-- | bitbake/lib/bb/siggen.py | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py index eb624311a0..2948372c6a 100644 --- a/bitbake/lib/bb/siggen.py +++ b/bitbake/lib/bb/siggen.py | |||
| @@ -7,26 +7,26 @@ except ImportError: | |||
| 7 | import pickle | 7 | import pickle |
| 8 | bb.msg.note(1, bb.msg.domain.Cache, "Importing cPickle failed. Falling back to a very slow implementation.") | 8 | bb.msg.note(1, bb.msg.domain.Cache, "Importing cPickle failed. Falling back to a very slow implementation.") |
| 9 | 9 | ||
| 10 | def init(d): | 10 | def init(d, dumpsigs): |
| 11 | siggens = [obj for obj in globals().itervalues() | 11 | siggens = [obj for obj in globals().itervalues() |
| 12 | if type(obj) is type and issubclass(obj, SignatureGenerator)] | 12 | if type(obj) is type and issubclass(obj, SignatureGenerator)] |
| 13 | 13 | ||
| 14 | desired = bb.data.getVar("BB_SIGNATURE_HANDLER", d, True) or "noop" | 14 | desired = bb.data.getVar("BB_SIGNATURE_HANDLER", d, True) or "noop" |
| 15 | for sg in siggens: | 15 | for sg in siggens: |
| 16 | if desired == sg.name: | 16 | if desired == sg.name: |
| 17 | return sg(d) | 17 | return sg(d, dumpsigs) |
| 18 | break | 18 | break |
| 19 | else: | 19 | else: |
| 20 | bb.error("Invalid signature generator '%s', using default 'noop' generator" % desired) | 20 | bb.error("Invalid signature generator '%s', using default 'noop' generator" % desired) |
| 21 | bb.error("Available generators: %s" % ", ".join(obj.name for obj in siggens)) | 21 | bb.error("Available generators: %s" % ", ".join(obj.name for obj in siggens)) |
| 22 | return SignatureGenerator(d) | 22 | return SignatureGenerator(d, dumpsigs) |
| 23 | 23 | ||
| 24 | class SignatureGenerator(object): | 24 | class SignatureGenerator(object): |
| 25 | """ | 25 | """ |
| 26 | """ | 26 | """ |
| 27 | name = "noop" | 27 | name = "noop" |
| 28 | 28 | ||
| 29 | def __init__(self, data): | 29 | def __init__(self, data, dumpsigs): |
| 30 | return | 30 | return |
| 31 | 31 | ||
| 32 | def finalise(self, fn, d): | 32 | def finalise(self, fn, d): |
| @@ -37,7 +37,7 @@ class SignatureGeneratorBasic(SignatureGenerator): | |||
| 37 | """ | 37 | """ |
| 38 | name = "basic" | 38 | name = "basic" |
| 39 | 39 | ||
| 40 | def __init__(self, data): | 40 | def __init__(self, data, dumpsigs): |
| 41 | self.basehash = {} | 41 | self.basehash = {} |
| 42 | self.taskhash = {} | 42 | self.taskhash = {} |
| 43 | self.taskdeps = {} | 43 | self.taskdeps = {} |
| @@ -52,17 +52,19 @@ class SignatureGeneratorBasic(SignatureGenerator): | |||
| 52 | else: | 52 | else: |
| 53 | self.twl = None | 53 | self.twl = None |
| 54 | 54 | ||
| 55 | self.dumpsigs = dumpsigs | ||
| 56 | |||
| 55 | def _build_data(self, fn, d): | 57 | def _build_data(self, fn, d): |
| 56 | 58 | ||
| 57 | self.taskdeps[fn], self.gendeps[fn] = bb.data.generate_dependencies(d) | 59 | taskdeps, gendeps = bb.data.generate_dependencies(d) |
| 58 | 60 | ||
| 59 | basehash = {} | 61 | basehash = {} |
| 60 | lookupcache = {} | 62 | lookupcache = {} |
| 61 | 63 | ||
| 62 | for task in self.taskdeps[fn]: | 64 | for task in taskdeps: |
| 63 | data = d.getVar(task, False) | 65 | data = d.getVar(task, False) |
| 64 | lookupcache[task] = data | 66 | lookupcache[task] = data |
| 65 | for dep in sorted(self.taskdeps[fn][task]): | 67 | for dep in sorted(taskdeps[task]): |
| 66 | if dep in self.basewhitelist: | 68 | if dep in self.basewhitelist: |
| 67 | continue | 69 | continue |
| 68 | if dep in lookupcache: | 70 | if dep in lookupcache: |
| @@ -75,20 +77,25 @@ class SignatureGeneratorBasic(SignatureGenerator): | |||
| 75 | self.basehash[fn + "." + task] = hashlib.md5(data).hexdigest() | 77 | self.basehash[fn + "." + task] = hashlib.md5(data).hexdigest() |
| 76 | #bb.note("Hash for %s is %s" % (task, tashhash[task])) | 78 | #bb.note("Hash for %s is %s" % (task, tashhash[task])) |
| 77 | 79 | ||
| 78 | self.lookupcache[fn] = lookupcache | 80 | if self.dumpsigs: |
| 81 | self.taskdeps[fn] = taskdeps | ||
| 82 | self.gendeps[fn] = gendeps | ||
| 83 | self.lookupcache[fn] = lookupcache | ||
| 84 | |||
| 85 | return taskdeps | ||
| 79 | 86 | ||
| 80 | def finalise(self, fn, d, variant): | 87 | def finalise(self, fn, d, variant): |
| 81 | 88 | ||
| 82 | if variant: | 89 | if variant: |
| 83 | fn = "virtual:" + variant + ":" + fn | 90 | fn = "virtual:" + variant + ":" + fn |
| 84 | 91 | ||
| 85 | self._build_data(fn, d) | 92 | taskdeps = self._build_data(fn, d) |
| 86 | 93 | ||
| 87 | #Slow but can be useful for debugging mismatched basehashes | 94 | #Slow but can be useful for debugging mismatched basehashes |
| 88 | #for task in self.taskdeps[fn]: | 95 | #for task in self.taskdeps[fn]: |
| 89 | # self.dump_sigtask(fn, task, d.getVar("STAMP", True), False) | 96 | # self.dump_sigtask(fn, task, d.getVar("STAMP", True), False) |
| 90 | 97 | ||
| 91 | for task in self.taskdeps[fn]: | 98 | for task in taskdeps: |
| 92 | d.setVar("BB_BASEHASH_task-%s" % task, self.basehash[fn + "." + task]) | 99 | d.setVar("BB_BASEHASH_task-%s" % task, self.basehash[fn + "." + task]) |
| 93 | 100 | ||
| 94 | def get_taskhash(self, fn, task, deps, dataCache): | 101 | def get_taskhash(self, fn, task, deps, dataCache): |
