equal
deleted
inserted
replaced
|
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 |
|
9 |
|
10 class LockHeld(Exception): |
|
11 pass |
|
12 |
|
13 class lock: |
|
14 def __init__(self, file, wait = 1): |
|
15 self.f = file |
|
16 self.held = 0 |
|
17 self.wait = wait |
|
18 self.lock() |
|
19 |
|
20 def __del__(self): |
|
21 self.release() |
|
22 |
|
23 def lock(self): |
|
24 while 1: |
|
25 try: |
|
26 self.trylock() |
|
27 return 1 |
|
28 except LockHeld, inst: |
|
29 if self.wait: |
|
30 time.sleep(1) |
|
31 continue |
|
32 raise inst |
|
33 |
|
34 def trylock(self): |
|
35 pid = os.getpid() |
|
36 try: |
|
37 os.symlink(str(pid), self.f) |
|
38 self.held = 1 |
|
39 except: |
|
40 raise LockHeld(os.readlink(self.f)) |
|
41 |
|
42 def release(self): |
|
43 if self.held: |
|
44 self.held = 0 |
|
45 os.unlink(self.f) |
|
46 |