Your IP : 3.129.211.190
�
��^c @ 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.<pid>" 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.<pid>"
- 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.<pid>"
- To release a write lock:
- remove the file "#cvs.wfl.<pid>"
- rmdir the meta-lock
- To release a read lock:
- remove the file "#cvs.rfl.<pid>"
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'