##// END OF EJS Templates
Raise a different exception when the lock is not available...
Benoit Boissinot -
r1753:e6e70450 default
parent child Browse files
Show More
@@ -1,52 +1,59 b''
1 # lock.py - simple locking scheme for mercurial
1 # lock.py - simple locking scheme for mercurial
2 #
2 #
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
17 self.held = 0
21 self.held = 0
18 self.wait = wait
22 self.wait = wait
19 self.releasefn = releasefn
23 self.releasefn = releasefn
20 self.lock()
24 self.lock()
21
25
22 def __del__(self):
26 def __del__(self):
23 self.release()
27 self.release()
24
28
25 def lock(self):
29 def lock(self):
26 while 1:
30 while 1:
27 try:
31 try:
28 self.trylock()
32 self.trylock()
29 return 1
33 return 1
30 except LockHeld, inst:
34 except LockHeld, inst:
31 if self.wait:
35 if self.wait:
32 time.sleep(1)
36 time.sleep(1)
33 continue
37 continue
34 raise inst
38 raise inst
35
39
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:
48 self.releasefn()
55 self.releasefn()
49 try:
56 try:
50 os.unlink(self.f)
57 os.unlink(self.f)
51 except: pass
58 except: pass
52
59
General Comments 0
You need to be logged in to leave comments. Login now