o
     JAf*7                     @   s   	 d Z ddlZddlmZ ddlmZ ddlmZ G dd dZG d	d
 d
eejZG dd dejZ	G dd deejZ
G dd deejZG dd deZdS ))LockEvent	Condition	SemaphoreBoundedSemaphore    N   )
exceptions)mixins)tasksc                   @   s   e Zd Zdd Zdd ZdS )_ContextManagerMixinc                    s   |   I d H  d S N)acquireself r   $/usr/lib/python3.10/asyncio/locks.py
__aenter__   s   z_ContextManagerMixin.__aenter__c                    s   |    d S r   )release)r   exc_typeexctbr   r   r   	__aexit__   s   z_ContextManagerMixin.__aexit__N)__name__
__module____qualname__r   r   r   r   r   r   r      s    r   c                       R   e Zd Z	 ejd fdd
Z fddZdd Zdd	 Zd
d Z	dd Z
  ZS )r   loopc                   s   t  j|d d | _d| _d S Nr   F)super__init___waiters_lockedr   r   	__class__r   r   r    M   s   
zLock.__init__c                    L   t   }| jr
dnd}| jr| dt| j }d|dd  d| dS 	Nlockedunlocked
, waiters:<r    []>)r   __repr__r"   r!   lenr   resextrar$   r   r   r/   R   
   
zLock.__repr__c                 C      	 | j S r   )r"   r   r   r   r   r(   Y      zLock.lockedc              	      s   	 | j s| jd u stdd | jD rd| _ dS | jd u r#t | _|   }| j| zz|I d H  W | j| n| j| w W n t	j
yV   | j sU|    w d| _ dS )Nc                 s   s    | ]}|  V  qd S r   	cancelled.0wr   r   r   	<genexpr>d   s    zLock.acquire.<locals>.<genexpr>T)r"   r!   allcollectionsdeque	_get_loopcreate_futureappendremover   CancelledError_wake_up_firstr   futr   r   r   r   ]   s,   

 zLock.acquirec                 C   s"   	 | j rd| _ |   d S td)NFzLock is not acquired.)r"   rE   RuntimeErrorr   r   r   r   r   }   s
   
zLock.releasec                 C   sN   	 | j sd S z	tt| j }W n
 ty   Y d S w | s%|d d S d S NT)r!   nextiterStopIterationdone
set_resultrF   r   r   r   rE      s   zLock._wake_up_first)r   r   r   r	   _markerr    r/   r(   r   r   rE   __classcell__r   r   r$   r   r      s    5 r   c                       r   )r   r   c                   s"   t  j|d t | _d| _d S r   )r   r    r>   r?   r!   _valuer#   r$   r   r   r       s   

zEvent.__init__c                    r&   )	NsetZunsetr*   r+   r   r,   r-   r.   )r   r/   rQ   r!   r0   r1   r$   r   r   r/      r4   zEvent.__repr__c                 C   r5   r   rQ   r   r   r   r   is_set   r6   zEvent.is_setc                 C   s4   	 | j sd| _ | jD ]}| s|d q
d S d S rI   )rQ   r!   rM   rN   rF   r   r   r   rR      s   

z	Event.setc                 C   s   	 d| _ d S )NFrS   r   r   r   r   clear   s   
zEvent.clearc              	      sR   	 | j rdS |   }| j| z|I d H  W | j| dS | j| w rI   )rQ   r@   rA   r!   rB   rC   rF   r   r   r   wait   s   
z
Event.wait)r   r   r   r	   rO   r    r/   rT   rR   rU   rV   rP   r   r   r$   r   r      s    r   c                       sV   e Zd Z	 dejd fddZ fddZdd Zd	d
 ZdddZ	dd Z
  ZS )r   Nr   c                   sH   t  j|d |d u rt }|| _|j| _|j| _|j| _t | _	d S Nr   )
