| 
									
										
										
										
											2024-12-03 15:41:53 +01:00
										 |  |  | import _testcapi | 
					
						
							| 
									
										
										
										
											2024-06-17 14:44:54 -04:00
										 |  |  | 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]) | 
					
						
							| 
									
										
										
										
											2024-12-03 15:41:53 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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]) |