Mercurial > hg
diff mercurial/lock.py @ 161:0b4c5cb953d9
Simply repository locking
This is a first pass at implementing repo locking. Next up, journal
recovery and undo.
author | mpm@selenic.com |
---|---|
date | Thu, 26 May 2005 08:53:04 -0800 |
parents | |
children | 10c43444a38e 688d03d6997a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mercurial/lock.py Thu May 26 08:53:04 2005 -0800 @@ -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) +