https://github.com/python/cpython/commit/e457d60daafe66534283e0f79c81517634408e57
commit: e457d60daafe66534283e0f79c81517634408e57
branch: main
author: Sam Gross <[email protected]>
committer: colesbury <[email protected]>
date: 2025-11-23T10:07:17-05:00
summary:

gh-120158: Fix inconsistent monitoring state when setting events too frequently 
(gh-141845)

If we overflowed the global version counter (i.e., after 2*24 calls to
`_PyMonitoring_SetEvents`), we bailed out after setting global monitoring
events but before instrumenting code objects, which led to assertion errors
later on.

Also add a `time.sleep()` to `test_free_threading.test_monitoring` to avoid
overflowing the global version counter.

files:
A 
Misc/NEWS.d/next/Core_and_Builtins/2025-11-22-10-43-26.gh-issue-120158.41_rXd.rst
M Lib/test/test_free_threading/test_monitoring.py
M Python/instrumentation.c

diff --git a/Lib/test/test_free_threading/test_monitoring.py 
b/Lib/test/test_free_threading/test_monitoring.py
index 407bf7cbdee917..4fbd3f3415cb32 100644
--- a/Lib/test/test_free_threading/test_monitoring.py
+++ b/Lib/test/test_free_threading/test_monitoring.py
@@ -73,6 +73,9 @@ def test_instrumentation(self):
                 break
 
             self.during_threads()
+            # Sleep to avoid setting monitoring events too rapidly and
+            # overflowing the global version counter
+            time.sleep(0.0001)
 
         self.after_test()
 
diff --git 
a/Misc/NEWS.d/next/Core_and_Builtins/2025-11-22-10-43-26.gh-issue-120158.41_rXd.rst
 
b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-22-10-43-26.gh-issue-120158.41_rXd.rst
new file mode 100644
index 00000000000000..b3b5f252ac07cb
--- /dev/null
+++ 
b/Misc/NEWS.d/next/Core_and_Builtins/2025-11-22-10-43-26.gh-issue-120158.41_rXd.rst
@@ -0,0 +1,2 @@
+Fix inconsistent state when enabling or disabling monitoring events too many
+times.
diff --git a/Python/instrumentation.c b/Python/instrumentation.c
index 72b7433022fdea..9e750433cffa89 100644
--- a/Python/instrumentation.c
+++ b/Python/instrumentation.c
@@ -2021,12 +2021,12 @@ _PyMonitoring_SetEvents(int tool_id, 
_PyMonitoringEventSet events)
     if (existing_events == events) {
         return 0;
     }
-    set_events(&interp->monitors, tool_id, events);
     uint32_t new_version = global_version(interp) + 
MONITORING_VERSION_INCREMENT;
     if (new_version == 0) {
         PyErr_Format(PyExc_OverflowError, "events set too many times");
         return -1;
     }
+    set_events(&interp->monitors, tool_id, events);
     set_global_version(tstate, new_version);
 #ifdef _Py_TIER2
     _Py_Executors_InvalidateAll(interp, 1);

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to