| 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]) |