mirror of
https://github.com/python/cpython.git
synced 2025-07-23 03:05:38 +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_AcquireLock(PyInterpreterState *interp);
|
||||||
extern void _PyImport_ReleaseLock(PyInterpreterState *interp);
|
extern void _PyImport_ReleaseLock(PyInterpreterState *interp);
|
||||||
|
extern void _PyImport_ReInitLock(PyInterpreterState *interp);
|
||||||
|
|
||||||
// This is used exclusively for the sys and builtins modules:
|
// This is used exclusively for the sys and builtins modules:
|
||||||
extern int _PyImport_FixupBuiltin(
|
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);
|
_PyEval_StartTheWorldAll(&_PyRuntime);
|
||||||
_PyThreadState_DeleteList(list);
|
_PyThreadState_DeleteList(list);
|
||||||
|
|
||||||
|
_PyImport_ReInitLock(tstate->interp);
|
||||||
_PyImport_ReleaseLock(tstate->interp);
|
_PyImport_ReleaseLock(tstate->interp);
|
||||||
|
|
||||||
_PySignal_AfterFork();
|
_PySignal_AfterFork();
|
||||||
|
|
|
@ -120,6 +120,13 @@ _PyImport_ReleaseLock(PyInterpreterState *interp)
|
||||||
_PyRecursiveMutex_Unlock(&IMPORT_LOCK(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 */
|
/* sys.modules */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue