Mercurial > hg > mercurial-crew-with-dirclash
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 |