bpo-38091: Import deadlock detection causes deadlock (GH-17518)

Automerge-Triggered-By: @brettcannon
This commit is contained in:
Armin Rigo 2020-03-03 02:37:25 +01:00 committed by GitHub
parent ce3a498408
commit 6daa37fd42
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 1694 additions and 1673 deletions

View file

@ -67,6 +67,7 @@ class _ModuleLock:
# Deadlock avoidance for concurrent circular imports.
me = _thread.get_ident()
tid = self.owner
seen = set()
while True:
lock = _blocking_on.get(tid)
if lock is None:
@ -74,6 +75,14 @@ class _ModuleLock:
tid = lock.owner
if tid == me:
return True
if tid in seen:
# bpo 38091: the chain of tid's we encounter here
# eventually leads to a fixpoint or a cycle, but
# does not reach 'me'. This means we would not
# actually deadlock. This can happen if other
# threads are at the beginning of acquire() below.
return False
seen.add(tid)
def acquire(self):
"""