mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	[3.13] gh-127020: Make PyCode_GetCode thread-safe for free threading (GH-127043) (GH-127107)
				
					
				
			Some fields in PyCodeObject are lazily initialized. Use atomics and
critical sections to make their initializations and accesses thread-safe.
(cherry picked from commit 3926842117)
Co-authored-by: Sam Gross <colesbury@gmail.com>
			
			
This commit is contained in:
		
							parent
							
								
									c09366b1fe
								
							
						
					
					
						commit
						c74331413e
					
				
					 3 changed files with 86 additions and 28 deletions
				
			
		
							
								
								
									
										30
									
								
								Lib/test/test_free_threading/test_code.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								Lib/test/test_free_threading/test_code.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | |||
| import unittest | ||||
| 
 | ||||
| from threading import Thread | ||||
| from unittest import TestCase | ||||
| 
 | ||||
| from test.support import threading_helper | ||||
| 
 | ||||
| @threading_helper.requires_working_threading() | ||||
| class TestCode(TestCase): | ||||
|     def test_code_attrs(self): | ||||
|         """Test concurrent accesses to lazily initialized code attributes""" | ||||
|         code_objects = [] | ||||
|         for _ in range(1000): | ||||
|             code_objects.append(compile("a + b", "<string>", "eval")) | ||||
| 
 | ||||
|         def run_in_thread(): | ||||
|             for code in code_objects: | ||||
|                 self.assertIsInstance(code.co_code, bytes) | ||||
|                 self.assertIsInstance(code.co_freevars, tuple) | ||||
|                 self.assertIsInstance(code.co_varnames, tuple) | ||||
| 
 | ||||
|         threads = [Thread(target=run_in_thread) for _ in range(2)] | ||||
|         for thread in threads: | ||||
|             thread.start() | ||||
|         for thread in threads: | ||||
|             thread.join() | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     unittest.main() | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Miss Islington (bot)
						Miss Islington (bot)