From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Mon, 28 Jul 2025 19:39:44 +0000 (+0200) Subject: [3.14] gh-136870: fix data races in instrumentation of bytecode (GH-136994) (#137082) X-Git-Tag: v3.14.0rc2~48 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=909a534cb285ab90e4cef23730a6213d463f6f28;p=thirdparty%2FPython%2Fcpython.git [3.14] gh-136870: fix data races in instrumentation of bytecode (GH-136994) (#137082) Co-authored-by: Kumar Aditya Co-authored-by: Zachary Ware --- diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-24-17-30-58.gh-issue-136870.ncx82J.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-24-17-30-58.gh-issue-136870.ncx82J.rst new file mode 100644 index 000000000000..7552dc69169b --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-24-17-30-58.gh-issue-136870.ncx82J.rst @@ -0,0 +1 @@ +Fix data races while de-instrumenting bytecode of code objects running concurrently in threads. diff --git a/Python/instrumentation.c b/Python/instrumentation.c index 5b26a0780858..0a816a9c3af1 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -1190,9 +1190,10 @@ call_instrumentation_vector( break; } else { - LOCK_CODE(code); + PyInterpreterState *interp = tstate->interp; + _PyEval_StopTheWorld(interp); remove_tools(code, offset, event, 1 << tool); - UNLOCK_CODE(); + _PyEval_StartTheWorld(interp); } } } @@ -1381,9 +1382,10 @@ _Py_call_instrumentation_line(PyThreadState *tstate, _PyInterpreterFrame* frame, } else { /* DISABLE */ - LOCK_CODE(code); + PyInterpreterState *interp = tstate->interp; + _PyEval_StopTheWorld(interp); remove_line_tools(code, i, 1 << tool); - UNLOCK_CODE(); + _PyEval_StartTheWorld(interp); } } while (tools); Py_DECREF(line_obj); @@ -1438,9 +1440,10 @@ _Py_call_instrumentation_instruction(PyThreadState *tstate, _PyInterpreterFrame* } else { /* DISABLE */ - LOCK_CODE(code); + PyInterpreterState *interp = tstate->interp; + _PyEval_StopTheWorld(interp); remove_per_instruction_tools(code, offset, 1 << tool); - UNLOCK_CODE(); + _PyEval_StartTheWorld(interp); } } Py_DECREF(offset_obj); @@ -2995,9 +2998,10 @@ branch_handler_vectorcall( // Orphaned NOT_TAKEN -- Jump removed by the compiler return res; } - LOCK_CODE(code); + PyInterpreterState *interp = _PyInterpreterState_GET(); + _PyEval_StopTheWorld(interp); remove_tools(code, offset, other_event, 1 << self->tool_id); - UNLOCK_CODE(); + _PyEval_StartTheWorld(interp); } return res; }