U
    |e                     @  s   d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	m
Z
 ddlmZ ddlmZmZ ddlmZmZ G d	d
 d
eZi Ze ZG dd dedZG dd deZG dd deZdddgZdS )z8holds locking functionality that works across processes.    )annotationsN)ABCMetaabstractmethod)contextmanagersuppress)Path)LockRLock)FileLockTimeoutc                      s>   e Zd Zdd fddZd fdd	Zd fd
d	Z  ZS )_CountedFileLockNonereturnc              	     sT   t j|}t j|s6tt t | W 5 Q R X t | d| _	t
 | _d S Nr   )ospathdirnameisdirr   OSErrormakedirssuper__init__countr	   thread_safe)self	lock_fileparent	__class__ 8/tmp/pip-unpacked-wheel-tuxcr54r/virtualenv/util/lock.pyr      s    
z_CountedFileLock.__init__N皙?c                   sN   | j j|d krdn|ds$t| j| jdkr<t || |  jd7  _d S )N)timeoutr      )r   acquirer   r   r   r   )r   r$   poll_intervalr   r    r!   r&      s
    

z_CountedFileLock.acquireFc              	     sT   | j D | jdkr| j   | jdkr4t j|d t| jd d| _W 5 Q R X d S )Nr   r%   )force)r   r   releaser   max)r   r(   r   r    r!   r)   !   s    


z_CountedFileLock.release)Nr"   )F)__name__
__module____qualname__r   r&   r)   __classcell__r    r    r   r!   r      s   
r   c                   @  sr   e Zd ZddddZddddZdd	 Zd
d Zedd Zedd Z	ee
dddZee
dd ZdS )PathLockBaser   r   c                 C  s"   t |}| r| n|| _d S N)r   existsresolver   )r   folderr   r    r    r!   r   /   s    zPathLockBase.__init__strc                 C  s   | j j d| j dS )N())r   r+   r   r   r    r    r!   __repr__3   s    zPathLockBase.__repr__c                 C  s   t | | j| S r0   )typer   r   otherr    r    r!   __div__6   s    zPathLockBase.__div__c                 C  s
   |  |S r0   )r<   r:   r    r    r!   __truediv__9   s    zPathLockBase.__truediv__c                 C  s   t d S r0   NotImplementedErrorr7   r    r    r!   	__enter__<   s    zPathLockBase.__enter__c                 C  s   t d S r0   r>   r   exc_typeexc_valexc_tbr    r    r!   __exit__@   s    zPathLockBase.__exit__Fc                 C  s   t d S r0   r>   r   nameno_blockr    r    r!   lock_for_keyD   s    zPathLockBase.lock_for_keyc                 C  s   t d S r0   r>   r   rG   r    r    r!   non_reentrant_lock_for_keyI   s    z'PathLockBase.non_reentrant_lock_for_keyN)F)r+   r,   r-   r   r8   r<   r=   r   r@   rE   r   rI   rK   r    r    r    r!   r/   .   s   

r/   )	metaclassc                      s   e Zd Zdd fddZdddZedd	 Zddd
dZdd Zdd Z	dddZ
edd ZedddZedd Z  ZS )ReentrantFileLockr   r   c                   s   t  | d | _d S r0   )r   r   _lock)r   r3   r   r    r!   r   P   s    zReentrantFileLock.__init__ c              
   C  sL   t | j| d }t* |tkr.t|t|< t| W  5 Q R  S Q R X d S Nz.lock)r4   r   _store_lock_lock_storer   )r   rG   r   r    r    r!   _create_lockT   s
    zReentrantFileLock._create_lockc              
   C  sF   | d k	rBt 0 | j | jdkr.t| jd  W 5 Q R X W 5 Q R X d S r   )rQ   r   r   rR   popr   lockr    r    r!   	_del_lock[   s    
zReentrantFileLock._del_lockc                 C  s   |  | j d S r0   )rW   rN   r7   r    r    r!   __del__b   s    zReentrantFileLock.__del__c                 C  s   |   | _| | j d S r0   )rS   rN   
_lock_filer7   r    r    r!   r@   e   s    
zReentrantFileLock.__enter__c                 C  s"   |  | j | | j d | _d S r0   )_releaserN   rW   rA   r    r    r!   rE   i   s    zReentrantFileLock.__exit__Fc              	   C  sp   t t tt| j W 5 Q R X z|d W n8 tk
rj   |rH t	d|j
 |  |  Y nX d S )Ng-C6?z/lock file %s present, will block until released)r   r   r   r   r4   r   r&   r   loggingdebugr   r)   )r   rV   rH   r    r    r!   rY   n   s    
zReentrantFileLock._lock_filec                 C  s   |    d S r0   )r)   rU   r    r    r!   rZ   ~   s    zReentrantFileLock._releasec              	   c  sH   |  |}z(z| || d V  W 5 | | X W 5 | | d }X d S r0   )rS   rW   rZ   rY   )r   rG   rH   rV   r    r    r!   rI      s    


zReentrantFileLock.lock_for_keyc              	   c  s.   t t| j| d  d V  W 5 Q R X d S rP   )r   r4   r   rJ   r    r    r!   rK      s    z,ReentrantFileLock.non_reentrant_lock_for_key)rO   )F)F)r+   r,   r-   r   rS   staticmethodrW   rX   r@   rE   rY   rZ   r   rI   rK   r.   r    r    r   r!   rM   O   s   



rM   c                   @  s6   e Zd Zdd Zdd ZedddZedd	 Zd
S )NoOpFileLockc                 C  s   t d S r0   r>   r7   r    r    r!   r@      s    zNoOpFileLock.__enter__c                 C  s   t d S r0   r>   rA   r    r    r!   rE      s    zNoOpFileLock.__exit__Fc                 c  s
   d V  d S r0   r    rF   r    r    r!   rI      s    zNoOpFileLock.lock_for_keyc                 c  s
   d V  d S r0   r    rJ   r    r    r!   rK      s    z'NoOpFileLock.non_reentrant_lock_for_keyN)F)r+   r,   r-   r@   rE   r   rI   rK   r    r    r    r!   r^      s   r^   r   )__doc__
__future__r   r[   r   abcr   r   
contextlibr   r   pathlibr   	threadingr   r	   Zfilelockr
   r   r   rR   rQ   r/   rM   r^   __all__r    r    r    r!   <module>   s$   !F