summaryrefslogtreecommitdiffstats
path: root/bitbake/lib
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2025-07-16 16:15:31 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2025-07-17 10:45:57 +0100
commitf209f127e654df7424adf41de07f88714d7952ab (patch)
tree5baa3d4f1f860dbdc0592cdb20e2bdac39b512e4 /bitbake/lib
parentb7173ca2254421c45f01243a77be611fe4b9d1c5 (diff)
downloadpoky-master.tar.gz
bitbake: main: Add an option to specify what to profileHEADmaster
Starting with python 3.12, profiling now stays enabled over threads yet you can't extract the profile data in the threads themselves, which makes it difficult to use for our use case. Our main loop starts the idle loop which starts the parsing threads and this means we can't profile in the main loop and the parsing threads or the idle loop at the same time due to this. Add options to the commandline so you can specify which piece of bitbake you want to enable profiling for. This allows some profiling with python 3.12 onwards rather than crashing. (Bitbake rev: 09f29a4968841ee5070f70277ba8c253bb14f017) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib')
-rw-r--r--bitbake/lib/bb/cooker.py2
-rwxr-xr-xbitbake/lib/bb/main.py6
-rw-r--r--bitbake/lib/bb/server/process.py6
3 files changed, 8 insertions, 6 deletions
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py
index c60fcd2719..fe33a4f34c 100644
--- a/bitbake/lib/bb/cooker.py
+++ b/bitbake/lib/bb/cooker.py
@@ -2027,7 +2027,7 @@ class Parser(multiprocessing.Process):
2027 self.exit = True 2027 self.exit = True
2028 2028
2029 def run(self): 2029 def run(self):
2030 bb.utils.profile_function(self.profile, self.realrun, "profile-parse-%s.log" % multiprocessing.current_process().name, process=False) 2030 bb.utils.profile_function("parsing" in self.profile, self.realrun, "profile-parse-%s.log" % multiprocessing.current_process().name, process=False)
2031 2031
2032 def realrun(self): 2032 def realrun(self):
2033 # Signal handling here is hard. We must not terminate any process or thread holding the write 2033 # Signal handling here is hard. We must not terminate any process or thread holding the write
diff --git a/bitbake/lib/bb/main.py b/bitbake/lib/bb/main.py
index bca8ebfa09..597cb27846 100755
--- a/bitbake/lib/bb/main.py
+++ b/bitbake/lib/bb/main.py
@@ -208,8 +208,10 @@ def create_bitbake_parser():
208 "failed and anything depending on it cannot be built, as much as " 208 "failed and anything depending on it cannot be built, as much as "
209 "possible will be built before stopping.") 209 "possible will be built before stopping.")
210 210
211 exec_group.add_argument("-P", "--profile", action="store_true", 211 exec_group.add_argument("-P", "--profile", action="append",
212 help="Profile the command and save reports.") 212 default=[],
213 help="Profile the command and save reports. Specify 'main', 'idle' or 'parsing' "
214 "to indicate which bitbake code to profile.")
213 215
214 exec_group.add_argument("-S", "--dump-signatures", action="append", 216 exec_group.add_argument("-S", "--dump-signatures", action="append",
215 default=[], metavar="SIGNATURE_HANDLER", 217 default=[], metavar="SIGNATURE_HANDLER",
diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py
index 2c5057bff1..7d1b38f78c 100644
--- a/bitbake/lib/bb/server/process.py
+++ b/bitbake/lib/bb/server/process.py
@@ -137,7 +137,7 @@ class ProcessServer():
137 serverlog("Error writing to lock file: %s" % str(e)) 137 serverlog("Error writing to lock file: %s" % str(e))
138 pass 138 pass
139 139
140 return bb.utils.profile_function(self.cooker.configuration.profile, self.main, "profile-mainloop.log") 140 return bb.utils.profile_function("main" in self.cooker.configuration.profile, self.main, "profile-mainloop.log")
141 141
142 def _idle_check(self): 142 def _idle_check(self):
143 return len(self._idlefuns) == 0 and self.cooker.command.currentAsyncCommand is None 143 return len(self._idlefuns) == 0 and self.cooker.command.currentAsyncCommand is None
@@ -398,7 +398,7 @@ class ProcessServer():
398 serverlog("".join(msg)) 398 serverlog("".join(msg))
399 399
400 def idle_thread(self): 400 def idle_thread(self):
401 bb.utils.profile_function(self.cooker.configuration.profile, self.idle_thread_internal, "profile-idleloop.log") 401 bb.utils.profile_function("idle" in self.cooker.configuration.profile, self.idle_thread_internal, "profile-idleloop.log")
402 402
403 def idle_thread_internal(self): 403 def idle_thread_internal(self):
404 def remove_idle_func(function): 404 def remove_idle_func(function):
@@ -600,7 +600,7 @@ class BitBakeServer(object):
600 os.set_inheritable(self.bitbake_lock.fileno(), True) 600 os.set_inheritable(self.bitbake_lock.fileno(), True)
601 os.set_inheritable(self.readypipein, True) 601 os.set_inheritable(self.readypipein, True)
602 serverscript = os.path.realpath(os.path.dirname(__file__) + "/../../../bin/bitbake-server") 602 serverscript = os.path.realpath(os.path.dirname(__file__) + "/../../../bin/bitbake-server")
603 os.execl(sys.executable, sys.executable, serverscript, "decafbad", str(self.bitbake_lock.fileno()), str(self.readypipein), self.logfile, self.bitbake_lock.name, self.sockname, str(self.server_timeout or 0), str(int(self.profile)), str(self.xmlrpcinterface[0]), str(self.xmlrpcinterface[1])) 603 os.execl(sys.executable, sys.executable, serverscript, "decafbad", str(self.bitbake_lock.fileno()), str(self.readypipein), self.logfile, self.bitbake_lock.name, self.sockname, str(self.server_timeout or 0), str(list(self.profile)), str(self.xmlrpcinterface[0]), str(self.xmlrpcinterface[1]))
604 604
605def execServer(lockfd, readypipeinfd, lockname, sockname, server_timeout, xmlrpcinterface, profile): 605def execServer(lockfd, readypipeinfd, lockname, sockname, server_timeout, xmlrpcinterface, profile):
606 606