summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/cooker.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/bb/cooker.py')
-rw-r--r--bitbake/lib/bb/cooker.py73
1 files changed, 42 insertions, 31 deletions
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py
index 44b9b2c31a..33eb65e2f3 100644
--- a/bitbake/lib/bb/cooker.py
+++ b/bitbake/lib/bb/cooker.py
@@ -1,4 +1,3 @@
1#!/usr/bin/env python
2# ex:ts=4:sw=4:sts=4:et 1# ex:ts=4:sw=4:sts=4:et
3# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- 2# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
4# 3#
@@ -71,7 +70,7 @@ class BBCooker:
71 self.bb_cache = None 70 self.bb_cache = None
72 71
73 if server: 72 if server:
74 self.server = server.BitBakeServer(self) 73 self.server = server.BitBakeServer(self, self.pre_serve, self.post_serve)
75 74
76 self.configuration = configuration 75 self.configuration = configuration
77 76
@@ -916,41 +915,53 @@ class BBCooker:
916 return self.appendlist[f] 915 return self.appendlist[f]
917 return [] 916 return []
918 917
919 def serve(self): 918 def pre_serve(self):
920
921 # Empty the environment. The environment will be populated as 919 # Empty the environment. The environment will be populated as
922 # necessary from the data store. 920 # necessary from the data store.
923 bb.utils.empty_environment() 921 bb.utils.empty_environment()
924 922
925 if self.configuration.profile: 923 def post_serve(self):
926 try:
927 import cProfile as profile
928 except:
929 import profile
930
931 profile.runctx("self.server.serve_forever()", globals(), locals(), "profile.log")
932
933 # Redirect stdout to capture profile information
934 pout = open('profile.log.processed', 'w')
935 so = sys.stdout.fileno()
936 os.dup2(pout.fileno(), so)
937
938 import pstats
939 p = pstats.Stats('profile.log')
940 p.sort_stats('time')
941 p.print_stats()
942 p.print_callers()
943 p.sort_stats('cumulative')
944 p.print_stats()
945
946 os.dup2(so, pout.fileno())
947 pout.flush()
948 pout.close()
949 else:
950 self.server.serve_forever()
951
952 bb.event.fire(CookerExit(), self.configuration.event_data) 924 bb.event.fire(CookerExit(), self.configuration.event_data)
953 925
926
927def server_main(cooker, func, *args):
928 if cooker.configuration.profile:
929 try:
930 import cProfile as profile
931 except:
932 import profile
933 prof = profile.Profile()
934
935 ret = profile.Profile.runcall(prof, func, *args)
936
937 prof.dump_stats("profile.log")
938
939 # Redirect stdout to capture profile information
940 pout = open('profile.log.processed', 'w')
941 so = sys.stdout.fileno()
942 orig_so = os.dup(sys.stdout.fileno())
943 os.dup2(pout.fileno(), so)
944
945 import pstats
946 p = pstats.Stats('profile.log')
947 p.sort_stats('time')
948 p.print_stats()
949 p.print_callers()
950 p.sort_stats('cumulative')
951 p.print_stats()
952
953 os.dup2(orig_so, so)
954 pout.flush()
955 pout.close()
956
957 print("Raw profiling information saved to profile.log and processed statistics to profile.log.processed")
958
959 return ret
960 else:
961 return func(*args)
962
963
964
954class CookerExit(bb.event.Event): 965class CookerExit(bb.event.Event):
955 """ 966 """
956 Notify clients of the Cooker shutdown 967 Notify clients of the Cooker shutdown