[PATCH 2 of 5] switch lock releasing in the core from gc to explicit

Ronny Pfannschmidt Ronny.Pfannschmidt at gmx.de
Mon Apr 20 17:43:31 CDT 2009


# HG changeset patch
# User Ronny Pfannschmidt <Ronny.Pfannschmidt at gmx.de>
# Date 1240263245 -7200
# Node ID 905d1f701a244ad7537d2baf3015957ebdb96436
# Parent  965da9f811870b57bc094da469c75bd00a491caf
switch lock releasing in the core from gc to explicit

diff -r 965da9f81187 -r 905d1f701a24 mercurial/commands.py
--- a/mercurial/commands.py	Mon Apr 20 23:34:05 2009 +0200
+++ b/mercurial/commands.py	Mon Apr 20 23:34:05 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 965da9f81187 -r 905d1f701a24 mercurial/hbisect.py
--- a/mercurial/hbisect.py	Mon Apr 20 23:34:05 2009 +0200
+++ b/mercurial/hbisect.py	Mon Apr 20 23:34:05 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 965da9f81187 -r 905d1f701a24 mercurial/hg.py
--- a/mercurial/hg.py	Mon Apr 20 23:34:05 2009 +0200
+++ b/mercurial/hg.py	Mon Apr 20 23:34:05 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 965da9f81187 -r 905d1f701a24 mercurial/hgweb/protocol.py
--- a/mercurial/hgweb/protocol.py	Mon Apr 20 23:34:05 2009 +0200
+++ b/mercurial/hgweb/protocol.py	Mon Apr 20 23:34:05 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 965da9f81187 -r 905d1f701a24 mercurial/localrepo.py
--- a/mercurial/localrepo.py	Mon Apr 20 23:34:05 2009 +0200
+++ b/mercurial/localrepo.py	Mon Apr 20 23:34:05 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 965da9f81187 -r 905d1f701a24 mercurial/merge.py
--- a/mercurial/merge.py	Mon Apr 20 23:34:05 2009 +0200
+++ b/mercurial/merge.py	Mon Apr 20 23:34:05 2009 +0200
@@ -504,4 +504,4 @@ def update(repo, node, branchmerge, forc
 
         return stats
     finally:
-        del wlock
+        wlock.release()
diff -r 965da9f81187 -r 905d1f701a24 mercurial/sshserver.py
--- a/mercurial/sshserver.py	Mon Apr 20 23:34:05 2009 +0200
+++ b/mercurial/sshserver.py	Mon Apr 20 23:34:05 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 965da9f81187 -r 905d1f701a24 mercurial/streamclone.py
--- a/mercurial/streamclone.py	Mon Apr 20 23:34:05 2009 +0200
+++ b/mercurial/streamclone.py	Mon Apr 20 23:34:05 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 965da9f81187 -r 905d1f701a24 mercurial/verify.py
--- a/mercurial/verify.py	Mon Apr 20 23:34:05 2009 +0200
+++ b/mercurial/verify.py	Mon Apr 20 23:34:05 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