From d61933410868ff2dd52a896520a2b620d35f3615 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Wed, 21 Feb 2024 10:46:08 +0100 Subject: [gdb/dap] Make dap log printing thread-safe I read that printing from different python threads is thread-unsafe, and I noticed that the dap log printing is used from different threads, but doesn't take care to make the printing thread-safe. Fix this by using a lock to access LoggingParam.log_file. Tested on aarch64-linux. Approved-By: Tom Tromey --- gdb/python/lib/gdb/dap/startup.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) (limited to 'gdb/python') diff --git a/gdb/python/lib/gdb/dap/startup.py b/gdb/python/lib/gdb/dap/startup.py index f20c541..6049121 100644 --- a/gdb/python/lib/gdb/dap/startup.py +++ b/gdb/python/lib/gdb/dap/startup.py @@ -146,6 +146,7 @@ class LoggingParam(gdb.Parameter): set_doc = "Set the DAP logging status." show_doc = "Show the DAP logging status." + lock = threading.Lock() log_file = None def __init__(self): @@ -155,12 +156,13 @@ class LoggingParam(gdb.Parameter): self.value = None def get_set_string(self): - # Close any existing log file, no matter what. - if self.log_file is not None: - self.log_file.close() - self.log_file = None - if self.value is not None: - self.log_file = open(self.value, "w") + with dap_log.lock: + # Close any existing log file, no matter what. + if self.log_file is not None: + self.log_file.close() + self.log_file = None + if self.value is not None: + self.log_file = open(self.value, "w") return "" @@ -169,16 +171,18 @@ dap_log = LoggingParam() def log(something, level=LogLevel.DEFAULT): """Log SOMETHING to the log file, if logging is enabled.""" - if dap_log.log_file is not None and level <= _log_level.value: - print(something, file=dap_log.log_file) - dap_log.log_file.flush() + with dap_log.lock: + if dap_log.log_file is not None and level <= _log_level.value: + print(something, file=dap_log.log_file) + dap_log.log_file.flush() def log_stack(level=LogLevel.DEFAULT): """Log a stack trace to the log file, if logging is enabled.""" - if dap_log.log_file is not None and level <= _log_level.value: - traceback.print_exc(file=dap_log.log_file) - dap_log.log_file.flush() + with dap_log.lock: + if dap_log.log_file is not None and level <= _log_level.value: + traceback.print_exc(file=dap_log.log_file) + dap_log.log_file.flush() @in_gdb_thread -- cgit v1.1