GeezerVison is showing github.com — gh-158194: Exercise type freezing in concurrent setattr deadlock test… · orsenthil/cpython@769222a
File tree
Expand file treeCollapse file tree
Open diff view settings
Lib/test/test_free_threading
Expand file treeCollapse file tree
Open diff view settings
Collapse file
Copy file name to clipboardExpand all lines: Lib/test/test_free_threading/test_type.py +11-1Lines changed: 11 additions & 1 deletion | Original file line number | Diff line number | Diff line change |
|---|
@@ -375,6 +375,7 @@ def test_concurrent_setattr_deadlock(self): |
375 | 375 | # dict mutex and waited for the type lock. |
376 | 376 | # This is fairly difficult to trigger the race but this N seems to do |
377 | 377 | # it at least sometimes. |
| 378 | + type_freeze = import_helper.import_module("_testlimitedcapi").type_freeze |
378 | 379 | N = 200 |
379 | 380 | done = False |
380 | 381 |
|
@@ -401,6 +402,15 @@ def lister(): |
401 | 402 | while not done: |
402 | 403 | Base.__subclasses__() |
403 | 404 |
|
| 405 | + def freezer(): |
| 406 | + # gh-158194: Exercise type freezing concurrently with slot |
| 407 | + # updates and competing stop-the-world requests. |
| 408 | + barrier.wait() |
| 409 | + for _ in range(10): |
| 410 | + class Frozen: |
| 411 | + pass |
| 412 | + type_freeze(Frozen) |
| 413 | + |
404 | 414 | def basesetter(): |
405 | 415 | nonlocal done |
406 | 416 | barrier.wait() |
@@ -418,7 +428,7 @@ class B(A): |
418 | 428 | # to keep the type lock and the stop-the-world mutex contended, which |
419 | 429 | # is what gets the setters into the window where it happens. |
420 | 430 | targets = (setter, setter, subclasser, subclasser, |
421 | | - lister, lister, basesetter) |
| 431 | + lister, lister, basesetter, freezer) |
422 | 432 | barrier = threading.Barrier(len(targets)) |
423 | 433 | threads = [Thread(target=target) for target in targets] |
424 | 434 | with threading_helper.start_threads(threads): |
|