summaryrefslogtreecommitdiff
path: root/coverage/sqldata.py
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2022-01-30 08:03:11 -0500
committerNed Batchelder <ned@nedbatchelder.com>2022-01-30 11:48:59 -0500
commitea71ae9a65b14e20c982c818e3c10e50af9ae677 (patch)
tree1f1828e21bbaecdff74ea83cbd1eeb71bceeaef7 /coverage/sqldata.py
parente6a810246f0316f6518d54148b3303c9b2f47f57 (diff)
downloadpython-coveragepy-git-ea71ae9a65b14e20c982c818e3c10e50af9ae677.tar.gz
fix: use a re-entrant lock to avoid self-deadlocking #1310
Diffstat (limited to 'coverage/sqldata.py')
-rw-r--r--coverage/sqldata.py6
1 files changed, 5 insertions, 1 deletions
diff --git a/coverage/sqldata.py b/coverage/sqldata.py
index 5e27cd85..2bec3c96 100644
--- a/coverage/sqldata.py
+++ b/coverage/sqldata.py
@@ -215,7 +215,7 @@ class CoverageData(SimpleReprMixin):
self._dbs = {}
self._pid = os.getpid()
# Synchronize the operations used during collection.
- self._lock = threading.Lock()
+ self._lock = threading.RLock()
# Are we in sync with the data file?
self._have_used = False
@@ -231,7 +231,11 @@ class CoverageData(SimpleReprMixin):
"""A decorator for methods that should hold self._lock."""
@functools.wraps(method)
def _wrapped(self, *args, **kwargs):
+ if self._debug.should("lock"):
+ self._debug.write(f"Locking {self._lock!r} for {method.__name__}")
with self._lock:
+ if self._debug.should("lock"):
+ self._debug.write(f"Locked {self._lock!r} for {method.__name__}")
# pylint: disable=not-callable
return method(self, *args, **kwargs)
return _wrapped