comparison mercurial/lock.py @ 4965:4106dde15aed

Merge with crew
author Matt Mackall <mpm@selenic.com>
date Sat, 21 Jul 2007 16:44:38 -0500
parents 8933b8ea871a
children
comparison
equal deleted inserted replaced
4964:ee983d0dbea8 4965:4106dde15aed
27 # are atomic even over nfs. 27 # are atomic even over nfs.
28 28
29 # old-style lock: symlink to pid 29 # old-style lock: symlink to pid
30 # new-style lock: symlink to hostname:pid 30 # new-style lock: symlink to hostname:pid
31 31
32 _host = None
33
32 def __init__(self, file, timeout=-1, releasefn=None, desc=None): 34 def __init__(self, file, timeout=-1, releasefn=None, desc=None):
33 self.f = file 35 self.f = file
34 self.held = 0 36 self.held = 0
35 self.timeout = timeout 37 self.timeout = timeout
36 self.releasefn = releasefn 38 self.releasefn = releasefn
37 self.id = None
38 self.host = None
39 self.pid = None
40 self.desc = desc 39 self.desc = desc
41 self.lock() 40 self.lock()
42 41
43 def __del__(self): 42 def __del__(self):
44 self.release() 43 self.release()
57 continue 56 continue
58 raise LockHeld(errno.ETIMEDOUT, inst.filename, self.desc, 57 raise LockHeld(errno.ETIMEDOUT, inst.filename, self.desc,
59 inst.locker) 58 inst.locker)
60 59
61 def trylock(self): 60 def trylock(self):
62 if self.id is None: 61 if lock._host is None:
63 self.host = socket.gethostname() 62 lock._host = socket.gethostname()
64 self.pid = os.getpid() 63 lockname = '%s:%s' % (lock._host, os.getpid())
65 self.id = '%s:%s' % (self.host, self.pid)
66 while not self.held: 64 while not self.held:
67 try: 65 try:
68 util.makelock(self.id, self.f) 66 util.makelock(lockname, self.f)
69 self.held = 1 67 self.held = 1
70 except (OSError, IOError), why: 68 except (OSError, IOError), why:
71 if why.errno == errno.EEXIST: 69 if why.errno == errno.EEXIST:
72 locker = self.testlock() 70 locker = self.testlock()
73 if locker is not None: 71 if locker is not None:
91 locker = util.readlock(self.f) 89 locker = util.readlock(self.f)
92 try: 90 try:
93 host, pid = locker.split(":", 1) 91 host, pid = locker.split(":", 1)
94 except ValueError: 92 except ValueError:
95 return locker 93 return locker
96 if host != self.host: 94 if host != lock._host:
97 return locker 95 return locker
98 try: 96 try:
99 pid = int(pid) 97 pid = int(pid)
100 except: 98 except:
101 return locker 99 return locker