From 4bd1b49c299b9df3b669c9a211600ea7fac4912f Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Sat, 4 Apr 2026 23:29:14 +0530 Subject: [PATCH] remove critical section from PyCode_Addr2Line --- Objects/codeobject.c | 17 ++++------------- Python/instrumentation.c | 30 +++++++++++++++--------------- 2 files changed, 19 insertions(+), 28 deletions(-) diff --git a/Objects/codeobject.c b/Objects/codeobject.c index ad1116890e23ce..e1ed6372ae99ac 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -1008,13 +1008,14 @@ PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) * source location tracking (co_lines/co_positions) ******************/ -static int -_PyCode_Addr2Line(PyCodeObject *co, int addrq) +int +PyCode_Addr2Line(PyCodeObject *co, int addrq) { if (addrq < 0) { return co->co_firstlineno; } - if (co->_co_monitoring && co->_co_monitoring->lines) { + if (FT_ATOMIC_LOAD_PTR_ACQUIRE(co->_co_monitoring) && + FT_ATOMIC_LOAD_PTR_ACQUIRE(co->_co_monitoring->lines)) { return _Py_Instrumentation_GetLine(co, addrq/sizeof(_Py_CODEUNIT)); } assert(addrq >= 0 && addrq < _PyCode_NBYTES(co)); @@ -1040,16 +1041,6 @@ _PyCode_SafeAddr2Line(PyCodeObject *co, int addrq) return _PyCode_CheckLineNumber(addrq, &bounds); } -int -PyCode_Addr2Line(PyCodeObject *co, int addrq) -{ - int lineno; - Py_BEGIN_CRITICAL_SECTION(co); - lineno = _PyCode_Addr2Line(co, addrq); - Py_END_CRITICAL_SECTION(); - return lineno; -} - void _PyLineTable_InitAddressRange(const char *linetable, Py_ssize_t length, int firstlineno, PyCodeAddressRange *range) { diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 1aed6769d217fe..8df53995cd1f5d 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -1511,11 +1511,9 @@ initialize_tools(PyCodeObject *code) } static void -initialize_lines(PyCodeObject *code, int bytes_per_entry) +initialize_lines(_PyCoLineInstrumentationData *line_data, PyCodeObject *code, int bytes_per_entry) { ASSERT_WORLD_STOPPED_OR_LOCKED(code); - _PyCoLineInstrumentationData *line_data = code->_co_monitoring->lines; - assert(line_data != NULL); line_data->bytes_per_entry = bytes_per_entry; int code_len = (int)Py_SIZE(code); @@ -1635,6 +1633,7 @@ initialize_lines(PyCodeObject *code, int bytes_per_entry) set_original_opcode(line_data, handler, original_opcode); } } + FT_ATOMIC_STORE_PTR_RELEASE(code->_co_monitoring->lines, line_data); } static void @@ -1656,18 +1655,19 @@ allocate_instrumentation_data(PyCodeObject *code) ASSERT_WORLD_STOPPED_OR_LOCKED(code); if (code->_co_monitoring == NULL) { - code->_co_monitoring = PyMem_Malloc(sizeof(_PyCoMonitoringData)); - if (code->_co_monitoring == NULL) { + _PyCoMonitoringData *monitoring = PyMem_Malloc(sizeof(_PyCoMonitoringData)); + if (monitoring == NULL) { PyErr_NoMemory(); return -1; } - code->_co_monitoring->local_monitors = (_Py_LocalMonitors){ 0 }; - code->_co_monitoring->active_monitors = (_Py_LocalMonitors){ 0 }; - code->_co_monitoring->tools = NULL; - code->_co_monitoring->lines = NULL; - code->_co_monitoring->line_tools = NULL; - code->_co_monitoring->per_instruction_opcodes = NULL; - code->_co_monitoring->per_instruction_tools = NULL; + monitoring->local_monitors = (_Py_LocalMonitors){ 0 }; + monitoring->active_monitors = (_Py_LocalMonitors){ 0 }; + monitoring->tools = NULL; + monitoring->lines = NULL; + monitoring->line_tools = NULL; + monitoring->per_instruction_opcodes = NULL; + monitoring->per_instruction_tools = NULL; + FT_ATOMIC_STORE_PTR_RELEASE(code->_co_monitoring, monitoring); } return 0; } @@ -1732,12 +1732,12 @@ update_instrumentation_data(PyCodeObject *code, PyInterpreterState *interp) else { bytes_per_entry = 5; } - code->_co_monitoring->lines = PyMem_Malloc(1 + code_len * bytes_per_entry); - if (code->_co_monitoring->lines == NULL) { + _PyCoLineInstrumentationData *lines = PyMem_Malloc(1 + code_len * bytes_per_entry); + if (lines == NULL) { PyErr_NoMemory(); return -1; } - initialize_lines(code, bytes_per_entry); + initialize_lines(lines, code, bytes_per_entry); } if (multitools && code->_co_monitoring->line_tools == NULL) { code->_co_monitoring->line_tools = PyMem_Malloc(code_len);