//usr/lib64/lib64//python2.7/Demo//ó
V
Qc @ sô d Z d d l Z d d l Z d d l Z d d l Z d Z d Z d Z d Z d Z d d d „ ƒ YZ
d
e
f d „ ƒ YZ d d d
„ ƒ YZ d „ Z
d e f d „ ƒ YZ d e f d „ ƒ YZ e d „ Z d „ Z e d k rð e ƒ n d S( sû CVS locking algorithm.
CVS locking strategy
====================
As reverse engineered from the CVS 1.3 sources (file lock.c):
- Locking is done on a per repository basis (but a process can hold
write locks for multiple directories); all lock files are placed in
the repository and have names beginning with "#cvs.".
- Before even attempting to lock, a file "#cvs.tfl." is created
(and removed again), to test that we can write the repository. [The
algorithm can still be fooled (1) if the repository's mode is changed
while attempting to lock; (2) if this file exists and is writable but
the directory is not.]
- While creating the actual read/write lock files (which may exist for
a long time), a "meta-lock" is held. The meta-lock is a directory
named "#cvs.lock" in the repository. The meta-lock is also held while
a write lock is held.
- To set a read lock:
- acquire the meta-lock
- create the file "#cvs.rfl."
- release the meta-lock
- To set a write lock:
- acquire the meta-lock
- check that there are no files called "#cvs.rfl.*"
- if there are, release the meta-lock, sleep, try again
- create the file "#cvs.wfl."
- To release a write lock:
- remove the file "#cvs.wfl."
- rmdir the meta-lock
- To release a read lock:
- remove the file "#cvs.rfl."
Additional notes
----------------
- A process should read-lock at most one repository at a time.
- A process may write-lock as many repositories as it wishes (to avoid
deadlocks, I presume it should always lock them top-down in the
directory hierarchy).
- A process should make sure it removes all its lock files and
directories when it crashes.
- Limitation: one user id should not be committing files into the same
repository at the same time.
Turn this into Python code
--------------------------
rl = ReadLock(repository, waittime)
wl = WriteLock(repository, waittime)
list = MultipleWriteLock([repository1, repository2, ...], waittime)
iÿÿÿÿNi
i s #cvs.lcks #cvs.rfl.s #cvs.wfl.t Errorc B s# e Z d „ Z d „ Z d „ Z RS( c C s
| | _ d S( N( t msg( t selfR ( ( s* /usr/lib64/python2.7/Demo/pdist/cvslock.pyt __init__` s c C s
t | j ƒ S( N( t reprR ( R ( ( s* /usr/lib64/python2.7/Demo/pdist/cvslock.pyt __repr__c s c C s
t | j ƒ S( N( t strR ( R ( ( s* /usr/lib64/python2.7/Demo/pdist/cvslock.pyt __str__f s ( t __name__t
__module__R R R ( ( ( s* /usr/lib64/python2.7/Demo/pdist/cvslock.pyR ^ s t Lockedc B s e Z RS( ( R R ( ( ( s* /usr/lib64/python2.7/Demo/pdist/cvslock.pyR
j s t Lockc B sV e Z d e d „ Z d „ Z d „ Z d „ Z d „ Z d „ Z d „ Z d „ Z
RS( t .c C sx | | _ | | _ d | _ d | _ t t j ƒ ƒ } | j t ƒ | _
| j t | ƒ | _ | j t
| ƒ | _ d S( N( t
repositoryt delayt Nonet lockdirt lockfileR t ost getpidt joint CVSLCKt cvslckt CVSRFLt cvsrflt CVSWFLt cvswfl( R R
R t pid( ( s* /usr/lib64/python2.7/Demo/pdist/cvslock.pyR p s c C s d GH| j ƒ d S( Nt __del__( t unlock( R ( ( s* /usr/lib64/python2.7/Demo/pdist/cvslock.pyR z s c C s¿ x¸ y' | j | _ t j | j d ƒ d SWq t j k
r· } d | _ | d t k r› y t j | j ƒ } Wn t j k
r‡ q n X| j | ƒ q n t d | j
| f ƒ ‚ q Xq d S( Niÿ i s failed to lock %s: %s( R R R t mkdirt errorR t EEXISTt statt sleepR R
( R R t st( ( s* /usr/lib64/python2.7/Demo/pdist/cvslock.pyt
setlockdir~ s
c C s | j ƒ | j ƒ d S( N( t
unlockfilet unlockdir( R ( ( s* /usr/lib64/python2.7/Demo/pdist/cvslock.pyR s
c C sP | j rL d G| j GHy t j | j ƒ Wn t j k
r? n Xd | _ n d S( Nt unlink( R R R' R R ( R ( ( s* /usr/lib64/python2.7/Demo/pdist/cvslock.pyR% ” s c C sP | j rL d G| j GHy t j | j ƒ Wn t j k
r? n Xd | _ n d S( Nt rmdir( R R R( R R ( R ( ( s* /usr/lib64/python2.7/Demo/pdist/cvslock.pyR&