diff options
author | Richard Purdie <rpurdie@linux.intel.com> | 2010-11-13 21:23:54 +0800 |
---|---|---|
committer | Richard Purdie <rpurdie@linux.intel.com> | 2010-11-13 21:23:54 +0800 |
commit | 05ba6fc7cb5a389737a238f312f4148e6b837d71 (patch) | |
tree | 7b0d8688095f94fd2010c63f0b0aadff301eccbf /bitbake/lib/bb/cooker.py | |
parent | 89929e1f283c8508c505c9731ad933880abf22a1 (diff) | |
download | openembedded-core-05ba6fc7cb5a389737a238f312f4148e6b837d71.tar.gz openembedded-core-05ba6fc7cb5a389737a238f312f4148e6b837d71.tar.bz2 openembedded-core-05ba6fc7cb5a389737a238f312f4148e6b837d71.tar.xz openembedded-core-05ba6fc7cb5a389737a238f312f4148e6b837d71.zip |
bitbake: Rewrite profiling code so its functional for both none and xmlrpc backends
Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
Diffstat (limited to 'bitbake/lib/bb/cooker.py')
-rw-r--r-- | bitbake/lib/bb/cooker.py | 73 |
1 files changed, 42 insertions, 31 deletions
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index 44b9b2c31..33eb65e2f 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python # ex:ts=4:sw=4:sts=4:et # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- # @@ -71,7 +70,7 @@ class BBCooker: self.bb_cache = None if server: - self.server = server.BitBakeServer(self) + self.server = server.BitBakeServer(self, self.pre_serve, self.post_serve) self.configuration = configuration @@ -916,41 +915,53 @@ class BBCooker: return self.appendlist[f] return [] - def serve(self): - + def pre_serve(self): # Empty the environment. The environment will be populated as # necessary from the data store. bb.utils.empty_environment() - if self.configuration.profile: - try: - import cProfile as profile - except: - import profile - - profile.runctx("self.server.serve_forever()", globals(), locals(), "profile.log") - - # Redirect stdout to capture profile information - pout = open('profile.log.processed', 'w') - so = sys.stdout.fileno() - os.dup2(pout.fileno(), so) - - import pstats - p = pstats.Stats('profile.log') - p.sort_stats('time') - p.print_stats() - p.print_callers() - p.sort_stats('cumulative') - p.print_stats() - - os.dup2(so, pout.fileno()) - pout.flush() - pout.close() - else: - self.server.serve_forever() - + def post_serve(self): bb.event.fire(CookerExit(), self.configuration.event_data) + +def server_main(cooker, func, *args): + if cooker.configuration.profile: + try: + import cProfile as profile + except: + import profile + prof = profile.Profile() + + ret = profile.Profile.runcall(prof, func, *args) + + prof.dump_stats("profile.log") + + # Redirect stdout to capture profile information + pout = open('profile.log.processed', 'w') + so = sys.stdout.fileno() + orig_so = os.dup(sys.stdout.fileno()) + os.dup2(pout.fileno(), so) + + import pstats + p = pstats.Stats('profile.log') + p.sort_stats('time') + p.print_stats() + p.print_callers() + p.sort_stats('cumulative') + p.print_stats() + + os.dup2(orig_so, so) + pout.flush() + pout.close() + + print("Raw profiling information saved to profile.log and processed statistics to profile.log.processed") + + return ret + else: + return func(*args) + + + class CookerExit(bb.event.Event): """ Notify clients of the Cooker shutdown |