a
    zeM;                     @   s   d Z ddlZddlZddlmZ ddlmZ G dd dZG dd	 d	eZG d
d dZG dd deZ	G dd deZ
G dd de
ZdS ))LockEvent	Condition	SemaphoreBoundedSemaphore    N   )events)
exceptionsc                   @   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.9/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                       sJ   e Zd ZddddZ fddZdd Zd	d
 Zdd Zdd Z  Z	S )r   Nloopc                C   s:   d | _ d| _|d u r t | _n|| _tjdtdd d S NF[The loop argument is deprecated since Python 3.8, and scheduled for removal in Python 3.10.   
stacklevel)_waiters_lockedr   get_event_loop_loopwarningswarnDeprecationWarningr   r   r   r   r   __init__M   s    zLock.__init__c                    sL   t   }| jrdnd}| jr2| dt| j }d|dd  d| dS 	Nlockedunlocked
, waiters:<r    []>)super__repr__r"   r!   lenr   resextra	__class__r   r   r3   X   s
    
zLock.__repr__c                 C   s   | j S r   )r"   r   r   r   r   r+   _   s    zLock.lockedc              	      s   | j s.| jd u s$tdd | jD r.d| _ dS | jd u rBt | _| j }| j| z.z|I d H  W | j| n| j| 0 W n$ t	j
y   | j s|    Y n0 d| _ dS )Nc                 s   s   | ]}|  V  qd S r   )	cancelled).0wr   r   r   	<genexpr>j       zLock.acquire.<locals>.<genexpr>T)r"   r!   allcollectionsdequer$   create_futureappendremover	   CancelledError_wake_up_firstr   futr   r   r   r   c   s&    


 zLock.acquirec                 C   s"   | j rd| _ |   ntdd S )NFzLock is not acquired.)r"   rF   RuntimeErrorr   r   r   r   r      s    
zLock.releasec                 C   sH   | j s
d S ztt| j }W n ty0   Y d S 0 | sD|d d S NT)r!   nextiterStopIterationdone
set_resultrG   r   r   r   rF      s    zLock._wake_up_first)
r   r   r   r)   r3   r+   r   r   rF   __classcell__r   r   r8   r   r      s   6 r   c                       sJ   e Zd ZddddZ fddZdd Zd	d
 Zdd Zdd Z  Z	S )r   Nr   c                C   s>   t  | _d| _|d u r$t | _n|| _tjdt	dd d S r   )
r@   rA   r!   _valuer   r#   r$   r%   r&   r'   r(   r   r   r   r)      s    
zEvent.__init__c                    sL   t   }| jrdnd}| jr2| dt| j }d|dd  d| dS )	NsetZunsetr-   r.   r   r/   r0   r1   )r2   r3   rQ   r!   r4   r5   r8   r   r   r3      s
    
zEvent.__repr__c                 C   s   | j S r   rQ   r   r   r   r   is_set   s    zEvent.is_setc                 C   s.   | j s*d| _ | jD ]}| s|d qd S rJ   )rQ   r!   rN   rO   rG   r   r   r   rR      s
    
z	Event.setc                 C   s
   d| _ d S )NFrS   r   r   r   r   clear   s    zEvent.clearc              	      sP   | j r
dS | j }| j| z|I d H  W | j| dS | j| 0 d S rJ   )rQ   r$   rB   r!   rC   rD   rG   r   r   r   wait   s    

z
Event.wait)
r   r   r   r)   r3   rT   rR   rU   rV   rP   r   r   r8   r   r      s   	r   c                       sN   e Zd Zddd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                C   s~   |d u rt  | _n|| _tjdtdd |d u r>t|d}n|j| jurRtd|| _|j	| _	|j
| _
|j| _t | _d S )Nr   r   r   r   z"loop argument must agree with lock)r   r#   r$   r%   r&   r'   r   
ValueError_lockr+   r   r   r@   rA   r!   )r   lockr   r   r   r   r)      s    zCondition.__init__c                    sN   t   }|  rdnd}| jr4| dt| j }d|dd  d| dS r*   )r2   r3   r+   r!   r4   r5   r8   r   r   r3     s
    
zCondition.__repr__c                    s.  |   std|   z| j }| j| z^|I d H  W | j| W d}z|  I d H  W qW qP t	j
y~   d}Y qP0 qP|rt	j
dS | j| 0 W d}z|  I d H  W qW q t	j
y   d}Y q0 q|rt	j
nHd}z|  I d H  W qW q t	j
y   d}Y q0 q|r(t	j
0 d S )Nzcannot wait on un-acquired lockFT)r+   rI   r   r$   rB   r!   rC   rD   r   r	   rE   )r   rH   r:   r   r   r   rV     sJ    


zCondition.waitc                    s$   | }|s |   I d H  | }q|S r   )rV   )r   	predicateresultr   r   r   wait_for4  s
    zCondition.wait_forr   c                 C   sJ   |   stdd}| jD ]*}||kr* qF| s|d7 }|d qd S )Nz!cannot notify on un-acquired lockr   r   F)r+   rI   r!   rN   rO   )r   nidxrH   r   r   r   notifyA  s    
zCondition.notifyc                 C   s   |  t| j d S r   )r_   r4   r!   r   r   r   r   
notify_allY  s    zCondition.notify_all)N)r   )
r   r   r   r)   r3   rV   r\   r_   r`   rP   r   r   r8   r   r      s   
%
r   c                       sL   e Zd ZdddddZ fddZdd	 Zd
d Zdd Zdd Z  Z	S )r   r   Nr   c                C   sT   |dk rt d|| _t | _|d u r4t | _n|| _tj	dt
dd d| _d S )Nr   z$Semaphore initial value must be >= 0r   r   r   F)rW   rQ   r@   rA   r!   r   r#   r$   r%   r&   r'   _wakeup_scheduledr   valuer   r   r   r   r)   q  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/   r0   r1   )r2   r3   r+   rQ   r!   r4   r5   r8   r   r   r3     s
    
zSemaphore.__repr__c                 C   s2   | j r.| j  }| s |d  d| _d S q d S rJ   )r!   popleftrN   rO   ra   )r   waiterr   r   r   _wake_up_next  s    

zSemaphore._wake_up_nextc                 C   s
   | j dkS )Nr   rS   r   r   r   r   r+     s    zSemaphore.lockedc                    sn   | j s| jdkr\| j }| j| z|I d H  d| _ W q  tjyX   |    Y q 0 q |  jd8  _dS )Nr   Fr   T)	ra   rQ   r$   rB   r!   rC   r	   rE   rf   rG   r   r   r   r     s    



zSemaphore.acquirec                 C   s   |  j d7  _ |   d S )Nr   )rQ   rf   r   r   r   r   r     s    zSemaphore.release)r   )
r   r   r   r)   r3   rf   r+   r   r   rP   r   r   r8   r   r   b  s   r   c                       s0   e Zd Zddd fddZ fddZ  ZS )	r   r   Nr   c                   s.   |rt jdtdd || _t j||d d S )Nr   r   r   r   )r%   r&   r'   _bound_valuer2   r)   rb   r8   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   rW   r2   r   r   r8   r   r   r     s    zBoundedSemaphore.release)r   )r   r   r   r)   r   rP   r   r   r8   r   r     s   	r   )__all__r@   r%    r   r	   r
   r   r   r   r   r   r   r   r   r   <module>   s    DzQ