diff options
| author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2023-01-04 12:32:35 +0000 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2023-01-05 11:50:17 +0000 |
| commit | a19687acd12497d727203e63d74b2703387f34a6 (patch) | |
| tree | 813515cdfb0c807435db26acb6bafc2d351f48f1 /bitbake/lib/bb/event.py | |
| parent | 2c6f0b9228b47459dd1b67d578792cd017006128 (diff) | |
| download | poky-a19687acd12497d727203e63d74b2703387f34a6.tar.gz | |
bitbake: lib/bb: Update thread/process locks to use a timeout
The thread/process locks we use translate to futexes in Linux. If a
process dies holding the lock, anything else trying to take the lock
will hang indefinitely. An example would be the OOM killer taking out
a parser process.
To avoid bitbake processes just hanging indefinitely, add a timeout to
our lock calls using a context manager. If we can't obtain the lock
after waiting 5 minutes, hard exit out using os._exit(1). Use _exit()
to avoid locking in any other places trying to write error messages to
event handler queues (which also need locks).
Whilst a bit harsh, this should mean we stop having lots of long running
processes in cases where things are never going to work out and also
avoids hanging builds on the autobuilder.
(Bitbake rev: d2a3f662b0eed900fc012a392bfa0a365df0df9b)
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/event.py')
| -rw-r--r-- | bitbake/lib/bb/event.py | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/bitbake/lib/bb/event.py b/bitbake/lib/bb/event.py index 7826541a64..8b05f93e2f 100644 --- a/bitbake/lib/bb/event.py +++ b/bitbake/lib/bb/event.py | |||
| @@ -184,7 +184,7 @@ def fire_ui_handlers(event, d): | |||
| 184 | ui_queue.append(event) | 184 | ui_queue.append(event) |
| 185 | return | 185 | return |
| 186 | 186 | ||
| 187 | with _thread_lock: | 187 | with bb.utils.lock_timeout(_thread_lock): |
| 188 | errors = [] | 188 | errors = [] |
| 189 | for h in _ui_handlers: | 189 | for h in _ui_handlers: |
| 190 | #print "Sending event %s" % event | 190 | #print "Sending event %s" % event |
| @@ -315,7 +315,7 @@ def set_eventfilter(func): | |||
| 315 | _eventfilter = func | 315 | _eventfilter = func |
| 316 | 316 | ||
| 317 | def register_UIHhandler(handler, mainui=False): | 317 | def register_UIHhandler(handler, mainui=False): |
| 318 | with _thread_lock: | 318 | with bb.utils.lock_timeout(_thread_lock): |
| 319 | bb.event._ui_handler_seq = bb.event._ui_handler_seq + 1 | 319 | bb.event._ui_handler_seq = bb.event._ui_handler_seq + 1 |
| 320 | _ui_handlers[_ui_handler_seq] = handler | 320 | _ui_handlers[_ui_handler_seq] = handler |
| 321 | level, debug_domains = bb.msg.constructLogOptions() | 321 | level, debug_domains = bb.msg.constructLogOptions() |
| @@ -329,7 +329,7 @@ def unregister_UIHhandler(handlerNum, mainui=False): | |||
| 329 | if mainui: | 329 | if mainui: |
| 330 | global _uiready | 330 | global _uiready |
| 331 | _uiready = False | 331 | _uiready = False |
| 332 | with _thread_lock: | 332 | with bb.utils.lock_timeout(_thread_lock): |
| 333 | if handlerNum in _ui_handlers: | 333 | if handlerNum in _ui_handlers: |
| 334 | del _ui_handlers[handlerNum] | 334 | del _ui_handlers[handlerNum] |
| 335 | return | 335 | return |
