[PATCH 2 of 5] switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt
Ronny.Pfannschmidt at gmx.de
Mon Apr 20 14:50:11 CDT 2009
# HG changeset patch
# User Ronny Pfannschmidt <Ronny.Pfannschmidt at gmx.de>
# Date 1240241188 -7200
# Node ID aee011f2a76109d880378879fa9d915e35eca6ad
# Parent 384972244ed4c1b00c40185b0456d67457aa0cc9
switch lock releasing in the core from gc to explicit
diff -r 384972244ed4 -r aee011f2a761 mercurial/commands.py
--- a/mercurial/commands.py Mon Apr 20 17:26:25 2009 +0200
+++ b/mercurial/commands.py Mon Apr 20 17:26:28 2009 +0200
@@ -6,6 +6,7 @@
# of the GNU General Public License, incorporated herein by reference.
from node import hex, nullid, nullrev, short
+from lock import release
from i18n import _, gettext
import os, re, sys, textwrap
import hg, util, revlog, bundlerepo, extensions, copies, context, error
@@ -678,7 +679,7 @@ def copy(ui, repo, *pats, **opts):
try:
return cmdutil.copy(ui, repo, pats, opts)
finally:
- del wlock
+ wlock.release()
def debugancestor(ui, repo, *args):
"""find the ancestor revision of two revisions in a given index"""
@@ -741,7 +742,7 @@ def debugrebuildstate(ui, repo, rev="tip
try:
repo.dirstate.rebuild(ctx.node(), ctx.manifest())
finally:
- del wlock
+ wlock.release()
def debugcheckstate(ui, repo):
"""validate the correctness of the current dirstate"""
@@ -810,7 +811,7 @@ def debugsetparents(ui, repo, rev1, rev2
try:
repo.dirstate.setparents(repo.lookup(rev1), repo.lookup(rev2))
finally:
- del wlock
+ wlock.release()
def debugstate(ui, repo, nodates=None):
"""show the contents of the current dirstate"""
@@ -1737,7 +1738,7 @@ def import_(ui, repo, patch1, *patches,
finally:
os.unlink(tmpname)
finally:
- del lock, wlock
+ release(lock, wlock)
def incoming(ui, repo, source="default", **opts):
"""show new changesets found in source
@@ -2349,7 +2350,7 @@ def rename(ui, repo, *pats, **opts):
try:
return cmdutil.copy(ui, repo, pats, opts, rename=True)
finally:
- del wlock
+ wlock.release()
def resolve(ui, repo, *pats, **opts):
"""retry file merges from a merge or update
@@ -2621,7 +2622,7 @@ def revert(ui, repo, *pats, **opts):
normal(f)
finally:
- del wlock
+ wlock.release()
def rollback(ui, repo):
"""roll back the last transaction
@@ -2913,15 +2914,14 @@ def unbundle(ui, repo, fname1, *fnames,
"""
fnames = (fname1,) + fnames
- lock = None
+ lock = repo.lock()
try:
- lock = repo.lock()
for fname in fnames:
f = url.open(ui, fname)
gen = changegroup.readbundle(f, fname)
modheads = repo.addchangegroup(gen, 'unbundle', 'bundle:' + fname)
finally:
- del lock
+ lock.release()
return postincoming(ui, repo, modheads, opts.get('update'), None)
diff -r 384972244ed4 -r aee011f2a761 mercurial/hbisect.py
--- a/mercurial/hbisect.py Mon Apr 20 17:26:25 2009 +0200
+++ b/mercurial/hbisect.py Mon Apr 20 17:26:28 2009 +0200
@@ -140,5 +140,5 @@ def save_state(repo, state):
f.write("%s %s\n" % (kind, hex(node)))
f.rename()
finally:
- del wlock
+ wlock.release()
diff -r 384972244ed4 -r aee011f2a761 mercurial/hg.py
--- a/mercurial/hg.py Mon Apr 20 17:26:25 2009 +0200
+++ b/mercurial/hg.py Mon Apr 20 17:26:28 2009 +0200
@@ -7,6 +7,7 @@
# of the GNU General Public License, incorporated herein by reference.
from i18n import _
+from lock import release
import localrepo, bundlerepo, httprepo, sshrepo, statichttprepo
import errno, lock, os, shutil, util, extensions, error
import merge as _merge
@@ -142,7 +143,7 @@ def clone(ui, source, dest=None, pull=Fa
self.dir_ = dir_
def close(self):
self.dir_ = None
- def __del__(self):
+ def cleanup(self):
if self.dir_:
self.rmtree(self.dir_, True)
@@ -249,7 +250,9 @@ def clone(ui, source, dest=None, pull=Fa
return src_repo, dest_repo
finally:
- del src_lock, dest_lock, dir_cleanup
+ release(src_lock, dest_lock)
+ if dir_cleanup is not None:
+ dir_cleanup.cleanup()
def _showstats(repo, stats):
stats = ((stats[0], _("updated")),
diff -r 384972244ed4 -r aee011f2a761 mercurial/hgweb/protocol.py
--- a/mercurial/hgweb/protocol.py Mon Apr 20 17:26:25 2009 +0200
+++ b/mercurial/hgweb/protocol.py Mon Apr 20 17:26:28 2009 +0200
@@ -163,7 +163,7 @@ def unbundle(repo, req):
req.respond(HTTP_OK, HGTYPE)
return '%d\n%s' % (ret, val),
finally:
- del lock
+ lock.release()
except ValueError, inst:
raise ErrorResponse(HTTP_OK, inst)
except (OSError, IOError), inst:
diff -r 384972244ed4 -r aee011f2a761 mercurial/localrepo.py
--- a/mercurial/localrepo.py Mon Apr 20 17:26:25 2009 +0200
+++ b/mercurial/localrepo.py Mon Apr 20 17:26:28 2009 +0200
@@ -14,6 +14,8 @@ import os, time, util, extensions, hook,
import match as match_
import merge as merge_
+from lock import release
+
class localrepository(repo.repository):
capabilities = util.set(('lookup', 'changegroupsubset'))
supported = ('revlogv1', 'store', 'fncache')
@@ -620,7 +622,7 @@ class localrepository(repo.repository):
return tr
def recover(self):
- l = self.lock()
+ lock = self.lock()
try:
if os.path.exists(self.sjoin("journal")):
self.ui.status(_("rolling back interrupted transaction\n"))
@@ -631,7 +633,7 @@ class localrepository(repo.repository):
self.ui.warn(_("no interrupted transaction available\n"))
return False
finally:
- del l
+ lock.release()
def rollback(self):
wlock = lock = None
@@ -654,7 +656,7 @@ class localrepository(repo.repository):
else:
self.ui.warn(_("no rollback information available\n"))
finally:
- del lock, wlock
+ release(lock, wlock)
def invalidate(self):
for a in "changelog manifest".split():
@@ -835,7 +837,7 @@ class localrepository(repo.repository):
return r
finally:
- del lock, wlock
+ release(lock, wlock)
def commitctx(self, ctx):
"""Add a new revision to current repository.
@@ -851,7 +853,7 @@ class localrepository(repo.repository):
empty_ok=True, use_dirstate=False,
update_dirstate=False)
finally:
- del lock, wlock
+ release(lock, wlock)
def _commitctx(self, wctx, force=False, force_editor=False, empty_ok=False,
use_dirstate=True, update_dirstate=True):
@@ -1072,7 +1074,8 @@ class localrepository(repo.repository):
except error.LockError:
pass
finally:
- del wlock
+ if wlock is not None:
+ wlock.release()
if not parentworking:
mf1 = mfmatches(ctx1)
@@ -1138,7 +1141,7 @@ class localrepository(repo.repository):
self.dirstate.add(f)
return rejected
finally:
- del wlock
+ wlock.release()
def forget(self, list):
wlock = self.wlock()
@@ -1149,7 +1152,7 @@ class localrepository(repo.repository):
else:
self.dirstate.forget(f)
finally:
- del wlock
+ wlock.release()
def remove(self, list, unlink=False):
wlock = None
@@ -1172,14 +1175,14 @@ class localrepository(repo.repository):
else:
self.dirstate.remove(f)
finally:
- del wlock
+ if wlock is not None:
+ wlock.release()
def undelete(self, list):
- wlock = None
+ manifests = [self.manifest.read(self.changelog.read(p)[0])
+ for p in self.dirstate.parents() if p != nullid]
+ wlock = self.wlock()
try:
- manifests = [self.manifest.read(self.changelog.read(p)[0])
- for p in self.dirstate.parents() if p != nullid]
- wlock = self.wlock()
for f in list:
if self.dirstate[f] != 'r':
self.ui.warn(_("%s not removed!\n") % f)
@@ -1189,24 +1192,23 @@ class localrepository(repo.repository):
self.wwrite(f, t, m.flags(f))
self.dirstate.normal(f)
finally:
- del wlock
+ wlock.release()
def copy(self, source, dest):
- wlock = None
- try:
- p = self.wjoin(dest)
- if not (os.path.exists(p) or os.path.islink(p)):
- self.ui.warn(_("%s does not exist!\n") % dest)
- elif not (os.path.isfile(p) or os.path.islink(p)):
- self.ui.warn(_("copy failed: %s is not a file or a "
- "symbolic link\n") % dest)
- else:
- wlock = self.wlock()
+ p = self.wjoin(dest)
+ if not (os.path.exists(p) or os.path.islink(p)):
+ self.ui.warn(_("%s does not exist!\n") % dest)
+ elif not (os.path.isfile(p) or os.path.islink(p)):
+ self.ui.warn(_("copy failed: %s is not a file or a "
+ "symbolic link\n") % dest)
+ else:
+ wlock = self.wlock()
+ try:
if self.dirstate[dest] in '?r':
self.dirstate.add(dest)
self.dirstate.copy(source, dest)
- finally:
- del wlock
+ finally:
+ wlock.release()
def heads(self, start=None, closed=True):
heads = self.changelog.heads(start)
@@ -1500,7 +1502,7 @@ class localrepository(repo.repository):
cg = remote.changegroupsubset(fetch, heads, 'pull')
return self.addchangegroup(cg, 'pull', remote.url())
finally:
- del lock
+ lock.release()
def push(self, remote, force=False, revs=None):
# there are two ways to push to remote repo:
@@ -1581,7 +1583,7 @@ class localrepository(repo.repository):
return remote.addchangegroup(cg, 'push', self.url())
return ret[1]
finally:
- del lock
+ lock.release()
def push_unbundle(self, remote, force, revs):
# local repo finds heads on server, finds out what revs it
diff -r 384972244ed4 -r aee011f2a761 mercurial/merge.py
--- a/mercurial/merge.py Mon Apr 20 17:26:25 2009 +0200
+++ b/mercurial/merge.py Mon Apr 20 17:26:28 2009 +0200
@@ -504,4 +504,4 @@ def update(repo, node, branchmerge, forc
return stats
finally:
- del wlock
+ wlock.release()
diff -r 384972244ed4 -r aee011f2a761 mercurial/sshserver.py
--- a/mercurial/sshserver.py Mon Apr 20 17:26:25 2009 +0200
+++ b/mercurial/sshserver.py Mon Apr 20 17:26:28 2009 +0200
@@ -37,7 +37,11 @@ class sshserver(object):
self.fout.flush()
def serve_forever(self):
- while self.serve_one(): pass
+ try:
+ while self.serve_one(): pass
+ finally:
+ if self.lock is not None:
+ self.lock.release()
sys.exit(0)
def serve_one(self):
diff -r 384972244ed4 -r aee011f2a761 mercurial/streamclone.py
--- a/mercurial/streamclone.py Mon Apr 20 17:26:25 2009 +0200
+++ b/mercurial/streamclone.py Mon Apr 20 17:26:28 2009 +0200
@@ -41,16 +41,15 @@ def stream_out(repo, untrusted=False):
entries = []
total_bytes = 0
try:
- l = None
+ # get consistent snapshot of repo, lock during scan
+ lock = repo.lock()
try:
repo.ui.debug(_('scanning\n'))
- # get consistent snapshot of repo, lock during scan
- l = repo.lock()
for name, ename, size in repo.store.walk():
entries.append((name, size))
total_bytes += size
finally:
- del l
+ lock.release()
except error.LockError:
raise StreamException(2)
diff -r 384972244ed4 -r aee011f2a761 mercurial/verify.py
--- a/mercurial/verify.py Mon Apr 20 17:26:25 2009 +0200
+++ b/mercurial/verify.py Mon Apr 20 17:26:28 2009 +0200
@@ -14,7 +14,7 @@ def verify(repo):
try:
return _verify(repo)
finally:
- del lock
+ lock.release()
def _verify(repo):
mflinkrevs = {}
More information about the Mercurial-devel
mailing list