mercurial/lock.py
author Benoit Boissinot <benoit.boissinot@ens-lyon.org>
Sun, 29 Jan 2006 08:38:31 +1300
changeset 1645 c6ffedc4f11b
parent 1559 59b3639df0a9
child 1753 e6e70450edb9
permissions -rw-r--r--
add removed files to the changelog file list - this should allow better detection of removed file when walking in the history (like hg log) it doesn't help for the fast path of hg log where we only look at the filelog - users of the changelog file list shouldn't assume anymore that the file still exist (anyway it won't be found in the manifest like in 5ecf05541e11) - fix the tests (some hashes changed)

# 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
import util

class LockHeld(Exception):
    pass

class lock(object):
    def __init__(self, file, wait=1, releasefn=None):
        self.f = file
        self.held = 0
        self.wait = wait
        self.releasefn = releasefn
        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:
            util.makelock(str(pid), self.f)
            self.held = 1
        except (OSError, IOError):
            raise LockHeld(util.readlock(self.f))

    def release(self):
        if self.held:
            self.held = 0
            if self.releasefn:
                self.releasefn()
            try:
                os.unlink(self.f)
            except: pass