author | Vadim Gelfer <vadim.gelfer@gmail.com> |
Wed, 08 Mar 2006 11:21:45 -0800 | |
changeset 1865 | 1ed809a2104e |
parent 1836 | cd5c1db2132a |
child 1877 | d314a89fa4f1 |
permissions | -rw-r--r-- |
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 |
||
1836
cd5c1db2132a
make lock module use demandload.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1787
diff
changeset
|
8 |
from demandload import * |
cd5c1db2132a
make lock module use demandload.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1787
diff
changeset
|
9 |
demandload(globals(), 'errno os time util') |
161 | 10 |
|
1753
e6e70450edb9
Raise a different exception when the lock is not available
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
11 |
class LockException(Exception): |
e6e70450edb9
Raise a different exception when the lock is not available
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
12 |
pass |
e6e70450edb9
Raise a different exception when the lock is not available
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
13 |
class LockHeld(LockException): |
e6e70450edb9
Raise a different exception when the lock is not available
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
14 |
pass |
e6e70450edb9
Raise a different exception when the lock is not available
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
15 |
class LockUnavailable(LockException): |
161 | 16 |
pass |
17 |
||
1559
59b3639df0a9
Convert all classes to new-style classes by deriving them from object.
Eric Hopper <hopper@omnifarious.org>
parents:
1530
diff
changeset
|
18 |
class lock(object): |
1787
e431344e604c
add a timeout when a lock is held (default 1024 sec)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1753
diff
changeset
|
19 |
def __init__(self, file, timeout=-1, releasefn=None): |
161 | 20 |
self.f = file |
21 |
self.held = 0 |
|
1787
e431344e604c
add a timeout when a lock is held (default 1024 sec)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1753
diff
changeset
|
22 |
self.timeout = timeout |
1530
abfab59fce79
add a releasefn keyword to lock.lock
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1062
diff
changeset
|
23 |
self.releasefn = releasefn |
161 | 24 |
self.lock() |
25 |
||
26 |
def __del__(self): |
|
27 |
self.release() |
|
28 |
||
29 |
def lock(self): |
|
1787
e431344e604c
add a timeout when a lock is held (default 1024 sec)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1753
diff
changeset
|
30 |
timeout = self.timeout |
161 | 31 |
while 1: |
32 |
try: |
|
33 |
self.trylock() |
|
34 |
return 1 |
|
35 |
except LockHeld, inst: |
|
1787
e431344e604c
add a timeout when a lock is held (default 1024 sec)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1753
diff
changeset
|
36 |
if timeout != 0: |
161 | 37 |
time.sleep(1) |
1787
e431344e604c
add a timeout when a lock is held (default 1024 sec)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1753
diff
changeset
|
38 |
if timeout > 0: |
e431344e604c
add a timeout when a lock is held (default 1024 sec)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1753
diff
changeset
|
39 |
timeout -= 1 |
161 | 40 |
continue |
41 |
raise inst |
|
515 | 42 |
|
161 | 43 |
def trylock(self): |
44 |
pid = os.getpid() |
|
45 |
try: |
|
422
10c43444a38e
[PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents:
161
diff
changeset
|
46 |
util.makelock(str(pid), self.f) |
161 | 47 |
self.held = 1 |
1753
e6e70450edb9
Raise a different exception when the lock is not available
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
48 |
except (OSError, IOError), why: |
e6e70450edb9
Raise a different exception when the lock is not available
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
49 |
if why.errno == errno.EEXIST: |
e6e70450edb9
Raise a different exception when the lock is not available
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
50 |
raise LockHeld(util.readlock(self.f)) |
e6e70450edb9
Raise a different exception when the lock is not available
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
51 |
else: |
e6e70450edb9
Raise a different exception when the lock is not available
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1559
diff
changeset
|
52 |
raise LockUnavailable(why) |
161 | 53 |
|
54 |
def release(self): |
|
55 |
if self.held: |
|
56 |
self.held = 0 |
|
1530
abfab59fce79
add a releasefn keyword to lock.lock
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1062
diff
changeset
|
57 |
if self.releasefn: |
abfab59fce79
add a releasefn keyword to lock.lock
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
1062
diff
changeset
|
58 |
self.releasefn() |
503
c6a2e41c8c60
Fix troubles with clone and exception handling
mpm@selenic.com
parents:
429
diff
changeset
|
59 |
try: |
c6a2e41c8c60
Fix troubles with clone and exception handling
mpm@selenic.com
parents:
429
diff
changeset
|
60 |
os.unlink(self.f) |
c6a2e41c8c60
Fix troubles with clone and exception handling
mpm@selenic.com
parents:
429
diff
changeset
|
61 |
except: pass |
161 | 62 |