diff options
author | Victor Stinner <vstinner@python.org> | 2020-04-12 21:45:09 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-12 21:45:09 (GMT) |
commit | 14d5331eb5e6c38be12bad421bd59ad0fac9e448 (patch) | |
tree | 4f9c3351cc8f6cb2fa397b56a4a6c37c547cef87 /Lib | |
parent | 909b87d2bb3d6330d39c48e43f7f50f4d086cc41 (diff) | |
download | cpython-14d5331eb5e6c38be12bad421bd59ad0fac9e448.zip cpython-14d5331eb5e6c38be12bad421bd59ad0fac9e448.tar.gz cpython-14d5331eb5e6c38be12bad421bd59ad0fac9e448.tar.bz2 |
bpo-40234: Revert "bpo-37266: Daemon threads are now denied in subinterpreters (GH-14049)" (GH-19456)
This reverts commit 066e5b1a917ec2134e8997d2cadd815724314252.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_threading.py | 42 | ||||
-rw-r--r-- | Lib/threading.py | 5 |
2 files changed, 19 insertions, 28 deletions
diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 8a4efd6..81e5f70 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -1022,32 +1022,28 @@ class SubinterpThreadingTests(BaseTestCase): # The thread was joined properly. self.assertEqual(os.read(r, 1), b"x") - def test_daemon_thread(self): - r, w = self.pipe() - code = textwrap.dedent(f""" + @cpython_only + def test_daemon_threads_fatal_error(self): + subinterp_code = f"""if 1: + import os import threading - import sys - - channel = open({w}, "w", closefd=False) - - def func(): - pass + import time - thread = threading.Thread(target=func, daemon=True) - try: - thread.start() - except RuntimeError as exc: - print("ok: %s" % exc, file=channel, flush=True) - else: - thread.join() - print("fail: RuntimeError not raised", file=channel, flush=True) - """) - ret = test.support.run_in_subinterp(code) - self.assertEqual(ret, 0) + def f(): + # Make sure the daemon thread is still running when + # Py_EndInterpreter is called. + time.sleep({test.support.SHORT_TIMEOUT}) + threading.Thread(target=f, daemon=True).start() + """ + script = r"""if 1: + import _testcapi - msg = os.read(r, 100).decode().rstrip() - self.assertEqual("ok: daemon thread are not supported " - "in subinterpreters", msg) + _testcapi.run_in_subinterp(%r) + """ % (subinterp_code,) + with test.support.SuppressCrashReport(): + rc, out, err = assert_python_failure("-c", script) + self.assertIn("Fatal Python error: Py_EndInterpreter: " + "not the last thread", err.decode()) class ThreadingExceptionTests(BaseTestCase): diff --git a/Lib/threading.py b/Lib/threading.py index 5424db3..ab29db7 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -35,7 +35,6 @@ _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 @@ -865,10 +864,6 @@ 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: |