summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_threading.py
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2013-11-12 15:37:55 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2013-11-12 15:37:55 (GMT)
commit45956b9a33af634a2919ade64c1dd223ab2d5235 (patch)
tree6ce6544601bc17c71eb6cacec9f3e0610847affa /Lib/test/test_threading.py
parentc6a140f330178ea8df83fae003ebbccc50b24a2c (diff)
downloadcpython-45956b9a33af634a2919ade64c1dd223ab2d5235.zip
cpython-45956b9a33af634a2919ade64c1dd223ab2d5235.tar.gz
cpython-45956b9a33af634a2919ade64c1dd223ab2d5235.tar.bz2
Close #19466: Clear the frames of daemon threads earlier during the Python
shutdown to call objects destructors. So "unclosed file" resource warnings are now corretly emitted for daemon threads.
Diffstat (limited to 'Lib/test/test_threading.py')
-rw-r--r--Lib/test/test_threading.py50
1 files changed, 50 insertions, 0 deletions
diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py
index 7bd3082..66eace0 100644
--- a/Lib/test/test_threading.py
+++ b/Lib/test/test_threading.py
@@ -617,6 +617,52 @@ class ThreadTests(BaseTestCase):
t.join()
self.assertRaises(ValueError, bs.release)
+ def test_locals_at_exit(self):
+ # Issue #19466: thread locals must not be deleted before destructors
+ # are called
+ rc, out, err = assert_python_ok("-c", """if 1:
+ import threading
+
+ class Atexit:
+ def __del__(self):
+ print("thread_dict.atexit = %r" % thread_dict.atexit)
+
+ thread_dict = threading.local()
+ thread_dict.atexit = "atexit"
+
+ atexit = Atexit()
+ """)
+ self.assertEqual(out.rstrip(), b"thread_dict.atexit = 'atexit'")
+
+ def test_warnings_at_exit(self):
+ # Issue #19466: try to call most destructors at Python shutdown before
+ # destroying Python thread states
+ filename = __file__
+ rc, out, err = assert_python_ok("-Wd", "-c", """if 1:
+ import time
+ import threading
+
+ def open_sleep():
+ # a warning will be emitted when the open file will be
+ # destroyed (without being explicitly closed) while the daemon
+ # thread is destroyed
+ fileobj = open(%a, 'rb')
+ start_event.set()
+ time.sleep(60.0)
+
+ start_event = threading.Event()
+
+ thread = threading.Thread(target=open_sleep)
+ thread.daemon = True
+ thread.start()
+
+ # wait until the thread started
+ start_event.wait()
+ """ % filename)
+ self.assertRegex(err.rstrip(),
+ b"^sys:1: ResourceWarning: unclosed file ")
+
+
class ThreadJoinOnShutdown(BaseTestCase):
def _run_and_join(self, script):
@@ -701,6 +747,10 @@ class ThreadJoinOnShutdown(BaseTestCase):
import sys
import time
import threading
+ import warnings
+
+ # ignore "unclosed file ..." warnings
+ warnings.filterwarnings('ignore', '', ResourceWarning)
thread_has_run = set()