mercurial/lock.py
changeset 1753 e6e70450edb9
parent 1559 59b3639df0a9
child 1787 e431344e604c
equal deleted inserted replaced
1752:457cdec745f8 1753:e6e70450edb9
     3 # Copyright 2005 Matt Mackall <mpm@selenic.com>
     3 # Copyright 2005 Matt Mackall <mpm@selenic.com>
     4 #
     4 #
     5 # This software may be used and distributed according to the terms
     5 # This software may be used and distributed according to the terms
     6 # of the GNU General Public License, incorporated herein by reference.
     6 # of the GNU General Public License, incorporated herein by reference.
     7 
     7 
     8 import os, time
     8 import errno, os, time
     9 import util
     9 import util
    10 
    10 
    11 class LockHeld(Exception):
    11 class LockException(Exception):
       
    12     pass
       
    13 class LockHeld(LockException):
       
    14     pass
       
    15 class LockUnavailable(LockException):
    12     pass
    16     pass
    13 
    17 
    14 class lock(object):
    18 class lock(object):
    15     def __init__(self, file, wait=1, releasefn=None):
    19     def __init__(self, file, wait=1, releasefn=None):
    16         self.f = file
    20         self.f = file
    36     def trylock(self):
    40     def trylock(self):
    37         pid = os.getpid()
    41         pid = os.getpid()
    38         try:
    42         try:
    39             util.makelock(str(pid), self.f)
    43             util.makelock(str(pid), self.f)
    40             self.held = 1
    44             self.held = 1
    41         except (OSError, IOError):
    45         except (OSError, IOError), why:
    42             raise LockHeld(util.readlock(self.f))
    46             if why.errno == errno.EEXIST:
       
    47                 raise LockHeld(util.readlock(self.f))
       
    48             else:
       
    49                 raise LockUnavailable(why)
    43 
    50 
    44     def release(self):
    51     def release(self):
    45         if self.held:
    52         if self.held:
    46             self.held = 0
    53             self.held = 0
    47             if self.releasefn:
    54             if self.releasefn: