Browse Source
tbpo-36402: Fix threading.Thread._stop() (GH-14047)
Remove the _tstate_lock from _shutdown_locks, don't remove None.
pull/14052/head
Victor Stinner
7 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with
25 additions and
1 deletions
-
Lib/test/test_threading.py
-
Lib/threading.py
|
|
|
@ -738,6 +738,30 @@ class ThreadTests(BaseTestCase): |
|
|
|
finally: |
|
|
|
sys.settrace(old_trace) |
|
|
|
|
|
|
|
@cpython_only |
|
|
|
def test_shutdown_locks(self): |
|
|
|
for daemon in (False, True): |
|
|
|
with self.subTest(daemon=daemon): |
|
|
|
event = threading.Event() |
|
|
|
thread = threading.Thread(target=event.wait, daemon=daemon) |
|
|
|
|
|
|
|
# Thread.start() must add lock to _shutdown_locks, |
|
|
|
# but only for non-daemon thread |
|
|
|
thread.start() |
|
|
|
tstate_lock = thread._tstate_lock |
|
|
|
if not daemon: |
|
|
|
self.assertIn(tstate_lock, threading._shutdown_locks) |
|
|
|
else: |
|
|
|
self.assertNotIn(tstate_lock, threading._shutdown_locks) |
|
|
|
|
|
|
|
# unblock the thread and join it |
|
|
|
event.set() |
|
|
|
thread.join() |
|
|
|
|
|
|
|
# Thread._stop() must remove tstate_lock from _shutdown_locks. |
|
|
|
# Daemon threads must never add it to _shutdown_locks. |
|
|
|
self.assertNotIn(tstate_lock, threading._shutdown_locks) |
|
|
|
|
|
|
|
|
|
|
|
class ThreadJoinOnShutdown(BaseTestCase): |
|
|
|
|
|
|
|
|
|
|
|
@ -965,7 +965,7 @@ class Thread: |
|
|
|
self._tstate_lock = None |
|
|
|
if not self.daemon: |
|
|
|
with _shutdown_locks_lock: |
|
|
|
_shutdown_locks.discard(self._tstate_lock) |
|
|
|
_shutdown_locks.discard(lock) |
|
|
|
|
|
|
|
def _delete(self): |
|
|
|
"Remove current thread from the dict of currently running threads." |
|
|
|
|