view mercurial/lock.py @ 209:63af1db35611

Beginning of new command parsing interface -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Beginning of new command parsing interface This adds commands.py, with a primary interface dispatch(args) Dispatch searches a table of known commands, handles switches, sets up a repo object if appropriate, and dispatches the command. It also handles KeyboardInterrupt and can handle similar exceptions in the future. If the command is unknown, it falls through to the current command handler. Commands currently handled by the new scheme: help, init, and annotate manifest hash: 134cd032c880985e3f92f82efb8b629dd862ba4c -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCnXEGywK+sNU5EO8RAuDAAJ9q7K4w7qGVWv1NWjCPFGO/UJc6VQCdEhMQ sBBlSRzah9QPy8K94catZyg= =wuRf -----END PGP SIGNATURE-----
author mpm@selenic.com
date Wed, 01 Jun 2005 00:25:42 -0800
parents 0b4c5cb953d9
children 10c43444a38e 688d03d6997a
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 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)