mercurial/lock.py
changeset 161 0b4c5cb953d9
child 422 10c43444a38e
child 429 688d03d6997a
equal deleted inserted replaced
160:5c331d941c7f 161:0b4c5cb953d9
       
     1 # lock.py - simple locking scheme for mercurial
       
     2 #
       
     3 # Copyright 2005 Matt Mackall <mpm@selenic.com>
       
     4 #
       
     5 # This software may be used and distributed according to the terms
       
     6 # of the GNU General Public License, incorporated herein by reference.
       
     7 
       
     8 import os, time
       
     9 
       
    10 class LockHeld(Exception):
       
    11     pass
       
    12 
       
    13 class lock:
       
    14     def __init__(self, file, wait = 1):
       
    15         self.f = file
       
    16         self.held = 0
       
    17         self.wait = wait
       
    18         self.lock()
       
    19 
       
    20     def __del__(self):
       
    21         self.release()
       
    22 
       
    23     def lock(self):
       
    24         while 1:
       
    25             try:
       
    26                 self.trylock()
       
    27                 return 1
       
    28             except LockHeld, inst:
       
    29                 if self.wait:
       
    30                     time.sleep(1)
       
    31                     continue
       
    32                 raise inst
       
    33         
       
    34     def trylock(self):
       
    35         pid = os.getpid()
       
    36         try:
       
    37             os.symlink(str(pid), self.f)
       
    38             self.held = 1
       
    39         except:
       
    40             raise LockHeld(os.readlink(self.f))
       
    41 
       
    42     def release(self):
       
    43         if self.held:
       
    44             self.held = 0
       
    45             os.unlink(self.f)
       
    46