Files
poky/bitbake/bin/bitbake-server
Richard Purdie f209f127e6 bitbake: main: Add an option to specify what to profile
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>
2025-07-17 10:45:57 +01:00

1.6 KiB
Executable File

#!/usr/bin/env python3

SPDX-License-Identifier: GPL-2.0-only

Copyright (C) 2020 Richard Purdie

import os import sys import warnings warnings.simplefilter("default") warnings.filterwarnings("ignore", category=DeprecationWarning, message=".*use.of.fork.may.lead.to.deadlocks.in.the.child.") import logging sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(sys.argv[0])), 'lib'))

import bb

bb.utils.check_system_locale()

Users shouldn't be running this code directly

if len(sys.argv) != 11 or not sys.argv[1].startswith("decafbad"): print("bitbake-server is meant for internal execution by bitbake itself, please don't use it standalone.") sys.exit(1)

import bb.server.process

lockfd = int(sys.argv[2]) readypipeinfd = int(sys.argv[3]) logfile = sys.argv[4] lockname = sys.argv[5] sockname = sys.argv[6] timeout = float(sys.argv[7]) profile = sys.argv[8] xmlrpcinterface = (sys.argv[9], int(sys.argv[10])) if xmlrpcinterface[0] == "None": xmlrpcinterface = (None, xmlrpcinterface[1])

Replace standard fds with our own

with open('/dev/null', 'r') as si: os.dup2(si.fileno(), sys.stdin.fileno())

with open(logfile, 'a+') as so: os.dup2(so.fileno(), sys.stdout.fileno()) os.dup2(so.fileno(), sys.stderr.fileno())

Have stdout and stderr be the same so log output matches chronologically

and there aren't two seperate buffers

sys.stderr = sys.stdout

logger = logging.getLogger("BitBake")

Ensure logging messages get sent to the UI as events

handler = bb.event.LogHandler() logger.addHandler(handler)

bb.server.process.execServer(lockfd, readypipeinfd, lockname, sockname, timeout, xmlrpcinterface, profile)