tbpo-36402: Fix threading.Thread._stop() (GH-14047)
Remove the _tstate_lock from _shutdown_locks, don't remove None.
This commit is contained in:
parent
b4b814b398
commit
6f75c87375
|
@ -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):
|
||||||
|
|
||||||
|
|
|
@ -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."
|
||||||
|
|
Loading…
Reference in New Issue