r   r    r   _lockr(   r   r   r>   r?   r!   )r   lockr   r$   r   r   r       s   zCondition.__init__c                    sN   t   }|  rdnd}| jr| dt| j }d|dd  d| dS r'   )r   r/   r(   r!   r0   r1   r$   r   r   r/      s
   
zCondition.__repr__c                    s   	 |   s
td|   zB|   }| j| z.|I d H  W | j| W d}	 z	|  I d H  W n t	j
yA   d}Y nw q,|rHt	j
dS | j| w d}	 z	|  I d H  W n t	j
yi   d}Y nw qT|rpt	j
w )Nzcannot wait on un-acquired lockFT)r(   rH   r   r@   rA   r!   rB   rC   r   r   rD   )r   rG   r8   r   r   r   rV      sH   

zCondition.waitc                    s*   	 | }|s|   I d H  | }|r|S r   )rV   )r   	predicateresultr   r   r   wait_for  s   zCondition.wait_forr   c                 C   sN   	 |   s	tdd}| jD ]}||kr d S | s$|d7 }|d qd S )Nz!cannot notify on un-acquired lockr   r   F)r(   rH   r!   rM   rN   )r   nidxrG   r   r   r   notify,  s   

zCondition.notifyc                 C   s   	 |  t| j d S r   )r_   r0   r!   r   r   r   r   
notify_allD  s   zCondition.notify_allr   r   )r   r   r   r	   rO   r    r/   rV   r\   r_   r`   rP   r   r   r$   r   r      s    	%
r   c                       sT   e Zd Z	 dejd fddZ fddZdd Zd	d
 Zdd Z	dd Z
  ZS )r   r   r   c                   s.   t  j|d |dk rtdd | _|| _d S )Nr   r   z$Semaphore initial value must be >= 0)r   r    
ValueErrorr!   rQ   r   valuer   r$   r   r   r    \  s
   
zSemaphore.__init__c                    sV   t   }|  rdnd| j }| jr| dt| j }d|dd  d| dS )	Nr(   zunlocked, value:r*   r+   r   r,   r-   r.   )r   r/   r(   rQ   r!   r0   r1   r$   r   r   r/   c  s
   
zSemaphore.__repr__c                 C   s$   	 | j dkptdd | jpdD S )Nr   c                 s   s    | ]}|   V  qd S r   r7   r9   r   r   r   r<   m  s    z#Semaphore.locked.<locals>.<genexpr>r   )rQ   anyr!   r   r   r   r   r(   j  s   
zSemaphore.lockedc              	      s   	 |   s|  jd8  _dS | jd u rt | _|   }| j| zz|I d H  W | j| n| j| w W n t	j
yT   | sS|  jd7  _|    w | jdkr^|   dS )Nr   Tr   )r(   rQ   r!   r>   r?   r@   rA   rB   rC   r   rD   r8   _wake_up_nextrF   r   r   r   r   o  s,   

 
zSemaphore.acquirec                 C   s   	 |  j d7  _ |   d S )Nr   )rQ   rf   r   r   r   r   r     s   zSemaphore.releasec                 C   sB   	 | j sd S | j D ]}| s|  jd8  _|d  d S q	d S )Nr   T)r!   rM   rQ   rN   rF   r   r   r   rf     s   

zSemaphore._wake_up_nextra   )r   r   r   r	   rO   r    r/   r(   r   r   rf   rP   r   r   r$   r   r   M  s    $	r   c                       s4   e Zd Z	 dejd fddZ fddZ  ZS )r   r   r   c                   s   || _ t j||d d S rW   )_bound_valuer   r    rc   r$   r   r   r      s   zBoundedSemaphore.__init__c                    s"   | j | jkr
tdt   d S )Nz(BoundedSemaphore released too many times)rQ   rg   rb   r   r   r   r$   r   r   r     s   zBoundedSemaphore.releasera   )r   r   r   r	   rO   r    r   rP   r   r   r$   r   r     s    r   )__all__r>    r   r	   r
   r   Z_LoopBoundMixinr   r   r   r   r   r   r   r   r   <module>   s     >q[