mercurial/lock.py
changeset 161 0b4c5cb953d9
child 422 10c43444a38e
child 429 688d03d6997a
new file mode 100644
--- /dev/null
+++ b/mercurial/lock.py
@@ -0,0 +1,46 @@
+# lock.py - simple locking scheme for mercurial
+#
+# Copyright 2005 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms
+# of the GNU General Public License, incorporated herein by reference.
+
+import os, time
+
+class LockHeld(Exception):
+    pass
+
+class lock:
+    def __init__(self, file, wait = 1):
+        self.f = file
+        self.held = 0
+        self.wait = wait
+        self.lock()
+
+    def __del__(self):
+        self.release()
+
+    def lock(self):
+        while 1:
+            try:
+                self.trylock()
+                return 1
+            except LockHeld, inst:
+                if self.wait:
+                    time.sleep(1)
+                    continue
+                raise inst
+        
+    def trylock(self):
+        pid = os.getpid()
+        try:
+            os.symlink(str(pid), self.f)
+            self.held = 1
+        except:
+            raise LockHeld(os.readlink(self.f))
+
+    def release(self):
+        if self.held:
+            self.held = 0
+            os.unlink(self.f)
+