mirror of
https://github.com/python/cpython.git
synced 2025-09-09 18:32:22 +00:00
gh-115832: Fix instrumentation version mismatch during interpreter shutdown (#115856)
A previous commit introduced a bug to `interpreter_clear()`: it set `interp->ceval.instrumentation_version` to 0, without making the corresponding change to `tstate->eval_breaker` (which holds a thread-local copy of the version). After this happens, Python code can still run due to object finalizers during a GC, and the version check in bytecodes.c will see a different result than the one in instrumentation.c causing an infinite loop. The fix itself is straightforward: clear `tstate->eval_breaker` when clearing `interp->ceval.instrumentation_version`.
This commit is contained in:
parent
15dc2979bc
commit
0adfa8482d
4 changed files with 53 additions and 2 deletions
|
@ -9,7 +9,8 @@ import textwrap
|
|||
import types
|
||||
import unittest
|
||||
import asyncio
|
||||
from test.support import requires_specialization
|
||||
from test import support
|
||||
from test.support import requires_specialization, script_helper
|
||||
|
||||
PAIR = (0,1)
|
||||
|
||||
|
@ -1858,3 +1859,12 @@ class TestTier2Optimizer(CheckEvents):
|
|||
sys.monitoring.register_callback(TEST_TOOL, E.LINE, None)
|
||||
sys.monitoring.set_events(TEST_TOOL, 0)
|
||||
self.assertGreater(len(events), 250)
|
||||
|
||||
class TestMonitoringAtShutdown(unittest.TestCase):
|
||||
|
||||
def test_monitoring_live_at_shutdown(self):
|
||||
# gh-115832: An object destructor running during the final GC of
|
||||
# interpreter shutdown triggered an infinite loop in the
|
||||
# instrumentation code.
|
||||
script = support.findfile("_test_monitoring_shutdown.py")
|
||||
script_helper.run_test_script(script)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue