summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2017-10-02 15:20:01 (GMT)
committerAntoine Pitrou <pitrou@free.fr>2017-10-02 15:20:01 (GMT)
commitac6245a31f9a757db0520722c592cb7fdcb55eb0 (patch)
treea20a85df675e6b29d07c1e137d55c652c557d21a /Lib/test
parent66fb5ef3bb9e36187a0e5052dfd99899447df671 (diff)
downloadcpython-ac6245a31f9a757db0520722c592cb7fdcb55eb0.zip
cpython-ac6245a31f9a757db0520722c592cb7fdcb55eb0.tar.gz
cpython-ac6245a31f9a757db0520722c592cb7fdcb55eb0.tar.bz2
[3.6] bpo-31516: current_thread() should not return a dummy thread at shutdown (GH-3673) (#3856)
bpo-31516: current_thread() should not return a dummy thread at shutdown (cherry picked from commit 1023dbbcb7f05e76053486ae7ef7f73b4cdc5398)
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_threading.py29
1 files changed, 29 insertions, 0 deletions
diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py
index 9cadc0f..b42314f 100644
--- a/Lib/test/test_threading.py
+++ b/Lib/test/test_threading.py
@@ -542,6 +542,35 @@ class ThreadTests(BaseTestCase):
self.assertEqual(err, b"")
self.assertEqual(data, "Thread-1\nTrue\nTrue\n")
+ def test_main_thread_during_shutdown(self):
+ # bpo-31516: current_thread() should still point to the main thread
+ # at shutdown
+ code = """if 1:
+ import gc, threading
+
+ main_thread = threading.current_thread()
+ assert main_thread is threading.main_thread() # sanity check
+
+ class RefCycle:
+ def __init__(self):
+ self.cycle = self
+
+ def __del__(self):
+ print("GC:",
+ threading.current_thread() is main_thread,
+ threading.main_thread() is main_thread,
+ threading.enumerate() == [main_thread])
+
+ RefCycle()
+ gc.collect() # sanity check
+ x = RefCycle()
+ """
+ _, out, err = assert_python_ok("-c", code)
+ data = out.decode()
+ self.assertEqual(err, b"")
+ self.assertEqual(data.splitlines(),
+ ["GC: True True True"] * 2)
+
def test_tstate_lock(self):
# Test an implementation detail of Thread objects.
started = _thread.allocate_lock()