Mercurial > hg > mercurial-crew-with-dirclash
view mercurial/lock.py @ 1899:888d298ddb91
many small changes to templater.
get string code to parse escapes. uses eval now, should parse strings
itself soon.
let caller check if fragment is defined using "in".
make templatepath take optional file name.
author | Vadim Gelfer <vadim.gelfer@gmail.com> |
---|---|
date | Sun, 26 Feb 2006 20:53:37 -0800 |
parents | e431344e604c |
children | cd5c1db2132a |
line wrap: on
line source
# 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 errno, os, time import util class LockException(Exception): pass class LockHeld(LockException): pass class LockUnavailable(LockException): pass class lock(object): def __init__(self, file, timeout=-1, releasefn=None): self.f = file self.held = 0 self.timeout = timeout self.releasefn = releasefn self.lock() def __del__(self): self.release() def lock(self): timeout = self.timeout while 1: try: self.trylock() return 1 except LockHeld, inst: if timeout != 0: time.sleep(1) if timeout > 0: timeout -= 1 continue raise inst def trylock(self): pid = os.getpid() try: util.makelock(str(pid), self.f) self.held = 1 except (OSError, IOError), why: if why.errno == errno.EEXIST: raise LockHeld(util.readlock(self.f)) else: raise LockUnavailable(why) def release(self): if self.held: self.held = 0 if self.releasefn: self.releasefn() try: os.unlink(self.f) except: pass