comparison env/lib/python3.7/site-packages/lockfile/mkdirlockfile.py @ 0:26e78fe6e8c4 draft

"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author shellac
date Sat, 02 May 2020 07:14:21 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:26e78fe6e8c4
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)