##// 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 acquirefn()
912 acquirefn()
913 return l
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 def lock(self, wait=True):
924 def lock(self, wait=True):
916 '''Lock the repository store (.hg/store) and return a weak reference
925 '''Lock the repository store (.hg/store) and return a weak reference
917 to the lock. Use this before modifying the store (e.g. committing or
926 to the lock. Use this before modifying the store (e.g. committing or
@@ -35,6 +35,7 b' class lock(object):'
35 self.timeout = timeout
35 self.timeout = timeout
36 self.releasefn = releasefn
36 self.releasefn = releasefn
37 self.desc = desc
37 self.desc = desc
38 self.postreleasehooks = []
38 self.lock()
39 self.lock()
39
40
40 def __del__(self):
41 def __del__(self):
@@ -119,6 +120,10 b' class lock(object):'
119 return locker
120 return locker
120
121
121 def release(self):
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 if self.held > 1:
127 if self.held > 1:
123 self.held -= 1
128 self.held -= 1
124 elif self.held == 1:
129 elif self.held == 1:
@@ -129,6 +134,8 b' class lock(object):'
129 util.unlink(self.f)
134 util.unlink(self.f)
130 except OSError:
135 except OSError:
131 pass
136 pass
137 for callback in self.postreleasehooks:
138 callback()
132
139
133 def release(*locks):
140 def release(*locks):
134 for lock in locks:
141 for lock in locks:
General Comments 0
You need to be logged in to leave comments. Login now