mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +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])
 |