Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/lockfile/mkdirlockfile.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author | shellac |
---|---|
date | Mon, 01 Jun 2020 08:59:25 -0400 |
parents | 79f47841a781 |
children |
comparison
equal
deleted
inserted
replaced
4:79f47841a781 | 5:9b1c78e6ba9c |
---|---|
1 from __future__ import absolute_import, division | |
2 | |
3 import time | |
4 import os | |
5 import sys | |
6 import errno | |
7 | |
8 from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, | |
9 AlreadyLocked) | |
10 | |
11 | |
12 class MkdirLockFile(LockBase): | |
13 """Lock file by creating a directory.""" | |
14 def __init__(self, path, threaded=True, timeout=None): | |
15 """ | |
16 >>> lock = MkdirLockFile('somefile') | |
17 >>> lock = MkdirLockFile('somefile', threaded=False) | |
18 """ | |
19 LockBase.__init__(self, path, threaded, timeout) | |
20 # Lock file itself is a directory. Place the unique file name into | |
21 # it. | |
22 self.unique_name = os.path.join(self.lock_file, | |
23 "%s.%s%s" % (self.hostname, | |
24 self.tname, | |
25 self.pid)) | |
26 | |
27 def acquire(self, timeout=None): | |
28 timeout = timeout if timeout is not None else self.timeout | |
29 end_time = time.time() | |
30 if timeout is not None and timeout > 0: | |
31 end_time += timeout | |
32 | |
33 if timeout is None: | |
34 wait = 0.1 | |
35 else: | |
36 wait = max(0, timeout / 10) | |
37 | |
38 while True: | |
39 try: | |
40 os.mkdir(self.lock_file) | |
41 except OSError: | |
42 err = sys.exc_info()[1] | |
43 if err.errno == errno.EEXIST: | |
44 # Already locked. | |
45 if os.path.exists(self.unique_name): | |
46 # Already locked by me. | |
47 return | |
48 if timeout is not None and time.time() > end_time: | |
49 if timeout > 0: | |
50 raise LockTimeout("Timeout waiting to acquire" | |
51 " lock for %s" % | |
52 self.path) | |
53 else: | |
54 # Someone else has the lock. | |
55 raise AlreadyLocked("%s is already locked" % | |
56 self.path) | |
57 time.sleep(wait) | |
58 else: | |
59 # Couldn't create the lock for some other reason | |
60 raise LockFailed("failed to create %s" % self.lock_file) | |
61 else: | |
62 open(self.unique_name, "wb").close() | |
63 return | |
64 | |
65 def release(self): | |
66 if not self.is_locked(): | |
67 raise NotLocked("%s is not locked" % self.path) | |
68 elif not os.path.exists(self.unique_name): | |
69 raise NotMyLock("%s is locked, but not by me" % self.path) | |
70 os.unlink(self.unique_name) | |
71 os.rmdir(self.lock_file) | |
72 | |
73 def is_locked(self): | |
74 return os.path.exists(self.lock_file) | |
75 | |
76 def i_am_locking(self): | |
77 return (self.is_locked() and | |
78 os.path.exists(self.unique_name)) | |
79 | |
80 def break_lock(self): | |
81 if os.path.exists(self.lock_file): | |
82 for name in os.listdir(self.lock_file): | |
83 os.unlink(os.path.join(self.lock_file, name)) | |
84 os.rmdir(self.lock_file) |