##// END OF EJS Templates
switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt -
r8109:496ae1ea default
parent child Browse files
Show More
@@ -6,6 +6,7 b''
6 # of the GNU General Public License, incorporated herein by reference.
6 # of the GNU General Public License, incorporated herein by reference.
7
7
8 from node import hex, nullid, nullrev, short
8 from node import hex, nullid, nullrev, short
9 from lock import release
9 from i18n import _, gettext
10 from i18n import _, gettext
10 import os, re, sys, textwrap
11 import os, re, sys, textwrap
11 import hg, util, revlog, bundlerepo, extensions, copies, context, error
12 import hg, util, revlog, bundlerepo, extensions, copies, context, error
@@ -684,7 +685,7 b' def copy(ui, repo, *pats, **opts):'
684 try:
685 try:
685 return cmdutil.copy(ui, repo, pats, opts)
686 return cmdutil.copy(ui, repo, pats, opts)
686 finally:
687 finally:
687 del wlock
688 wlock.release()
688
689
689 def debugancestor(ui, repo, *args):
690 def debugancestor(ui, repo, *args):
690 """find the ancestor revision of two revisions in a given index"""
691 """find the ancestor revision of two revisions in a given index"""
@@ -747,7 +748,7 b' def debugrebuildstate(ui, repo, rev="tip'
747 try:
748 try:
748 repo.dirstate.rebuild(ctx.node(), ctx.manifest())
749 repo.dirstate.rebuild(ctx.node(), ctx.manifest())
749 finally:
750 finally:
750 del wlock
751 wlock.release()
751
752
752 def debugcheckstate(ui, repo):
753 def debugcheckstate(ui, repo):
753 """validate the correctness of the current dirstate"""
754 """validate the correctness of the current dirstate"""
@@ -816,7 +817,7 b' def debugsetparents(ui, repo, rev1, rev2'
816 try:
817 try:
817 repo.dirstate.setparents(repo.lookup(rev1), repo.lookup(rev2))
818 repo.dirstate.setparents(repo.lookup(rev1), repo.lookup(rev2))
818 finally:
819 finally:
819 del wlock
820 wlock.release()
820
821
821 def debugstate(ui, repo, nodates=None):
822 def debugstate(ui, repo, nodates=None):
822 """show the contents of the current dirstate"""
823 """show the contents of the current dirstate"""
@@ -1743,7 +1744,7 b' def import_(ui, repo, patch1, *patches, '
1743 finally:
1744 finally:
1744 os.unlink(tmpname)
1745 os.unlink(tmpname)
1745 finally:
1746 finally:
1746 del lock, wlock
1747 release(lock, wlock)
1747
1748
1748 def incoming(ui, repo, source="default", **opts):
1749 def incoming(ui, repo, source="default", **opts):
1749 """show new changesets found in source
1750 """show new changesets found in source
@@ -2355,7 +2356,7 b' def rename(ui, repo, *pats, **opts):'
2355 try:
2356 try:
2356 return cmdutil.copy(ui, repo, pats, opts, rename=True)
2357 return cmdutil.copy(ui, repo, pats, opts, rename=True)
2357 finally:
2358 finally:
2358 del wlock
2359 wlock.release()
2359
2360
2360 def resolve(ui, repo, *pats, **opts):
2361 def resolve(ui, repo, *pats, **opts):
2361 """retry file merges from a merge or update
2362 """retry file merges from a merge or update
@@ -2627,7 +2628,7 b' def revert(ui, repo, *pats, **opts):'
2627 normal(f)
2628 normal(f)
2628
2629
2629 finally:
2630 finally:
2630 del wlock
2631 wlock.release()
2631
2632
2632 def rollback(ui, repo):
2633 def rollback(ui, repo):
2633 """roll back the last transaction
2634 """roll back the last transaction
@@ -2919,15 +2920,14 b' def unbundle(ui, repo, fname1, *fnames, '
2919 """
2920 """
2920 fnames = (fname1,) + fnames
2921 fnames = (fname1,) + fnames
2921
2922
2922 lock = None
2923 lock = repo.lock()
2923 try:
2924 try:
2924 lock = repo.lock()
2925 for fname in fnames:
2925 for fname in fnames:
2926 f = url.open(ui, fname)
2926 f = url.open(ui, fname)
2927 gen = changegroup.readbundle(f, fname)
2927 gen = changegroup.readbundle(f, fname)
2928 modheads = repo.addchangegroup(gen, 'unbundle', 'bundle:' + fname)
2928 modheads = repo.addchangegroup(gen, 'unbundle', 'bundle:' + fname)
2929 finally:
2929 finally:
2930 del lock
2930 lock.release()
2931
2931
2932 return postincoming(ui, repo, modheads, opts.get('update'), None)
2932 return postincoming(ui, repo, modheads, opts.get('update'), None)
2933
2933
@@ -140,5 +140,5 b' def save_state(repo, state):'
140 f.write("%s %s\n" % (kind, hex(node)))
140 f.write("%s %s\n" % (kind, hex(node)))
141 f.rename()
141 f.rename()
142 finally:
142 finally:
143 del wlock
143 wlock.release()
144
144
@@ -7,6 +7,7 b''
7 # of the GNU General Public License, incorporated herein by reference.
7 # of the GNU General Public License, incorporated herein by reference.
8
8
9 from i18n import _
9 from i18n import _
10 from lock import release
10 import localrepo, bundlerepo, httprepo, sshrepo, statichttprepo
11 import localrepo, bundlerepo, httprepo, sshrepo, statichttprepo
11 import errno, lock, os, shutil, util, extensions, error
12 import errno, lock, os, shutil, util, extensions, error
12 import merge as _merge
13 import merge as _merge
@@ -249,7 +250,8 b' def clone(ui, source, dest=None, pull=Fa'
249
250
250 return src_repo, dest_repo
251 return src_repo, dest_repo
251 finally:
252 finally:
252 del src_lock, dest_lock, dir_cleanup
253 release(src_lock, dest_lock)
254 del dir_cleanup
253
255
254 def _showstats(repo, stats):
256 def _showstats(repo, stats):
255 stats = ((stats[0], _("updated")),
257 stats = ((stats[0], _("updated")),
@@ -163,7 +163,7 b' def unbundle(repo, req):'
163 req.respond(HTTP_OK, HGTYPE)
163 req.respond(HTTP_OK, HGTYPE)
164 return '%d\n%s' % (ret, val),
164 return '%d\n%s' % (ret, val),
165 finally:
165 finally:
166 del lock
166 lock.release()
167 except ValueError, inst:
167 except ValueError, inst:
168 raise ErrorResponse(HTTP_OK, inst)
168 raise ErrorResponse(HTTP_OK, inst)
169 except (OSError, IOError), inst:
169 except (OSError, IOError), inst:
@@ -14,6 +14,8 b' import os, time, util, extensions, hook,'
14 import match as match_
14 import match as match_
15 import merge as merge_
15 import merge as merge_
16
16
17 from lock import release
18
17 class localrepository(repo.repository):
19 class localrepository(repo.repository):
18 capabilities = util.set(('lookup', 'changegroupsubset'))
20 capabilities = util.set(('lookup', 'changegroupsubset'))
19 supported = ('revlogv1', 'store', 'fncache')
21 supported = ('revlogv1', 'store', 'fncache')
@@ -620,7 +622,7 b' class localrepository(repo.repository):'
620 return tr
622 return tr
621
623
622 def recover(self):
624 def recover(self):
623 l = self.lock()
625 lock = self.lock()
624 try:
626 try:
625 if os.path.exists(self.sjoin("journal")):
627 if os.path.exists(self.sjoin("journal")):
626 self.ui.status(_("rolling back interrupted transaction\n"))
628 self.ui.status(_("rolling back interrupted transaction\n"))
@@ -631,7 +633,7 b' class localrepository(repo.repository):'
631 self.ui.warn(_("no interrupted transaction available\n"))
633 self.ui.warn(_("no interrupted transaction available\n"))
632 return False
634 return False
633 finally:
635 finally:
634 del l
636 lock.release()
635
637
636 def rollback(self):
638 def rollback(self):
637 wlock = lock = None
639 wlock = lock = None
@@ -654,7 +656,7 b' class localrepository(repo.repository):'
654 else:
656 else:
655 self.ui.warn(_("no rollback information available\n"))
657 self.ui.warn(_("no rollback information available\n"))
656 finally:
658 finally:
657 del lock, wlock
659 release(lock, wlock)
658
660
659 def invalidate(self):
661 def invalidate(self):
660 for a in "changelog manifest".split():
662 for a in "changelog manifest".split():
@@ -835,7 +837,7 b' class localrepository(repo.repository):'
835 return r
837 return r
836
838
837 finally:
839 finally:
838 del lock, wlock
840 release(lock, wlock)
839
841
840 def commitctx(self, ctx):
842 def commitctx(self, ctx):
841 """Add a new revision to current repository.
843 """Add a new revision to current repository.
@@ -851,7 +853,7 b' class localrepository(repo.repository):'
851 empty_ok=True, use_dirstate=False,
853 empty_ok=True, use_dirstate=False,
852 update_dirstate=False)
854 update_dirstate=False)
853 finally:
855 finally:
854 del lock, wlock
856 release(lock, wlock)
855
857
856 def _commitctx(self, wctx, force=False, force_editor=False, empty_ok=False,
858 def _commitctx(self, wctx, force=False, force_editor=False, empty_ok=False,
857 use_dirstate=True, update_dirstate=True):
859 use_dirstate=True, update_dirstate=True):
@@ -1072,7 +1074,7 b' class localrepository(repo.repository):'
1072 except error.LockError:
1074 except error.LockError:
1073 pass
1075 pass
1074 finally:
1076 finally:
1075 del wlock
1077 release(wlock)
1076
1078
1077 if not parentworking:
1079 if not parentworking:
1078 mf1 = mfmatches(ctx1)
1080 mf1 = mfmatches(ctx1)
@@ -1138,7 +1140,7 b' class localrepository(repo.repository):'
1138 self.dirstate.add(f)
1140 self.dirstate.add(f)
1139 return rejected
1141 return rejected
1140 finally:
1142 finally:
1141 del wlock
1143 wlock.release()
1142
1144
1143 def forget(self, list):
1145 def forget(self, list):
1144 wlock = self.wlock()
1146 wlock = self.wlock()
@@ -1149,7 +1151,7 b' class localrepository(repo.repository):'
1149 else:
1151 else:
1150 self.dirstate.forget(f)
1152 self.dirstate.forget(f)
1151 finally:
1153 finally:
1152 del wlock
1154 wlock.release()
1153
1155
1154 def remove(self, list, unlink=False):
1156 def remove(self, list, unlink=False):
1155 wlock = None
1157 wlock = None
@@ -1172,14 +1174,13 b' class localrepository(repo.repository):'
1172 else:
1174 else:
1173 self.dirstate.remove(f)
1175 self.dirstate.remove(f)
1174 finally:
1176 finally:
1175 del wlock
1177 release(wlock)
1176
1178
1177 def undelete(self, list):
1179 def undelete(self, list):
1178 wlock = None
1180 manifests = [self.manifest.read(self.changelog.read(p)[0])
1181 for p in self.dirstate.parents() if p != nullid]
1182 wlock = self.wlock()
1179 try:
1183 try:
1180 manifests = [self.manifest.read(self.changelog.read(p)[0])
1181 for p in self.dirstate.parents() if p != nullid]
1182 wlock = self.wlock()
1183 for f in list:
1184 for f in list:
1184 if self.dirstate[f] != 'r':
1185 if self.dirstate[f] != 'r':
1185 self.ui.warn(_("%s not removed!\n") % f)
1186 self.ui.warn(_("%s not removed!\n") % f)
@@ -1189,24 +1190,23 b' class localrepository(repo.repository):'
1189 self.wwrite(f, t, m.flags(f))
1190 self.wwrite(f, t, m.flags(f))
1190 self.dirstate.normal(f)
1191 self.dirstate.normal(f)
1191 finally:
1192 finally:
1192 del wlock
1193 wlock.release()
1193
1194
1194 def copy(self, source, dest):
1195 def copy(self, source, dest):
1195 wlock = None
1196 p = self.wjoin(dest)
1196 try:
1197 if not (os.path.exists(p) or os.path.islink(p)):
1197 p = self.wjoin(dest)
1198 self.ui.warn(_("%s does not exist!\n") % dest)
1198 if not (os.path.exists(p) or os.path.islink(p)):
1199 elif not (os.path.isfile(p) or os.path.islink(p)):
1199 self.ui.warn(_("%s does not exist!\n") % dest)
1200 self.ui.warn(_("copy failed: %s is not a file or a "
1200 elif not (os.path.isfile(p) or os.path.islink(p)):
1201 "symbolic link\n") % dest)
1201 self.ui.warn(_("copy failed: %s is not a file or a "
1202 else:
1202 "symbolic link\n") % dest)
1203 wlock = self.wlock()
1203 else:
1204 try:
1204 wlock = self.wlock()
1205 if self.dirstate[dest] in '?r':
1205 if self.dirstate[dest] in '?r':
1206 self.dirstate.add(dest)
1206 self.dirstate.add(dest)
1207 self.dirstate.copy(source, dest)
1207 self.dirstate.copy(source, dest)
1208 finally:
1208 finally:
1209 del wlock
1209 wlock.release()
1210
1210
1211 def heads(self, start=None, closed=True):
1211 def heads(self, start=None, closed=True):
1212 heads = self.changelog.heads(start)
1212 heads = self.changelog.heads(start)
@@ -1500,7 +1500,7 b' class localrepository(repo.repository):'
1500 cg = remote.changegroupsubset(fetch, heads, 'pull')
1500 cg = remote.changegroupsubset(fetch, heads, 'pull')
1501 return self.addchangegroup(cg, 'pull', remote.url())
1501 return self.addchangegroup(cg, 'pull', remote.url())
1502 finally:
1502 finally:
1503 del lock
1503 lock.release()
1504
1504
1505 def push(self, remote, force=False, revs=None):
1505 def push(self, remote, force=False, revs=None):
1506 # there are two ways to push to remote repo:
1506 # there are two ways to push to remote repo:
@@ -1581,7 +1581,7 b' class localrepository(repo.repository):'
1581 return remote.addchangegroup(cg, 'push', self.url())
1581 return remote.addchangegroup(cg, 'push', self.url())
1582 return ret[1]
1582 return ret[1]
1583 finally:
1583 finally:
1584 del lock
1584 lock.release()
1585
1585
1586 def push_unbundle(self, remote, force, revs):
1586 def push_unbundle(self, remote, force, revs):
1587 # local repo finds heads on server, finds out what revs it
1587 # local repo finds heads on server, finds out what revs it
@@ -504,4 +504,4 b' def update(repo, node, branchmerge, forc'
504
504
505 return stats
505 return stats
506 finally:
506 finally:
507 del wlock
507 wlock.release()
@@ -37,7 +37,11 b' class sshserver(object):'
37 self.fout.flush()
37 self.fout.flush()
38
38
39 def serve_forever(self):
39 def serve_forever(self):
40 while self.serve_one(): pass
40 try:
41 while self.serve_one(): pass
42 finally:
43 if self.lock is not None:
44 self.lock.release()
41 sys.exit(0)
45 sys.exit(0)
42
46
43 def serve_one(self):
47 def serve_one(self):
@@ -41,16 +41,15 b' def stream_out(repo, untrusted=False):'
41 entries = []
41 entries = []
42 total_bytes = 0
42 total_bytes = 0
43 try:
43 try:
44 l = None
44 # get consistent snapshot of repo, lock during scan
45 lock = repo.lock()
45 try:
46 try:
46 repo.ui.debug(_('scanning\n'))
47 repo.ui.debug(_('scanning\n'))
47 # get consistent snapshot of repo, lock during scan
48 l = repo.lock()
49 for name, ename, size in repo.store.walk():
48 for name, ename, size in repo.store.walk():
50 entries.append((name, size))
49 entries.append((name, size))
51 total_bytes += size
50 total_bytes += size
52 finally:
51 finally:
53 del l
52 lock.release()
54 except error.LockError:
53 except error.LockError:
55 raise StreamException(2)
54 raise StreamException(2)
56
55
@@ -14,7 +14,7 b' def verify(repo):'
14 try:
14 try:
15 return _verify(repo)
15 return _verify(repo)
16 finally:
16 finally:
17 del lock
17 lock.release()
18
18
19 def _verify(repo):
19 def _verify(repo):
20 mflinkrevs = {}
20 mflinkrevs = {}
General Comments 0
You need to be logged in to leave comments. Login now