mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	gh-113743: Use per-interpreter locks for types (#115541)
Move type-lock to per-interpreter lock to avoid heavy contention in interpreters test
This commit is contained in:
		
							parent
							
								
									bce693111b
								
							
						
					
					
						commit
						454d7963e3
					
				
					 3 changed files with 5 additions and 4 deletions
				
			
		|  | @ -22,7 +22,6 @@ struct _types_runtime_state { | ||||||
|     // bpo-42745: next_version_tag remains shared by all interpreters
 |     // bpo-42745: next_version_tag remains shared by all interpreters
 | ||||||
|     // because of static types.
 |     // because of static types.
 | ||||||
|     unsigned int next_version_tag; |     unsigned int next_version_tag; | ||||||
|     PyMutex type_mutex; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -71,6 +70,7 @@ struct types_state { | ||||||
|     struct type_cache type_cache; |     struct type_cache type_cache; | ||||||
|     size_t num_builtins_initialized; |     size_t num_builtins_initialized; | ||||||
|     static_builtin_state builtins[_Py_MAX_STATIC_BUILTIN_TYPES]; |     static_builtin_state builtins[_Py_MAX_STATIC_BUILTIN_TYPES]; | ||||||
|  |     PyMutex mutex; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -60,17 +60,18 @@ class object "PyObject *" "&PyBaseObject_Type" | ||||||
| // in odd behaviors w.r.t. running with the GIL as the outer type lock could
 | // in odd behaviors w.r.t. running with the GIL as the outer type lock could
 | ||||||
| // be released and reacquired during a subclass update if there's contention
 | // be released and reacquired during a subclass update if there's contention
 | ||||||
| // on the subclass lock.
 | // on the subclass lock.
 | ||||||
|  | #define TYPE_LOCK &PyInterpreterState_Get()->types.mutex | ||||||
| #define BEGIN_TYPE_LOCK()                                               \ | #define BEGIN_TYPE_LOCK()                                               \ | ||||||
|     {                                                                   \ |     {                                                                   \ | ||||||
|         _PyCriticalSection _cs;                                         \ |         _PyCriticalSection _cs;                                         \ | ||||||
|         _PyCriticalSection_Begin(&_cs, &_PyRuntime.types.type_mutex);   \ |         _PyCriticalSection_Begin(&_cs, TYPE_LOCK);                      \ | ||||||
| 
 | 
 | ||||||
| #define END_TYPE_LOCK()                                                 \ | #define END_TYPE_LOCK()                                                 \ | ||||||
|         _PyCriticalSection_End(&_cs);                                   \ |         _PyCriticalSection_End(&_cs);                                   \ | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| #define ASSERT_TYPE_LOCK_HELD() \ | #define ASSERT_TYPE_LOCK_HELD() \ | ||||||
|     _Py_CRITICAL_SECTION_ASSERT_MUTEX_LOCKED(&_PyRuntime.types.type_mutex) |     _Py_CRITICAL_SECTION_ASSERT_MUTEX_LOCKED(TYPE_LOCK) | ||||||
| 
 | 
 | ||||||
| #else | #else | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -395,7 +395,7 @@ _Py_COMP_DIAG_POP | ||||||
|         &(runtime)->atexit.mutex, \ |         &(runtime)->atexit.mutex, \ | ||||||
|         &(runtime)->audit_hooks.mutex, \ |         &(runtime)->audit_hooks.mutex, \ | ||||||
|         &(runtime)->allocators.mutex, \ |         &(runtime)->allocators.mutex, \ | ||||||
|         &(runtime)->types.type_mutex, \ |         &(runtime)->_main_interpreter.types.mutex, \ | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dino Viehland
						Dino Viehland