summaryrefslogtreecommitdiffstats
path: root/Lib/threading.py
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2019-06-14 16:55:22 (GMT)
committerGitHub <noreply@github.com>2019-06-14 16:55:22 (GMT)
commit066e5b1a917ec2134e8997d2cadd815724314252 (patch)
tree963b0b6d7d2ae0c580aa48da0d1423930bf2a32d /Lib/threading.py
parent212646cae6b7c4ddc8d98c8b9b6d39a5f259e864 (diff)
downloadcpython-066e5b1a917ec2134e8997d2cadd815724314252.zip
cpython-066e5b1a917ec2134e8997d2cadd815724314252.tar.gz
cpython-066e5b1a917ec2134e8997d2cadd815724314252.tar.bz2
bpo-37266: Daemon threads are now denied in subinterpreters (GH-14049)
In a subinterpreter, spawning a daemon thread now raises an exception. Daemon threads were never supported in subinterpreters. Previously, the subinterpreter finalization crashed with a Pyton fatal error if a daemon thread was still running. * Add _thread._is_main_interpreter() * threading.Thread.start() now raises RuntimeError if the thread is a daemon thread and the method is called from a subinterpreter. * The _thread module now uses Argument Clinic for the new function. * Use textwrap.dedent() in test_threading.SubinterpThreadingTests
Diffstat (limited to 'Lib/threading.py')
-rw-r--r--Lib/threading.py6
1 files changed, 6 insertions, 0 deletions
diff --git a/Lib/threading.py b/Lib/threading.py
index 7c6d404..01a15a6 100644
--- a/Lib/threading.py
+++ b/Lib/threading.py
@@ -34,6 +34,7 @@ _start_new_thread = _thread.start_new_thread
_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
@@ -846,6 +847,11 @@ class Thread:
if self._started.is_set():
raise RuntimeError("threads can only be started once")
+
+ if self.daemon and not _is_main_interpreter():
+ raise RuntimeError("daemon thread are not supported "
+ "in subinterpreters")
+
with _active_limbo_lock:
_limbo[self] = self
try: