bitbake: server/process: Add locking around idle functions accesses

In preparation for adding splitting bitbakes work into two threads,
add locking around the idle functions list accesses.

(Bitbake rev: a9c63ce8932898b595fb7776cf5467d3c0afe4f7)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Richard Purdie
2022-12-30 21:55:59 +00:00
parent 6a6a5c01f7
commit 3cc9aed5a5

View File

@@ -93,6 +93,7 @@ class ProcessServer():
self.xmlrpc = False
self._idlefuns = {}
self._idlefuncsLock = threading.Lock()
self.bitbake_lock = lock
self.bitbake_lock_name = lockname
@@ -109,7 +110,8 @@ class ProcessServer():
def register_idle_function(self, function, data):
"""Register a function to be called while the server is idle"""
assert hasattr(function, '__call__')
self._idlefuns[function] = data
with self._idlefuncsLock:
self._idlefuns[function] = data
serverlog("Registering idle function %s" % str(function))
def run(self):
@@ -358,21 +360,28 @@ class ProcessServer():
serverlog("".join(msg))
def idle_commands(self, delay, fds=None):
def remove_idle_func(function):
with self._idlefuncsLock:
del self._idlefuns[function]
nextsleep = delay
if not fds:
fds = []
for function, data in list(self._idlefuns.items()):
with self._idlefuncsLock:
items = list(self._idlefuns.items())
for function, data in items:
try:
retval = function(self, data, False)
if isinstance(retval, idleFinish):
serverlog("Removing idle function %s at idleFinish" % str(function))
del self._idlefuns[function]
remove_idle_func(function)
self.cooker.command.finishAsyncCommand(retval.msg)
nextsleep = None
elif retval is False:
serverlog("Removing idle function %s" % str(function))
del self._idlefuns[function]
remove_idle_func(function)
nextsleep = None
elif retval is True:
nextsleep = None
@@ -388,7 +397,7 @@ class ProcessServer():
except Exception as exc:
if not isinstance(exc, bb.BBHandledException):
logger.exception('Running idle function')
del self._idlefuns[function]
remove_idle_func(function)
serverlog("Exception %s broke the idle_thread, exiting" % traceback.format_exc())
self.quit = True