]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-120158: Fix inconsistent monitoring state when setting events too frequentl...
authorSam Gross <colesbury@gmail.com>
Sun, 23 Nov 2025 15:30:37 +0000 (10:30 -0500)
committerGitHub <noreply@github.com>
Sun, 23 Nov 2025 15:30:37 +0000 (15:30 +0000)
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.
(cherry picked from commit e457d60daafe66534283e0f79c81517634408e57)

Lib/test/test_free_threading/test_monitoring.py
Misc/NEWS.d/next/Core and Builtins/2025-11-22-10-43-26.gh-issue-120158.41_rXd.rst [new file with mode: 0644]
Python/instrumentation.c

index 35aaea76a1912c4683aa0e8e63e50f5ff1d2b94e..1375e8e0c36448c241a007163dc3f699886f7aa7 100644 (file)
@@ -72,6 +72,9 @@ class InstrumentationMultiThreadedMixin:
                 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 (file)
index 0000000..b3b5f25
--- /dev/null
@@ -0,0 +1,2 @@
+Fix inconsistent state when enabling or disabling monitoring events too many
+times.
index 5f10cdfc7de98920d72e9e77cb013c36043740e7..21d9692b586163e5c168aec801e0d17a528d755b 100644 (file)
@@ -1989,12 +1989,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);