From fa40c724a6940771f939fc750beead4f2b4fd96b Mon Sep 17 00:00:00 2001 From: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> Date: Wed, 5 Jun 2024 23:58:18 +0800 Subject: [PATCH 1/3] Fix some simple races in instrumentation.c --- Python/instrumentation.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Python/instrumentation.c b/Python/instrumentation.c index a5211ee5428cf8..befaccb3a35cab 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -666,7 +666,7 @@ de_instrument_per_instruction(PyCodeObject *code, int i) int original_opcode = code->_co_monitoring->per_instruction_opcodes[i]; CHECK(original_opcode != 0); CHECK(original_opcode == _PyOpcode_Deopt[original_opcode]); - *opcode_ptr = original_opcode; + FT_ATOMIC_STORE_UINT8_RELAXED(*opcode_ptr, original_opcode); if (_PyOpcode_Caches[original_opcode]) { instr[1].counter = adaptive_counter_warmup(); } @@ -717,7 +717,7 @@ instrument_line(PyCodeObject *code, int i) _PyCoLineInstrumentationData *lines = &code->_co_monitoring->lines[i]; lines->original_opcode = _PyOpcode_Deopt[opcode]; CHECK(lines->original_opcode > 0); - *opcode_ptr = INSTRUMENTED_LINE; + FT_ATOMIC_STORE_UINT8_RELAXED(*opcode_ptr, INSTRUMENTED_LINE); } static void @@ -746,7 +746,7 @@ instrument_per_instruction(PyCodeObject *code, int i) code->_co_monitoring->per_instruction_opcodes[i] = _PyOpcode_Deopt[opcode]; } assert(code->_co_monitoring->per_instruction_opcodes[i] > 0); - *opcode_ptr = INSTRUMENTED_INSTRUCTION; + FT_ATOMIC_STORE_UINT8_RELAXED(*opcode_ptr, INSTRUMENTED_INSTRUCTION); } static void From 43cc08a77803ca39d4b2abe1eef1862e70945f68 Mon Sep 17 00:00:00 2001 From: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> Date: Fri, 7 Jun 2024 14:00:51 +0800 Subject: [PATCH 2/3] Revert "Fix some simple races in instrumentation.c" This reverts commit fa40c724a6940771f939fc750beead4f2b4fd96b. --- Python/instrumentation.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Python/instrumentation.c b/Python/instrumentation.c index befaccb3a35cab..a5211ee5428cf8 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -666,7 +666,7 @@ de_instrument_per_instruction(PyCodeObject *code, int i) int original_opcode = code->_co_monitoring->per_instruction_opcodes[i]; CHECK(original_opcode != 0); CHECK(original_opcode == _PyOpcode_Deopt[original_opcode]); - FT_ATOMIC_STORE_UINT8_RELAXED(*opcode_ptr, original_opcode); + *opcode_ptr = original_opcode; if (_PyOpcode_Caches[original_opcode]) { instr[1].counter = adaptive_counter_warmup(); } @@ -717,7 +717,7 @@ instrument_line(PyCodeObject *code, int i) _PyCoLineInstrumentationData *lines = &code->_co_monitoring->lines[i]; lines->original_opcode = _PyOpcode_Deopt[opcode]; CHECK(lines->original_opcode > 0); - FT_ATOMIC_STORE_UINT8_RELAXED(*opcode_ptr, INSTRUMENTED_LINE); + *opcode_ptr = INSTRUMENTED_LINE; } static void @@ -746,7 +746,7 @@ instrument_per_instruction(PyCodeObject *code, int i) code->_co_monitoring->per_instruction_opcodes[i] = _PyOpcode_Deopt[opcode]; } assert(code->_co_monitoring->per_instruction_opcodes[i] > 0); - FT_ATOMIC_STORE_UINT8_RELAXED(*opcode_ptr, INSTRUMENTED_INSTRUCTION); + *opcode_ptr = INSTRUMENTED_INSTRUCTION; } static void From 124ad7f8fa11828aa0618b65fce3330e4d8ed9ef Mon Sep 17 00:00:00 2001 From: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> Date: Fri, 7 Jun 2024 14:07:25 +0800 Subject: [PATCH 3/3] stop the world when setting local events --- Python/instrumentation.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Python/instrumentation.c b/Python/instrumentation.c index a5211ee5428cf8..ae790a1441b933 100644 --- a/Python/instrumentation.c +++ b/Python/instrumentation.c @@ -1977,7 +1977,7 @@ _PyMonitoring_SetLocalEvents(PyCodeObject *code, int tool_id, _PyMonitoringEvent } int res; - LOCK_CODE(code); + _PyEval_StopTheWorld(interp); if (allocate_instrumentation_data(code)) { res = -1; goto done; @@ -1994,7 +1994,7 @@ _PyMonitoring_SetLocalEvents(PyCodeObject *code, int tool_id, _PyMonitoringEvent res = force_instrument_lock_held(code, interp); done: - UNLOCK_CODE(); + _PyEval_StartTheWorld(interp); return res; }