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()
self.function(*self.args, **self.kwargs)
self.finished.set()
+
# Special thread class to represent the main thread
-# This is garbage collected through an exit handler
class _MainThread(Thread):
while t:
t.join()
t = _pickSomeNonDaemonThread()
- _main_thread._delete()
def _pickSomeNonDaemonThread():
for t in enumerate():