View file File name : cvslock.pyo Content :� ��^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'