author | Bryan O'Sullivan <bos@serpentine.com> |
Wed, 14 Sep 2005 10:50:03 -0700 | |
changeset 1247 | 7a70dafbf4b9 |
parent 1062 | 6d5a62a549fa |
child 1530 | abfab59fce79 |
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 |
||
8 |
import os, time |
|
422
10c43444a38e
[PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents:
161
diff
changeset
|
9 |
import util |
161 | 10 |
|
11 |
class LockHeld(Exception): |
|
12 |
pass |
|
13 |
||
14 |
class lock: |
|
1062 | 15 |
def __init__(self, file, wait=1): |
161 | 16 |
self.f = file |
17 |
self.held = 0 |
|
18 |
self.wait = wait |
|
19 |
self.lock() |
|
20 |
||
21 |
def __del__(self): |
|
22 |
self.release() |
|
23 |
||
24 |
def lock(self): |
|
25 |
while 1: |
|
26 |
try: |
|
27 |
self.trylock() |
|
28 |
return 1 |
|
29 |
except LockHeld, inst: |
|
30 |
if self.wait: |
|
31 |
time.sleep(1) |
|
32 |
continue |
|
33 |
raise inst |
|
515 | 34 |
|
161 | 35 |
def trylock(self): |
36 |
pid = os.getpid() |
|
37 |
try: |
|
422
10c43444a38e
[PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents:
161
diff
changeset
|
38 |
util.makelock(str(pid), self.f) |
161 | 39 |
self.held = 1 |
704
5ca319a641e1
Make makelock and readlock work on filesystems without symlink support.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
515
diff
changeset
|
40 |
except (OSError, IOError): |
422
10c43444a38e
[PATCH] Enables lock work under the other 'OS'
mpm@selenic.com
parents:
161
diff
changeset
|
41 |
raise LockHeld(util.readlock(self.f)) |
161 | 42 |
|
43 |
def release(self): |
|
44 |
if self.held: |
|
45 |
self.held = 0 |
|
503
c6a2e41c8c60
Fix troubles with clone and exception handling
mpm@selenic.com
parents:
429
diff
changeset
|
46 |
try: |
c6a2e41c8c60
Fix troubles with clone and exception handling
mpm@selenic.com
parents:
429
diff
changeset
|
47 |
os.unlink(self.f) |
c6a2e41c8c60
Fix troubles with clone and exception handling
mpm@selenic.com
parents:
429
diff
changeset
|
48 |
except: pass |
161 | 49 |