U
    b^                     @   s   d Z ddlmZmZ ddlZddl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 G dd	 d	eZi Ze	 ZG d
d deZdS )z7holds locking functionality that works across processes    )absolute_importunicode_literalsN)contextmanager)LockRLock)FileLockTimeout)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 t| | d| _t | _d S Nr   )superr
   __init__countr   thread_safe)self	lock_file	__class__ 6/usr/lib/python3/dist-packages/virtualenv/util/lock.pyr      s    z_CountedFileLock.__init__N皙?c              	      sB   | j 2 | jdkr&tt| j||d |  jd7  _W 5 Q R X d S )Nr   )timeoutpoll_intervall   )r   r   r   r
   acquire)r   r   r   r   r   r   r      s    
z_CountedFileLock.acquireFc              	      s@   | j 0 | jdkr tt|   t| jd d| _W 5 Q R X d S )Nr   r   )r   r   r   r
   releasemax)r   Zforcer   r   r   r      s    
z_CountedFileLock.release)Nr   )F)__name__
__module____qualname__r   r   r   __classcell__r   r   r   r   r
      s   r
   c                   @   sz   e Zd Zdd Zdd Zdd Zdd Zdd
dZedd Z	dd Z
dd Zdd Zdd Zedd Zedd ZdS )ReentrantFileLockc                 C   s(   d | _ t|}| r| n|| _d S N)_lockr	   existsZresolvepath)r   Zfolderr%   r   r   r   r   &   s    zReentrantFileLock.__init__c                 C   s   d | jj| jS )Nz{}({}))formatr   r   r%   r   r   r   r   __repr__+   s    zReentrantFileLock.__repr__c                 C   s   t | j| S r"   )r!   r%   r   otherr   r   r   __div__.   s    zReentrantFileLock.__div__c                 C   s
   |  |S r"   )r+   r)   r   r   r   __truediv__1   s    zReentrantFileLock.__truediv__ 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)strr%   r&   _store_lock_lock_storer
   )r   namer   r   r   r   _create_lock4   s
    zReentrantFileLock._create_lockc              
   C   sF   t 8 | d k	r8| j | jdkr.t| jd  W 5 Q R X W 5 Q R X d S r   )r/   r   r   r0   popr   lockr   r   r   	_del_lock;   s
    
zReentrantFileLock._del_lockc                 C   s   |  | j d S r"   )r6   r#   r'   r   r   r   __del__C   s    zReentrantFileLock.__del__c                 C   s   |   | _| | j d S r"   )r2   r#   
_lock_filer'   r   r   r   	__enter__F   s    
zReentrantFileLock.__enter__c                 C   s   |  | j d S r"   )_releaser#   )r   exc_typeZexc_valexc_tbr   r   r   __exit__J   s    zReentrantFileLock.__exit__c                 C   sp   zt t| j W n tk
r(   Y nX z|d W n2 tk
rj   td|j	 |
  |  Y nX d S )Ng-C6?z/lock file %s present, will block until released)osmakedirsr.   r%   OSErrorr   r   loggingdebugr   r   )r   r5   r   r   r   r8   M   s    zReentrantFileLock._lock_filec                 C   s   |    d S r"   )r   r4   r   r   r   r:   \   s    zReentrantFileLock._releasec              	   c   sB   |  |}z&z| | d V  W 5 | | X W 5 | | X d S r"   )r2   r6   r:   r8   )r   r1   r5   r   r   r   lock_for_key`   s    


zReentrantFileLock.lock_for_keyN)r-   )r   r   r   r   r(   r+   r,   r2   staticmethodr6   r7   r9   r=   r8   r:   r   rC   r   r   r   r   r!   %   s   


r!   )__doc__Z
__future__r   r   rA   r>   
contextlibr   Z	threadingr   r   Zfilelockr   r   Zvirtualenv.util.pathr	   r
   r0   r/   objectr!   r   r   r   r   <module>   s   