File: //proc/self/root/usr/lib64/python2.7/Demo/pdist/cvslock.pyo
�
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.<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'