mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			287 lines
		
	
	
	
		
			7.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			287 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])
 | 
