lock: add mechanism to register post release callback
authorPierre-Yves David <pierre-yves.david@ens-lyon.org>
Mon, 28 Nov 2011 15:05:26 +0100
changeset 15583 926a06f7a353
parent 15581 d8fa35c28335
child 15584 9df9444e96ec
lock: add mechanism to register post release callback
mercurial/localrepo.py
mercurial/lock.py
--- a/mercurial/localrepo.py	Sat Nov 26 00:10:31 2011 +0100
+++ b/mercurial/localrepo.py	Mon Nov 28 15:05:26 2011 +0100
@@ -912,6 +912,15 @@
             acquirefn()
         return l
 
+    def _postrelease(self, callback):
+        """add a callback to the current repository lock.
+
+        The callback will be executed on lock release."""
+        l = self._lockref and self._lockref()
+        assert l is not None
+        assert l.held
+        l.postreleasehooks.append(callback)
+
     def lock(self, wait=True):
         '''Lock the repository store (.hg/store) and return a weak reference
         to the lock. Use this before modifying the store (e.g. committing or
--- a/mercurial/lock.py	Sat Nov 26 00:10:31 2011 +0100
+++ b/mercurial/lock.py	Mon Nov 28 15:05:26 2011 +0100
@@ -35,6 +35,7 @@
         self.timeout = timeout
         self.releasefn = releasefn
         self.desc = desc
+        self.postreleasehooks  = []
         self.lock()
 
     def __del__(self):
@@ -119,6 +120,10 @@
             return locker
 
     def release(self):
+        """release the lock and execute callback function if any
+
+        If the lock have been aquired multiple time, the actual release is
+        delayed to the last relase call."""
         if self.held > 1:
             self.held -= 1
         elif self.held == 1:
@@ -129,6 +134,8 @@
                 util.unlink(self.f)
             except OSError:
                 pass
+            for callback in self.postreleasehooks:
+                callback()
 
 def release(*locks):
     for lock in locks: