diff options
| -rw-r--r-- | bitbake/lib/bb/cooker.py | 14 | ||||
| -rw-r--r-- | bitbake/lib/bb/utils.py | 12 |
2 files changed, 21 insertions, 5 deletions
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index ddf5fedb83..577d808511 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py | |||
| @@ -1798,8 +1798,6 @@ class Parser(multiprocessing.Process): | |||
| 1798 | finally: | 1798 | finally: |
| 1799 | logfile = "profile-parse-%s.log" % multiprocessing.current_process().name | 1799 | logfile = "profile-parse-%s.log" % multiprocessing.current_process().name |
| 1800 | prof.dump_stats(logfile) | 1800 | prof.dump_stats(logfile) |
| 1801 | bb.utils.process_profilelog(logfile) | ||
| 1802 | print("Raw profiling information saved to %s and processed statistics to %s.processed" % (logfile, logfile)) | ||
| 1803 | 1801 | ||
| 1804 | def realrun(self): | 1802 | def realrun(self): |
| 1805 | if self.init: | 1803 | if self.init: |
| @@ -1869,6 +1867,7 @@ class CookerParser(object): | |||
| 1869 | self.current = 0 | 1867 | self.current = 0 |
| 1870 | self.num_processes = int(self.cfgdata.getVar("BB_NUMBER_PARSE_THREADS", True) or | 1868 | self.num_processes = int(self.cfgdata.getVar("BB_NUMBER_PARSE_THREADS", True) or |
| 1871 | multiprocessing.cpu_count()) | 1869 | multiprocessing.cpu_count()) |
| 1870 | self.process_names = [] | ||
| 1872 | 1871 | ||
| 1873 | self.bb_cache = bb.cache.Cache(self.cfgdata, self.cfghash, cooker.caches_array) | 1872 | self.bb_cache = bb.cache.Cache(self.cfgdata, self.cfghash, cooker.caches_array) |
| 1874 | self.fromcache = [] | 1873 | self.fromcache = [] |
| @@ -1904,6 +1903,7 @@ class CookerParser(object): | |||
| 1904 | for i in range(0, self.num_processes): | 1903 | for i in range(0, self.num_processes): |
| 1905 | parser = Parser(self.jobs, self.result_queue, self.parser_quit, init, self.cooker.configuration.profile) | 1904 | parser = Parser(self.jobs, self.result_queue, self.parser_quit, init, self.cooker.configuration.profile) |
| 1906 | parser.start() | 1905 | parser.start() |
| 1906 | self.process_names.append(parser.name) | ||
| 1907 | self.processes.append(parser) | 1907 | self.processes.append(parser) |
| 1908 | 1908 | ||
| 1909 | self.results = itertools.chain(self.results, self.parse_generator()) | 1909 | self.results = itertools.chain(self.results, self.parse_generator()) |
| @@ -1947,6 +1947,16 @@ class CookerParser(object): | |||
| 1947 | multiprocessing.util.Finalize(None, sync.join, exitpriority=-100) | 1947 | multiprocessing.util.Finalize(None, sync.join, exitpriority=-100) |
| 1948 | bb.codeparser.parser_cache_savemerge(self.cooker.data) | 1948 | bb.codeparser.parser_cache_savemerge(self.cooker.data) |
| 1949 | bb.fetch.fetcher_parse_done(self.cooker.data) | 1949 | bb.fetch.fetcher_parse_done(self.cooker.data) |
| 1950 | if self.cooker.configuration.profile: | ||
| 1951 | profiles = [] | ||
| 1952 | for i in self.process_names: | ||
| 1953 | logfile = "profile-parse-%s.log" % i | ||
| 1954 | if os.path.exists(logfile): | ||
| 1955 | profiles.append(logfile) | ||
| 1956 | |||
| 1957 | pout = "profile-parse.log.processed" | ||
| 1958 | bb.utils.process_profilelog(profiles, pout = pout) | ||
| 1959 | print("Processed parsing statistics saved to %s" % (pout)) | ||
| 1950 | 1960 | ||
| 1951 | def load_cached(self): | 1961 | def load_cached(self): |
| 1952 | for filename, appends in self.fromcache: | 1962 | for filename, appends in self.fromcache: |
diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index 988b845a4a..857f5bcf96 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py | |||
| @@ -908,11 +908,17 @@ def cpu_count(): | |||
| 908 | def nonblockingfd(fd): | 908 | def nonblockingfd(fd): |
| 909 | fcntl.fcntl(fd, fcntl.F_SETFL, fcntl.fcntl(fd, fcntl.F_GETFL) | os.O_NONBLOCK) | 909 | fcntl.fcntl(fd, fcntl.F_SETFL, fcntl.fcntl(fd, fcntl.F_GETFL) | os.O_NONBLOCK) |
| 910 | 910 | ||
| 911 | def process_profilelog(fn): | 911 | def process_profilelog(fn, pout = None): |
| 912 | pout = open(fn + '.processed', 'w') | 912 | # Either call with a list of filenames and set pout or a filename and optionally pout. |
| 913 | if not pout: | ||
| 914 | pout = fn + '.processed' | ||
| 915 | pout = open(pout, 'w') | ||
| 913 | 916 | ||
| 914 | import pstats | 917 | import pstats |
| 915 | p = pstats.Stats(fn, stream=pout) | 918 | if isinstance(fn, list): |
| 919 | p = pstats.Stats(*fn, stream=pout) | ||
| 920 | else: | ||
| 921 | p = pstats.Stats(fn, stream=pout) | ||
| 916 | p.sort_stats('time') | 922 | p.sort_stats('time') |
| 917 | p.print_stats() | 923 | p.print_stats() |
| 918 | p.print_callers() | 924 | p.print_callers() |
