]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Add comments about _Py_LOCK_DONT_DETACH usage. (#153817)
authorNeil Schemenauer <nas-github@arctrix.com>
Sat, 1 Aug 2026 10:01:26 +0000 (03:01 -0700)
committerGitHub <noreply@github.com>
Sat, 1 Aug 2026 10:01:26 +0000 (15:31 +0530)
Include/internal/pycore_lock.h
Objects/unicodeobject.c

index e31d8b4e5c68c92db555ee89a45087baeb261f18..13224a0572934b4ed0261b52c73387ac6eb08cc9 100644 (file)
@@ -34,6 +34,11 @@ _PyMutex_at_fork_reinit(PyMutex *m)
 
 typedef enum _PyLockFlags {
     // Do not detach/release the GIL when waiting on the lock.
+    //
+    // Note that code executed while holding a mutex with this flag must
+    // not detach, reach a safepoint or initiate a stop-the-world pause.
+    // Otherwise, a non-detaching waiter may remain waiting for this mutex and
+    // prevent the pause from completing.
     _Py_LOCK_DONT_DETACH = 0,
 
     // Detach/release the GIL while waiting on the lock.
index eec02f662e79059ff8f7deb0cba047910dfef1ae..4b4f7178ec9faf6c14f6ab9cf57428cd3bde9987 100644 (file)
@@ -14726,6 +14726,15 @@ intern_common(PyInterpreterState *interp, PyObject *s /* stolen */,
     }
 #endif
 
+    // Why _Py_LOCK_DONT_DETACH is used here: waiting for the interned mutex
+    // must not detach the thread state. Extension code is expected to
+    // detach before blocking on opaque external synchronization. However,
+    // the lock used for C++ static initialization is hidden, making
+    // that difficult, and it is common for C++ extensions to call
+    // PyUnicode_InternFromString() from static initializers. Detaching here
+    // can therefore deadlock: a stop-the-world pause may prevent the lock
+    // owner from reattaching while the pause waits for another attached
+    // thread blocked on the hidden lock.
     FT_MUTEX_LOCK_FLAGS(INTERN_MUTEX, _Py_LOCK_DONT_DETACH);
     PyObject *t;
     {