mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	Some fields in PyCodeObject are lazily initialized. Use atomics and critical sections to make their initializations and accesses thread-safe.
		
			
				
	
	
		
			30 lines
		
	
	
	
		
			912 B
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			30 lines
		
	
	
	
		
			912 B
		
	
	
	
		
			Python
		
	
	
	
	
	
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()
 |