tbpo-36402: Fix threading.Thread._stop() (GH-14047)

Remove the _tstate_lock from _shutdown_locks, don't remove None.
This commit is contained in:
Victor Stinner 2019-06-13 12:06:24 +02:00 committed by GitHub
parent b4b814b398
commit 6f75c87375
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 1 deletions

View File

@ -738,6 +738,30 @@ class ThreadTests(BaseTestCase):
finally: finally:
sys.settrace(old_trace) 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): class ThreadJoinOnShutdown(BaseTestCase):

View File

@ -965,7 +965,7 @@ class Thread:
self._tstate_lock = None self._tstate_lock = None
if not self.daemon: if not self.daemon:
with _shutdown_locks_lock: with _shutdown_locks_lock:
_shutdown_locks.discard(self._tstate_lock) _shutdown_locks.discard(lock)
def _delete(self): def _delete(self):
"Remove current thread from the dict of currently running threads." "Remove current thread from the dict of currently running threads."