[PATCH] journal: properly check for held lock (issue5349)
Pierre-Yves David
pierre-yves.david at ens-lyon.org
Tue Sep 13 18:39:30 UTC 2016
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at ens-lyon.org>
# Date 1473791419 -7200
# Tue Sep 13 20:30:19 2016 +0200
# Node ID 61784f683c494f547565122716bdb2234d5360ae
# Parent be16091ac14d03f3cc038b2fb26efe46f785f8d7
# EXP-Topic pypy.journal
journal: properly check for held lock (issue5349)
The 'jlock' code meant to check for a held lock, but it actually just checking for a
lock object. With CPython, this worked because the 'jlock' object is not
referenced outside the '_write' function so reference counting would garbage
collect it and the '_lockref' would return None. With pypy, the garbage
collection would happen at an undefined time and the '_lockref' can still point
to a 'jlock' object outside of '_write'.
The right thing to do here is not only to check for a lock object but also to
check if the lock is held. We update the code to do so and reuse a utility
method that exist on 'localrepo' to help readability. This fix journal related
tests with pypy.
diff --git a/hgext/journal.py b/hgext/journal.py
--- a/hgext/journal.py
+++ b/hgext/journal.py
@@ -267,9 +267,21 @@ class journalstorage(object):
# with a non-local repo (cloning for example).
cls._currentcommand = fullargs
+ def _currentlock(self, lockref):
+ """Returns the lock if it's held, or None if it's not.
+
+ (This is copied from the localrepo class)
+ """
+ if lockref is None:
+ return None
+ l = lockref()
+ if l is None or not l.held:
+ return None
+ return l
+
def jlock(self, vfs):
"""Create a lock for the journal file"""
- if self._lockref and self._lockref():
+ if self._currentlock(self._lockref) is not None:
raise error.Abort(_('journal lock does not support nesting'))
desc = _('journal of %s') % vfs.base
try:
More information about the Mercurial-devel
mailing list