~ibmcharmers/charms/xenial/ibm-cinder-storwize-svc/trunk

« back to all changes in this revision

Viewing changes to .tox/py35/lib/python3.5/site-packages/pip/_vendor/lockfile/mkdirlockfile.py

  • Committer: Ankammarao
  • Date: 2017-03-06 05:11:42 UTC
  • Revision ID: achittet@in.ibm.com-20170306051142-dpg27z4es1k56hfn
Marked tests folder executable

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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)