You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.7 KiB
103 lines
3.7 KiB
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
|
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hrn=C4=8Diar?= <thrnciar@redhat.com> |
|
Date: Tue, 7 Dec 2021 14:41:59 +0100 |
|
Subject: [PATCH] 00371: Revert "bpo-1596321: Fix threading._shutdown() for the |
|
main thread (GH-28549) (GH-28589)" |
|
|
|
This reverts commit 38c67738c64304928c68d5c2bd78bbb01d979b94. It |
|
introduced regression causing FreeIPA's tests to fail. |
|
|
|
For more info see: |
|
https://bodhi.fedoraproject.org/updates/FEDORA-2021-e152ce5f31 |
|
https://github.com/GrahamDumpleton/mod_wsgi/issues/730 |
|
--- |
|
Lib/test/test_threading.py | 33 --------------------------------- |
|
Lib/threading.py | 25 ++++++++----------------- |
|
2 files changed, 8 insertions(+), 50 deletions(-) |
|
|
|
diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py |
|
index 9c6561c099..84714c03fe 100644 |
|
--- a/Lib/test/test_threading.py |
|
+++ b/Lib/test/test_threading.py |
|
@@ -956,39 +956,6 @@ def test_debug_deprecation(self): |
|
b'is deprecated and will be removed in Python 3.12') |
|
self.assertIn(msg, err) |
|
|
|
- def test_import_from_another_thread(self): |
|
- # bpo-1596321: If the threading module is first import from a thread |
|
- # different than the main thread, threading._shutdown() must handle |
|
- # this case without logging an error at Python exit. |
|
- code = textwrap.dedent(''' |
|
- import _thread |
|
- import sys |
|
- |
|
- event = _thread.allocate_lock() |
|
- event.acquire() |
|
- |
|
- def import_threading(): |
|
- import threading |
|
- event.release() |
|
- |
|
- if 'threading' in sys.modules: |
|
- raise Exception('threading is already imported') |
|
- |
|
- _thread.start_new_thread(import_threading, ()) |
|
- |
|
- # wait until the threading module is imported |
|
- event.acquire() |
|
- event.release() |
|
- |
|
- if 'threading' not in sys.modules: |
|
- raise Exception('threading is not imported') |
|
- |
|
- # don't wait until the thread completes |
|
- ''') |
|
- rc, out, err = assert_python_ok("-c", code) |
|
- self.assertEqual(out, b'') |
|
- self.assertEqual(err, b'') |
|
- |
|
|
|
class ThreadJoinOnShutdown(BaseTestCase): |
|
|
|
diff --git a/Lib/threading.py b/Lib/threading.py |
|
index 4f72938551..18c10e6489 100644 |
|
--- a/Lib/threading.py |
|
+++ b/Lib/threading.py |
|
@@ -1546,29 +1546,20 @@ def _shutdown(): |
|
|
|
global _SHUTTING_DOWN |
|
_SHUTTING_DOWN = True |
|
+ # Main thread |
|
+ tlock = _main_thread._tstate_lock |
|
+ # The main thread isn't finished yet, so its thread state lock can't have |
|
+ # been released. |
|
+ assert tlock is not None |
|
+ assert tlock.locked() |
|
+ tlock.release() |
|
+ _main_thread._stop() |
|
|
|
# Call registered threading atexit functions before threads are joined. |
|
# Order is reversed, similar to atexit. |
|
for atexit_call in reversed(_threading_atexits): |
|
atexit_call() |
|
|
|
- # Main thread |
|
- if _main_thread.ident == get_ident(): |
|
- tlock = _main_thread._tstate_lock |
|
- # The main thread isn't finished yet, so its thread state lock can't |
|
- # have been released. |
|
- assert tlock is not None |
|
- assert tlock.locked() |
|
- tlock.release() |
|
- _main_thread._stop() |
|
- else: |
|
- # bpo-1596321: _shutdown() must be called in the main thread. |
|
- # If the threading module was not imported by the main thread, |
|
- # _main_thread is the thread which imported the threading module. |
|
- # In this case, ignore _main_thread, similar behavior than for threads |
|
- # spawned by C libraries or using _thread.start_new_thread(). |
|
- pass |
|
- |
|
# Join all non-deamon threads |
|
while True: |
|
with _shutdown_locks_lock:
|
|
|