161
|
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
|