##// END OF EJS Templates
lock: add mechanism to register post release callback
Pierre-Yves David -
r15583:926a06f7 default
parent child Browse files
Show More
@@ -912,6 +912,15 b' class localrepository(repo.repository):'
912 912 acquirefn()
913 913 return l
914 914
915 def _postrelease(self, callback):
916 """add a callback to the current repository lock.
917
918 The callback will be executed on lock release."""
919 l = self._lockref and self._lockref()
920 assert l is not None
921 assert l.held
922 l.postreleasehooks.append(callback)
923
915 924 def lock(self, wait=True):
916 925 '''Lock the repository store (.hg/store) and return a weak reference
917 926 to the lock. Use this before modifying the store (e.g. committing or
@@ -35,6 +35,7 b' class lock(object):'
35 35 self.timeout = timeout
36 36 self.releasefn = releasefn
37 37 self.desc = desc
38 self.postreleasehooks = []
38 39 self.lock()
39 40
40 41 def __del__(self):
@@ -119,6 +120,10 b' class lock(object):'
119 120 return locker
120 121
121 122 def release(self):
123 """release the lock and execute callback function if any
124
125 If the lock have been aquired multiple time, the actual release is
126 delayed to the last relase call."""
122 127 if self.held > 1:
123 128 self.held -= 1
124 129 elif self.held == 1:
@@ -129,6 +134,8 b' class lock(object):'
129 134 util.unlink(self.f)
130 135 except OSError:
131 136 pass
137 for callback in self.postreleasehooks:
138 callback()
132 139
133 140 def release(*locks):
134 141 for lock in locks:
General Comments 0
You need to be logged in to leave comments. Login now