o
    $¼"b³  ã                   @   sÒ   d Z ddlmZmZ ddlZddl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 ddlmZ dd	lmZ G d
d„ deƒZi Zeƒ ZeeƒG dd„ deƒƒZG dd„ deƒZG dd„ deƒZdZdS )z7holds locking functionality that works across processesé    )Úabsolute_importÚunicode_literalsN)ÚABCMetaÚabstractmethod)Úcontextmanager)ÚLockÚRLock)ÚFileLockÚTimeout)Úadd_metaclass)ÚPathc                       s8   e Zd Z‡ fdd„Zd
‡ fdd„	Zd‡ fdd	„	Z‡  ZS )Ú_CountedFileLockc                    s\   t j |¡}t j |¡szt  |¡ W n	 ty   Y nw tt| ƒ |¡ d| _	t
ƒ | _d S ©Nr   )ÚosÚpathÚdirnameÚisdirÚmakedirsÚOSErrorÚsuperr   Ú__init__Úcountr   Úthread_safe)ÚselfÚ	lock_fileÚparent©Ú	__class__© ú6/usr/lib/python3/dist-packages/virtualenv/util/lock.pyr      s   ÿz_CountedFileLock.__init__Nçš™™™™™©?c                    sV   | j � | jdkrtt| ƒ ||¡ |  jd7  _W d   ƒ d S 1 s$w   Y  d S )Nr   é   )r   r   r   r   Úacquire)r   ÚtimeoutÚpoll_intervalr   r   r   r"      s
   
"ýz_CountedFileLock.acquireFc                    sZ   | j �  | jdkrtt| ƒj|d� t| jd dƒ| _W d   ƒ d S 1 s&w   Y  d S )Nr!   )Úforcer   )r   r   r   r   ÚreleaseÚ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                   @   sf   e Zd Zdd„ Z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 )ÚPathLockBasec                 C   s(   t |ƒ}| ¡ r| ¡ | _d S || _d S ©N)r   ÚexistsÚresolver   )r   Úfolderr   r   r   r   r   /   s    zPathLockBase.__init__c                 C   s   d  | jj| j¡S )Nz{}({}))Úformatr   r)   r   ©r   r   r   r   Ú__repr__3   ó   zPathLockBase.__repr__c                 C   s   t | ƒ| j| ƒS r.   )Útyper   ©r   Úotherr   r   r   Ú__div__6   r5   zPathLockBase.__div__c                 C   s
   |   |¡S r.   )r9   r7   r   r   r   Ú__truediv__9   s   
zPathLockBase.__truediv__c                 C   ó   t ‚r.   ©ÚNotImplementedErrorr3   r   r   r   Ú	__enter__<   ó   zPathLockBase.__enter__c                 C   r;   r.   r<   ©r   Úexc_typeÚexc_valÚexc_tbr   r   r   Ú__exit__@   r?   zPathLockBase.__exit__Fc                 C   r;   r.   r<   ©r   ÚnameÚno_blockr   r   r   Úlock_for_keyD   ó   zPathLockBase.lock_for_keyc                 C   r;   r.   r<   )rF   r   r   r   Únon_reentrant_lock_for_keyI   rI   z'PathLockBase.non_reentrant_lock_for_keyNr(   )r)   r*   r+   r   r4   r9   r:   r   r>   rD   r   rH   rJ   r   r   r   r   r-   -   s    

r-   c                       sz   e Zd Z‡ fdd„Zddd„Zedd„ ƒZ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 )ÚReentrantFileLockc                    s   t t| ƒ |¡ d | _d S r.   )r   rK   r   Ú_lock)r   r1   r   r   r   r   P   s   
zReentrantFileLock.__init__Ú c                 C   sX   t | jd |¡ ƒ}t� |tvrt|ƒt|< t| W  d   ƒ S 1 s%w   Y  d S ©Nz{}.lock)Ústrr   r2   Ú_store_lockÚ_lock_storer   )r   rF   r   r   r   r   Ú_create_lockT   s   $ýzReentrantFileLock._create_lockc              	   C   s„   | d ur@t �0 | j� | jdkrt | jd ¡ W d   ƒ n1 s!w   Y  W d   ƒ d S W d   ƒ d S 1 s9w   Y  d S d S r   )rP   r   r   rQ   Úpopr   ©Úlockr   r   r   Ú	_del_lock[   s   
€þÿ"ÿÿzReentrantFileLock._del_lockc                 C   s   |   | j¡ d S r.   )rV   rL   r3   r   r   r   Ú__del__c   s   zReentrantFileLock.__del__c                 C   s   |   ¡ | _|  | j¡ d S r.   )rR   rL   Ú
_lock_filer3   r   r   r   r>   f   s   
zReentrantFileLock.__enter__c                 C   s"   |   | j¡ |  | j¡ d | _d S r.   )Ú_releaserL   rV   r@   r   r   r   rD   j   s   
zReentrantFileLock.__exit__Fc                 C   sr   z
t  t| jƒ¡ W n	 ty   Y nw z| d¡ W d S  ty8   |r&‚ t d|j	¡ | 
¡  | ¡  Y d S w )Ng-Cëâ6?z/lock file %s present, will block until released)r   r   rO   r   r   r"   r
   ÚloggingÚdebugr   r&   )r   rU   rG   r   r   r   rX   o   s   ÿûzReentrantFileLock._lock_filec                 C   s   |   ¡  d S r.   )r&   rT   r   r   r   rY   €   s   zReentrantFileLock._releasec              	   c   s`   � |   |¡}z!z|  ||¡ d V  W |  |¡ n|  |¡ w W |  |¡ d }d S |  |¡ d }w r.   )rR   rX   rY   rV   )r   rF   rG   rU   r   r   r   rH   „   s   €


ÿzReentrantFileLock.lock_for_keyc                 c   sF   � t t| jd |¡ ƒƒ� d V  W d   ƒ d S 1 sw   Y  d S rN   )r   rO   r   r2   ©r   rF   r   r   r   rJ   ‘   s   €"ÿz,ReentrantFileLock.non_reentrant_lock_for_key)rM   r(   )r)   r*   r+   r   rR   ÚstaticmethodrV   rW   r>   rD   rX   rY   r   rH   rJ   r,   r   r   r   r   rK   O   s    



rK   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   r;   r.   r<   r3   r   r   r   r>   ˜   ó   zNoOpFileLock.__enter__c                 C   r;   r.   r<   r@   r   r   r   rD   ›   r_   zNoOpFileLock.__exit__Fc                 c   ó   � d V  d S r.   r   rE   r   r   r   rH   ž   ó   €
zNoOpFileLock.lock_for_keyc                 c   r`   r.   r   r\   r   r   r   rJ   ¢   ra   z'NoOpFileLock.non_reentrant_lock_for_keyNr(   )r)   r*   r+   r>   rD   r   rH   rJ   r   r   r   r   r^   —   s    r^   )r^   rK   r
   )Ú__doc__Ú
__future__r   r   rZ   r   Úabcr   r   Ú
contextlibr   Ú	threadingr   r   Úfilelockr	   r
   Úsixr   Úvirtualenv.util.pathr   r   rQ   rP   Úobjectr-   rK   r^   Ú__all__r   r   r   r   Ú<module>   s$    !H