diff --git a/mercurial/lock.py b/mercurial/lock.py 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 +# +# 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) +