https://github.com/python/cpython/commit/5610860840aa71b186fc5639211dd268b817d65f
commit: 5610860840aa71b186fc5639211dd268b817d65f
branch: main
author: Sam Gross <[email protected]>
committer: colesbury <[email protected]>
date: 2024-11-12T15:53:58-05:00
summary:
gh-126688: Reinit import lock after fork (#126692)
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().
files:
A
Misc/NEWS.d/next/Core_and_Builtins/2024-11-11-17-02-48.gh-issue-126688.QiOXUi.rst
M Include/internal/pycore_import.h
M Modules/posixmodule.c
M Python/import.c
diff --git a/Include/internal/pycore_import.h b/Include/internal/pycore_import.h
index 290ba95e1a0ad7..318c712bdfa174 100644
--- a/Include/internal/pycore_import.h
+++ b/Include/internal/pycore_import.h
@@ -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(
diff --git
a/Misc/NEWS.d/next/Core_and_Builtins/2024-11-11-17-02-48.gh-issue-126688.QiOXUi.rst
b/Misc/NEWS.d/next/Core_and_Builtins/2024-11-11-17-02-48.gh-issue-126688.QiOXUi.rst
new file mode 100644
index 00000000000000..30aa5722f0ea02
--- /dev/null
+++
b/Misc/NEWS.d/next/Core_and_Builtins/2024-11-11-17-02-48.gh-issue-126688.QiOXUi.rst
@@ -0,0 +1,2 @@
+Fix a crash when calling :func:`os.fork` on some operating systems,
+including SerenityOS.
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 1ce2baecb8a964..da7399de86f213 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -678,6 +678,7 @@ PyOS_AfterFork_Child(void)
_PyEval_StartTheWorldAll(&_PyRuntime);
_PyThreadState_DeleteList(list);
+ _PyImport_ReInitLock(tstate->interp);
_PyImport_ReleaseLock(tstate->interp);
_PySignal_AfterFork();
diff --git a/Python/import.c b/Python/import.c
index 29bd8bf68ff5e1..09fe95fa1fb647 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -122,6 +122,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 */
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]