mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
gh-87135: Hang non-main threads that attempt to acquire the GIL during finalization (GH-105805)
Instead of surprise crashes and memory corruption, we now hang threads that attempt to re-enter the Python interpreter after Python runtime finalization has started. These are typically daemon threads (our long standing mis-feature) but could also be threads spawned by extension modules that then try to call into Python. This marks the `PyThread_exit_thread` public C API as deprecated as there is no plausible safe way to accomplish that on any supported platform in the face of things like C++ code with finalizers anywhere on a thread's stack. Doing this was the least bad option. Co-authored-by: Gregory P. Smith <greg@krypto.org>
This commit is contained in:
parent
113b2d7583
commit
8cc5aa47ee
10 changed files with 247 additions and 29 deletions
|
@ -16,6 +16,7 @@
|
|||
#undef destructor
|
||||
#endif
|
||||
#include <signal.h>
|
||||
#include <unistd.h> /* pause(), also getthrid() on OpenBSD */
|
||||
|
||||
#if defined(__linux__)
|
||||
# include <sys/syscall.h> /* syscall(SYS_gettid) */
|
||||
|
@ -23,8 +24,6 @@
|
|||
# include <pthread_np.h> /* pthread_getthreadid_np() */
|
||||
#elif defined(__FreeBSD_kernel__)
|
||||
# include <sys/syscall.h> /* syscall(SYS_thr_self) */
|
||||
#elif defined(__OpenBSD__)
|
||||
# include <unistd.h> /* getthrid() */
|
||||
#elif defined(_AIX)
|
||||
# include <sys/thread.h> /* thread_self() */
|
||||
#elif defined(__NetBSD__)
|
||||
|
@ -419,6 +418,18 @@ PyThread_exit_thread(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
void _Py_NO_RETURN
|
||||
PyThread_hang_thread(void)
|
||||
{
|
||||
while (1) {
|
||||
#if defined(__wasi__)
|
||||
sleep(9999999); // WASI doesn't have pause() ?!
|
||||
#else
|
||||
pause();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef USE_SEMAPHORES
|
||||
|
||||
/*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue