~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to loggerhead/lockfile.py

port the few remaining and relevant fixes from annotate.kid to annotate.pt

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
 
26
26
with_lock = util.with_lock('_tlock', 'LockFile')
27
27
 
 
28
MAX_STALE_TIME = 5 * 60
 
29
 
28
30
 
29
31
class LockFile (object):
30
32
    """
33
35
    lock may be acquired multiple times by the same thread, as long as it's
34
36
    released an equal number of times.  unlike threading.Lock, this lock can
35
37
    be used across processes.
36
 
    
 
38
 
37
39
    this uses os.open(O_CREAT|O_EXCL), which apparently works even on windows,
38
40
    but will not work over NFS, if anyone still uses that.  so don't put the
39
41
    cache folder on an NFS server...
44
46
        # thread lock to maintain internal consistency
45
47
        self._tlock = threading.Lock()
46
48
        self._count = 0
47
 
    
 
49
        if os.path.exists(filename):
 
50
            # remove stale locks left over from a previous run
 
51
            if time.time() - os.stat(filename).st_mtime > MAX_STALE_TIME:
 
52
                os.remove(filename)
 
53
 
48
54
    @with_lock
49
55
    def _try_acquire(self):
50
56
        if self._count > 0:
57
63
            return True
58
64
        except OSError:
59
65
            return False
60
 
    
 
66
 
61
67
    def acquire(self):
62
68
        # try over and over, sleeping on exponential backoff with an upper limit of about 5 seconds
63
69
        pause = 0.1