mirror of
https://github.com/python/cpython.git
synced 2024-11-28 08:20:55 +01:00
362cd2680b
Fix a race in `PyMember_GetOne` and `PyMember_SetOne` for `Py_T_OBJECT_EX`. These functions implement `__slots__` accesses for Python objects.
44 lines
1001 B
Python
44 lines
1001 B
Python
import threading
|
|
from test.support import threading_helper
|
|
from unittest import TestCase
|
|
|
|
|
|
def run_in_threads(targets):
|
|
"""Run `targets` in separate threads"""
|
|
threads = [
|
|
threading.Thread(target=target)
|
|
for target in targets
|
|
]
|
|
for thread in threads:
|
|
thread.start()
|
|
for thread in threads:
|
|
thread.join()
|
|
|
|
|
|
@threading_helper.requires_working_threading()
|
|
class TestSlots(TestCase):
|
|
|
|
def test_object(self):
|
|
class Spam:
|
|
__slots__ = [
|
|
"eggs",
|
|
]
|
|
|
|
def __init__(self, initial_value):
|
|
self.eggs = initial_value
|
|
|
|
spam = Spam(0)
|
|
iters = 20_000
|
|
|
|
def writer():
|
|
for _ in range(iters):
|
|
spam.eggs += 1
|
|
|
|
def reader():
|
|
for _ in range(iters):
|
|
eggs = spam.eggs
|
|
assert type(eggs) is int
|
|
assert 0 <= eggs <= iters
|
|
|
|
run_in_threads([writer, reader, reader, reader])
|