summaryrefslogtreecommitdiffstats
path: root/Lib/threading.py
diff options
context:
space:
mode:
authorEric Snow <ericsnowcurrently@gmail.com>2023-11-28 02:01:05 (GMT)
committerGitHub <noreply@github.com>2023-11-28 02:01:05 (GMT)
commit0122b4d7c92855e97912cf827dd81d836725c9a4 (patch)
tree4a1e3355d8bf5e9d2b9f36745518f56f590df021 /Lib/threading.py
parent82ae5a609d9a2c0ff2384527a18ff1caf7410052 (diff)
downloadcpython-0122b4d7c92855e97912cf827dd81d836725c9a4.zip
cpython-0122b4d7c92855e97912cf827dd81d836725c9a4.tar.gz
cpython-0122b4d7c92855e97912cf827dd81d836725c9a4.tar.bz2
[3.12] gh-105716: Support Background Threads in Subinterpreters Consistently (gh-109921) (gh-110707)
The existence of background threads running on a subinterpreter was preventing interpreters from getting properly destroyed, as well as impacting the ability to run the interpreter again. It also affected how we wait for non-daemon threads to finish. We add PyInterpreterState.threads.main, with some internal C-API functions. (cherry-picked from commit 1dd9dee45d2591b4e701039d1673282380696849)
Diffstat (limited to 'Lib/threading.py')
-rw-r--r--Lib/threading.py4
1 files changed, 3 insertions, 1 deletions
diff --git a/Lib/threading.py b/Lib/threading.py
index a746dee..624e7ed 100644
--- a/Lib/threading.py
+++ b/Lib/threading.py
@@ -37,6 +37,7 @@ _daemon_threads_allowed = _thread.daemon_threads_allowed
_allocate_lock = _thread.allocate_lock
_set_sentinel = _thread._set_sentinel
get_ident = _thread.get_ident
+_is_main_interpreter = _thread._is_main_interpreter
try:
get_native_id = _thread.get_native_id
_HAVE_THREAD_NATIVE_ID = True
@@ -1566,7 +1567,7 @@ def _shutdown():
# the main thread's tstate_lock - that won't happen until the interpreter
# is nearly dead. So we release it here. Note that just calling _stop()
# isn't enough: other threads may already be waiting on _tstate_lock.
- if _main_thread._is_stopped:
+ if _main_thread._is_stopped and _is_main_interpreter():
# _shutdown() was already called
return
@@ -1619,6 +1620,7 @@ def main_thread():
In normal conditions, the main thread is the thread from which the
Python interpreter was started.
"""
+ # XXX Figure this out for subinterpreters. (See gh-75698.)
return _main_thread
# get thread-local implementation, either from the thread