o
    Wi*                     @  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 dd	lmZmZ erJdd
lmZ ddlmZ eeZG dd deZi Ze ZG dd deZG dd deZ G dd deZ!g dZ"dS )z8holds locking functionality that works across processes.    )annotationsN)ABCabstractmethod)contextmanagersuppress)Path)LockRLock)TYPE_CHECKING)FileLockTimeout)Iterator)TracebackTypec                      sB   e Zd Zd fddZ		dd fddZdd fddZ  ZS )_CountedFileLock	lock_filestrreturnNonec                   s`   t j|}tt t j|dd W d    n1 sw   Y  t | d| _t	 | _
d S )NTexist_okr   )ospathdirnamer   OSErrormakedirssuper__init__countr	   thread_safe)selfr   parent	__class__ H/home/ubuntu/.local/lib/python3.10/site-packages/virtualenv/util/lock.pyr      s   
z_CountedFileLock.__init__N皙?timeoutfloat | Nonepoll_intervalfloatc                   sn   | j j|d u r	dn|dst| j| jdkr.z	t || W n ty-   | j    w |  jd7  _d S )N)r&   r      )r   acquirer   r   r   r   BaseExceptionrelease)r   r&   r(   r!   r#   r$   r,       s   


z_CountedFileLock.acquireFforceboolc                   s   | j ; | jdkr.| jdkrt j|d |  jd8  _| jdkr6| j   W d    d S W d    d S W d    d S 1 sAw   Y  d S )Nr   r+   )r/   )r   r   r   r.   )r   r/   r!   r#   r$   r.   /   s   


"z_CountedFileLock.release)r   r   r   r   )Nr%   )r&   r'   r(   r)   r   r   F)r/   r0   r   r   )__name__
__module____qualname__r   r,   r.   __classcell__r#   r#   r!   r$   r      s    r   c                   @  sl   e Zd Zd!ddZd"dd	Zd#ddZed$ddZed%ddZee	d&d'ddZ
ee	d(ddZd S ))PathLockBasefolder
str | Pathr   r   c                 C  s(   t |}| r| | _d S || _d S N)r   existsresolver   )r   r7   r   r#   r#   r$   r   ?   s    zPathLockBase.__init__r   c                 C  s   | j j d| j dS )N())r"   r2   r   r   r#   r#   r$   __repr__C   s   zPathLockBase.__repr__otherc                 C  s   t | | j| S r9   )typer   )r   r@   r#   r#   r$   __truediv__F   s   zPathLockBase.__truediv__c                 C     t r9   NotImplementedErrorr>   r#   r#   r$   	__enter__I   s   zPathLockBase.__enter__exc_typetype[BaseException] | Noneexc_valBaseException | Noneexc_tbTracebackType | Nonec                 C  rC   r9   rD   r   rG   rI   rK   r#   r#   r$   __exit__M   s   zPathLockBase.__exit__Fnameno_blockr0   Iterator[None]c                 C  rC   r9   rD   r   rO   rP   r#   r#   r$   lock_for_keyS      zPathLockBase.lock_for_keyc                 C  rC   r9   rD   r   rO   r#   r#   r$   non_reentrant_lock_for_keyX   rT   z'PathLockBase.non_reentrant_lock_for_keyNr7   r8   r   r   )r   r   )r@   r   r   r6   r   r   rG   rH   rI   rJ   rK   rL   r   r   r1   rO   r   rP   r0   r   rQ   rO   r   r   rQ   )r2   r3   r4   r   r?   rB   r   rF   rN   r   rS   rV   r#   r#   r#   r$   r6   >   s    


r6   c                      s   e Zd Zd) fddZd*d+ddZed,ddZd-ddZd-ddZd.ddZ	d/d0d d!Z
ed1d"d#Zed/d2d%d&Zed3d'd(Z  ZS )4ReentrantFileLockr7   r8   r   r   c                   s   t  | d | _d S r9   )r   r   _lock)r   r7   r!   r#   r$   r   _   s   
zReentrantFileLock.__init__ rO   r   r   c                 C  sX   t | j| d }t |tvrt|t|< t| W  d    S 1 s%w   Y  d S Nz.lock)r   r   _store_lock_lock_storer   )r   rO   r   r#   r#   r$   _create_lockc   s   $zReentrantFileLock._create_locklock_CountedFileLock | Nonec              	   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 )Nr   )r`   r   r   ra   popr   rc   r#   r#   r$   	_del_lockj   s   
PzReentrantFileLock._del_lockc                 C  s   |  | j d S r9   )rg   r]   r>   r#   r#   r$   __del__q   s   zReentrantFileLock.__del__c                 C  s   |   | _| | j d S r9   )rb   r]   
_lock_filer>   r#   r#   r$   rF   t   s   
zReentrantFileLock.__enter__rG   rH   rI   rJ   rK   rL   c                 C  s"   |  | j | | j d | _d S r9   )_releaser]   rg   rM   r#   r#   r$   rN   x   s   
zReentrantFileLock.__exit__FrP   r0   c                 C  s   t t tjt| jdd W d    n1 sw   Y  z|d W d S  tyB   |r0 t	d|j
 |  |  Y d S w )NTr   g-C6?z/lock file %s present, will block until released)r   r   r   r   r   r   r,   r   LOGGERdebugr   r.   )r   rc   rP   r#   r#   r$   ri      s   
zReentrantFileLock._lock_filec                 C  s   |    d S r9   )r.   rf   r#   r#   r$   rj      s   zReentrantFileLock._releaserQ   c              	   c  s`    |  |}z!z| || d V  W | | n| | w W | | d }d S | | d }w r9   )rb   ri   rj   rg   )r   rO   rP   rc   r#   r#   r$   rS      s   


zReentrantFileLock.lock_for_keyc                 c  sF    t t| j| d  d V  W d    d S 1 sw   Y  d S r_   )r   r   r   rU   r#   r#   r$   rV      s   "z,ReentrantFileLock.non_reentrant_lock_for_keyrW   )r^   )rO   r   r   r   )rc   rd   r   r   rX   rY   r1   )rc   r   rP   r0   r   r   )rc   r   r   r   rZ   r[   )r2   r3   r4   r   rb   staticmethodrg   rh   rF   rN   ri   rj   r   rS   rV   r5   r#   r#   r!   r$   r\   ^   s    


r\   c                   @  s>   e Zd ZdddZdddZeddddZedddZdS )NoOpFileLockr   r   c                 C  rC   r9   rD   r>   r#   r#   r$   rF      s   zNoOpFileLock.__enter__rG   rH   rI   rJ   rK   rL   c                 C  rC   r9   rD   rM   r#   r#   r$   rN      rT   zNoOpFileLock.__exit__FrO   r   rP   r0   rQ   c                 c      d V  d S r9   r#   rR   r#   r#   r$   rS         
zNoOpFileLock.lock_for_keyc                 c  ro   r9   r#   rU   r#   r#   r$   rV      rp   z'NoOpFileLock.non_reentrant_lock_for_keyNrX   rY   r1   rZ   r[   )r2   r3   r4   rF   rN   r   rS   rV   r#   r#   r#   r$   rn      s    

rn   )rn   r\   r   )#__doc__
__future__r   loggingr   abcr   r   
contextlibr   r   pathlibr   	threadingr   r	   typingr
   filelockr   r   collections.abcr   typesr   	getLoggerr2   rk   r   ra   r`   r6   r\   rn   __all__r#   r#   r#   r$   <module>   s*    
$ H