mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 10:26:02 +00:00 
			
		
		
		
	 362cd2680b
			
		
	
	
		362cd2680b
		
			
		
	
	
	
	
		
			
			Fix a race in `PyMember_GetOne` and `PyMember_SetOne` for `Py_T_OBJECT_EX`. These functions implement `__slots__` accesses for Python objects.
		
			
				
	
	
		
			43 lines
		
	
	
	
		
			1,001 B
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
	
		
			1,001 B
		
	
	
	
		
			Python
		
	
	
	
	
	
| 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])
 |