mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	[3.13] gh-126688: Reinit import lock after fork (GH-126692) (GH-126765)
The PyMutex implementation supports unlocking after fork because we
clear the list of waiters in parking_lot.c. This doesn't work as well
for _PyRecursiveMutex because on some systems, such as SerenityOS, the
thread id is not preserved across fork().
(cherry picked from commit 5610860840)
Co-authored-by: Sam Gross <colesbury@gmail.com>
			
			
This commit is contained in:
		
							parent
							
								
									3dab1cebf7
								
							
						
					
					
						commit
						13fe8f946e
					
				
					 4 changed files with 11 additions and 0 deletions
				
			
		|  | @ -21,6 +21,7 @@ extern int _PyImport_SetModuleString(const char *name, PyObject* module); | |||
| 
 | ||||
| extern void _PyImport_AcquireLock(PyInterpreterState *interp); | ||||
| extern void _PyImport_ReleaseLock(PyInterpreterState *interp); | ||||
| extern void _PyImport_ReInitLock(PyInterpreterState *interp); | ||||
| 
 | ||||
| // This is used exclusively for the sys and builtins modules:
 | ||||
| extern int _PyImport_FixupBuiltin( | ||||
|  |  | |||
|  | @ -0,0 +1,2 @@ | |||
| Fix a crash when calling :func:`os.fork` on some operating systems, | ||||
| including SerenityOS. | ||||
|  | @ -678,6 +678,7 @@ PyOS_AfterFork_Child(void) | |||
|     _PyEval_StartTheWorldAll(&_PyRuntime); | ||||
|     _PyThreadState_DeleteList(list); | ||||
| 
 | ||||
|     _PyImport_ReInitLock(tstate->interp); | ||||
|     _PyImport_ReleaseLock(tstate->interp); | ||||
| 
 | ||||
|     _PySignal_AfterFork(); | ||||
|  |  | |||
|  | @ -120,6 +120,13 @@ _PyImport_ReleaseLock(PyInterpreterState *interp) | |||
|     _PyRecursiveMutex_Unlock(&IMPORT_LOCK(interp)); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| _PyImport_ReInitLock(PyInterpreterState *interp) | ||||
| { | ||||
|     // gh-126688: Thread id may change after fork() on some operating systems.
 | ||||
|     IMPORT_LOCK(interp).thread = PyThread_get_thread_ident_ex(); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /***************/ | ||||
| /* sys.modules */ | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Miss Islington (bot)
						Miss Islington (bot)