mirror of https://github.com/python/cpython.git
288 lines
7.8 KiB
Python
288 lines
7.8 KiB
Python
import _testcapi
|
|
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])
|
|
|
|
def test_T_BOOL(self):
|
|
spam_old = _testcapi._test_structmembersType_OldAPI()
|
|
spam_new = _testcapi._test_structmembersType_NewAPI()
|
|
|
|
def writer():
|
|
for _ in range(1_000):
|
|
# different code paths for True and False
|
|
spam_old.T_BOOL = True
|
|
spam_new.T_BOOL = True
|
|
spam_old.T_BOOL = False
|
|
spam_new.T_BOOL = False
|
|
|
|
def reader():
|
|
for _ in range(1_000):
|
|
spam_old.T_BOOL
|
|
spam_new.T_BOOL
|
|
|
|
run_in_threads([writer, reader])
|
|
|
|
def test_T_BYTE(self):
|
|
spam_old = _testcapi._test_structmembersType_OldAPI()
|
|
spam_new = _testcapi._test_structmembersType_NewAPI()
|
|
|
|
def writer():
|
|
for _ in range(1_000):
|
|
spam_old.T_BYTE = 0
|
|
spam_new.T_BYTE = 0
|
|
|
|
def reader():
|
|
for _ in range(1_000):
|
|
spam_old.T_BYTE
|
|
spam_new.T_BYTE
|
|
|
|
run_in_threads([writer, reader])
|
|
|
|
def test_T_UBYTE(self):
|
|
spam_old = _testcapi._test_structmembersType_OldAPI()
|
|
spam_new = _testcapi._test_structmembersType_NewAPI()
|
|
|
|
def writer():
|
|
for _ in range(1_000):
|
|
spam_old.T_UBYTE = 0
|
|
spam_new.T_UBYTE = 0
|
|
|
|
def reader():
|
|
for _ in range(1_000):
|
|
spam_old.T_UBYTE
|
|
spam_new.T_UBYTE
|
|
|
|
run_in_threads([writer, reader])
|
|
|
|
def test_T_SHORT(self):
|
|
spam_old = _testcapi._test_structmembersType_OldAPI()
|
|
spam_new = _testcapi._test_structmembersType_NewAPI()
|
|
|
|
def writer():
|
|
for _ in range(1_000):
|
|
spam_old.T_SHORT = 0
|
|
spam_new.T_SHORT = 0
|
|
|
|
def reader():
|
|
for _ in range(1_000):
|
|
spam_old.T_SHORT
|
|
spam_new.T_SHORT
|
|
|
|
run_in_threads([writer, reader])
|
|
|
|
def test_T_USHORT(self):
|
|
spam_old = _testcapi._test_structmembersType_OldAPI()
|
|
spam_new = _testcapi._test_structmembersType_NewAPI()
|
|
|
|
def writer():
|
|
for _ in range(1_000):
|
|
spam_old.T_USHORT = 0
|
|
spam_new.T_USHORT = 0
|
|
|
|
def reader():
|
|
for _ in range(1_000):
|
|
spam_old.T_USHORT
|
|
spam_new.T_USHORT
|
|
|
|
run_in_threads([writer, reader])
|
|
|
|
def test_T_INT(self):
|
|
spam_old = _testcapi._test_structmembersType_OldAPI()
|
|
spam_new = _testcapi._test_structmembersType_NewAPI()
|
|
|
|
def writer():
|
|
for _ in range(1_000):
|
|
spam_old.T_INT = 0
|
|
spam_new.T_INT = 0
|
|
|
|
def reader():
|
|
for _ in range(1_000):
|
|
spam_old.T_INT
|
|
spam_new.T_INT
|
|
|
|
run_in_threads([writer, reader])
|
|
|
|
def test_T_UINT(self):
|
|
spam_old = _testcapi._test_structmembersType_OldAPI()
|
|
spam_new = _testcapi._test_structmembersType_NewAPI()
|
|
|
|
def writer():
|
|
for _ in range(1_000):
|
|
spam_old.T_UINT = 0
|
|
spam_new.T_UINT = 0
|
|
|
|
def reader():
|
|
for _ in range(1_000):
|
|
spam_old.T_UINT
|
|
spam_new.T_UINT
|
|
|
|
run_in_threads([writer, reader])
|
|
|
|
def test_T_LONG(self):
|
|
spam_old = _testcapi._test_structmembersType_OldAPI()
|
|
spam_new = _testcapi._test_structmembersType_NewAPI()
|
|
|
|
def writer():
|
|
for _ in range(1_000):
|
|
spam_old.T_LONG = 0
|
|
spam_new.T_LONG = 0
|
|
|
|
def reader():
|
|
for _ in range(1_000):
|
|
spam_old.T_LONG
|
|
spam_new.T_LONG
|
|
|
|
run_in_threads([writer, reader])
|
|
|
|
def test_T_ULONG(self):
|
|
spam_old = _testcapi._test_structmembersType_OldAPI()
|
|
spam_new = _testcapi._test_structmembersType_NewAPI()
|
|
|
|
def writer():
|
|
for _ in range(1_000):
|
|
spam_old.T_ULONG = 0
|
|
spam_new.T_ULONG = 0
|
|
|
|
def reader():
|
|
for _ in range(1_000):
|
|
spam_old.T_ULONG
|
|
spam_new.T_ULONG
|
|
|
|
run_in_threads([writer, reader])
|
|
|
|
def test_T_PYSSIZET(self):
|
|
spam_old = _testcapi._test_structmembersType_OldAPI()
|
|
spam_new = _testcapi._test_structmembersType_NewAPI()
|
|
|
|
def writer():
|
|
for _ in range(1_000):
|
|
spam_old.T_PYSSIZET = 0
|
|
spam_new.T_PYSSIZET = 0
|
|
|
|
def reader():
|
|
for _ in range(1_000):
|
|
spam_old.T_PYSSIZET
|
|
spam_new.T_PYSSIZET
|
|
|
|
run_in_threads([writer, reader])
|
|
|
|
def test_T_FLOAT(self):
|
|
spam_old = _testcapi._test_structmembersType_OldAPI()
|
|
spam_new = _testcapi._test_structmembersType_NewAPI()
|
|
|
|
def writer():
|
|
for _ in range(1_000):
|
|
spam_old.T_FLOAT = 0.0
|
|
spam_new.T_FLOAT = 0.0
|
|
|
|
def reader():
|
|
for _ in range(1_000):
|
|
spam_old.T_FLOAT
|
|
spam_new.T_FLOAT
|
|
|
|
run_in_threads([writer, reader])
|
|
|
|
def test_T_DOUBLE(self):
|
|
spam_old = _testcapi._test_structmembersType_OldAPI()
|
|
spam_new = _testcapi._test_structmembersType_NewAPI()
|
|
|
|
def writer():
|
|
for _ in range(1_000):
|
|
spam_old.T_DOUBLE = 0.0
|
|
spam_new.T_DOUBLE = 0.0
|
|
|
|
def reader():
|
|
for _ in range(1_000):
|
|
spam_old.T_DOUBLE
|
|
spam_new.T_DOUBLE
|
|
|
|
run_in_threads([writer, reader])
|
|
|
|
def test_T_LONGLONG(self):
|
|
spam_old = _testcapi._test_structmembersType_OldAPI()
|
|
spam_new = _testcapi._test_structmembersType_NewAPI()
|
|
|
|
def writer():
|
|
for _ in range(1_000):
|
|
spam_old.T_LONGLONG = 0
|
|
spam_new.T_LONGLONG = 0
|
|
|
|
def reader():
|
|
for _ in range(1_000):
|
|
spam_old.T_LONGLONG
|
|
spam_new.T_LONGLONG
|
|
|
|
run_in_threads([writer, reader])
|
|
|
|
def test_T_ULONGLONG(self):
|
|
spam_old = _testcapi._test_structmembersType_OldAPI()
|
|
spam_new = _testcapi._test_structmembersType_NewAPI()
|
|
|
|
def writer():
|
|
for _ in range(1_000):
|
|
spam_old.T_ULONGLONG = 0
|
|
spam_new.T_ULONGLONG = 0
|
|
|
|
def reader():
|
|
for _ in range(1_000):
|
|
spam_old.T_ULONGLONG
|
|
spam_new.T_ULONGLONG
|
|
|
|
run_in_threads([writer, reader])
|
|
|
|
def test_T_CHAR(self):
|
|
spam_old = _testcapi._test_structmembersType_OldAPI()
|
|
spam_new = _testcapi._test_structmembersType_NewAPI()
|
|
|
|
def writer():
|
|
for _ in range(1_000):
|
|
spam_old.T_CHAR = "c"
|
|
spam_new.T_CHAR = "c"
|
|
|
|
def reader():
|
|
for _ in range(1_000):
|
|
spam_old.T_CHAR
|
|
spam_new.T_CHAR
|
|
|
|
run_in_threads([writer, reader])
|