summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/server
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2022-12-30 21:55:59 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2022-12-31 17:05:17 +0000
commit3cc9aed5a59d7b72b98ef40727102c98b031f911 (patch)
treed206bb855d2a794d5034d8e1ed45e98cdc8cf7c6 /bitbake/lib/bb/server
parent6a6a5c01f768f2af581f1f764a3a1c40864459e7 (diff)
downloadpoky-3cc9aed5a59d7b72b98ef40727102c98b031f911.tar.gz
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>
Diffstat (limited to 'bitbake/lib/bb/server')
-rw-r--r--bitbake/lib/bb/server/process.py19
1 files changed, 14 insertions, 5 deletions
diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py
index 5acc105e08..2aee9ef051 100644
--- a/bitbake/lib/bb/server/process.py
+++ b/bitbake/lib/bb/server/process.py
@@ -93,6 +93,7 @@ class ProcessServer():
93 self.xmlrpc = False 93 self.xmlrpc = False
94 94
95 self._idlefuns = {} 95 self._idlefuns = {}
96 self._idlefuncsLock = threading.Lock()
96 97
97 self.bitbake_lock = lock 98 self.bitbake_lock = lock
98 self.bitbake_lock_name = lockname 99 self.bitbake_lock_name = lockname
@@ -109,7 +110,8 @@ class ProcessServer():
109 def register_idle_function(self, function, data): 110 def register_idle_function(self, function, data):
110 """Register a function to be called while the server is idle""" 111 """Register a function to be called while the server is idle"""
111 assert hasattr(function, '__call__') 112 assert hasattr(function, '__call__')
112 self._idlefuns[function] = data 113 with self._idlefuncsLock:
114 self._idlefuns[function] = data
113 serverlog("Registering idle function %s" % str(function)) 115 serverlog("Registering idle function %s" % str(function))
114 116
115 def run(self): 117 def run(self):
@@ -358,21 +360,28 @@ class ProcessServer():
358 serverlog("".join(msg)) 360 serverlog("".join(msg))
359 361
360 def idle_commands(self, delay, fds=None): 362 def idle_commands(self, delay, fds=None):
363 def remove_idle_func(function):
364 with self._idlefuncsLock:
365 del self._idlefuns[function]
366
361 nextsleep = delay 367 nextsleep = delay
362 if not fds: 368 if not fds:
363 fds = [] 369 fds = []
364 370
365 for function, data in list(self._idlefuns.items()): 371 with self._idlefuncsLock:
372 items = list(self._idlefuns.items())
373
374 for function, data in items:
366 try: 375 try:
367 retval = function(self, data, False) 376 retval = function(self, data, False)
368 if isinstance(retval, idleFinish): 377 if isinstance(retval, idleFinish):
369 serverlog("Removing idle function %s at idleFinish" % str(function)) 378 serverlog("Removing idle function %s at idleFinish" % str(function))
370 del self._idlefuns[function] 379 remove_idle_func(function)
371 self.cooker.command.finishAsyncCommand(retval.msg) 380 self.cooker.command.finishAsyncCommand(retval.msg)
372 nextsleep = None 381 nextsleep = None
373 elif retval is False: 382 elif retval is False:
374 serverlog("Removing idle function %s" % str(function)) 383 serverlog("Removing idle function %s" % str(function))
375 del self._idlefuns[function] 384 remove_idle_func(function)
376 nextsleep = None 385 nextsleep = None
377 elif retval is True: 386 elif retval is True:
378 nextsleep = None 387 nextsleep = None
@@ -388,7 +397,7 @@ class ProcessServer():
388 except Exception as exc: 397 except Exception as exc:
389 if not isinstance(exc, bb.BBHandledException): 398 if not isinstance(exc, bb.BBHandledException):
390 logger.exception('Running idle function') 399 logger.exception('Running idle function')
391 del self._idlefuns[function] 400 remove_idle_func(function)
392 serverlog("Exception %s broke the idle_thread, exiting" % traceback.format_exc()) 401 serverlog("Exception %s broke the idle_thread, exiting" % traceback.format_exc())
393 self.quit = True 402 self.quit = True
394 403