bpo-44422: Fix threading.enumerate() reentrant call (GH-26727)

The threading.enumerate() function now uses a reentrant lock to
prevent a hang on reentrant call.
This commit is contained in:
Victor Stinner 2021-06-15 16:14:24 +02:00 committed by GitHub
parent 1cd3d859a4
commit 243fd01047
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 9 additions and 3 deletions

View file

@ -775,8 +775,11 @@ _counter = _count(1).__next__
def _newname(name_template):
return name_template % _counter()
# Active thread administration
_active_limbo_lock = _allocate_lock()
# Active thread administration.
#
# bpo-44422: Use a reentrant lock to allow reentrant calls to functions like
# threading.enumerate().
_active_limbo_lock = RLock()
_active = {} # maps thread id to Thread object
_limbo = {}
_dangling = WeakSet()
@ -1564,7 +1567,7 @@ def _after_fork():
# by another (non-forked) thread. http://bugs.python.org/issue874900
global _active_limbo_lock, _main_thread
global _shutdown_locks_lock, _shutdown_locks
_active_limbo_lock = _allocate_lock()
_active_limbo_lock = RLock()
# fork() only copied the current thread; clear references to others.
new_active = {}