o
    ACeDB                     @  s  U d dl mZ d dlZd dlmZmZmZ d dlZddlm	Z	 ddl
T ddlmZ ddlmZmZ er9d d	lmZ d:ddZd:ddZd:ddZd:ddZd:ddZd:ddZd:ddZejjdeegdd dd;dd Zd:d!d"Zdd#lm Z  dd$l
m!Z! G d%d& d&e!Z"G d'd( d(e!Z#G d)d* d*e!Z$d+d d,d eed-d d.d e#e$gZ%g d/Z&ejjd0e%e&dZ'ee(e)eee"e#e$f Z*d1e+d2< eg e*f Z,d1e+d3< e'd<d4d5Z-e'd<d6d7Z.e'd<d8d9Z/dS )=    )annotationsN)TYPE_CHECKINGCallableUnion   )_core)*)sleep_forever)assert_checkpointswait_all_tasks_blocked)	TypeAliasreturnNonec               	     s0  t     r
J   jdksJ      sJ t    I d H  W d    n1 s2w   Y  t   g d	 fdd} t 4 I d H ?}|	|  |	|  t
 I d H  ddgkseJ   jdksnJ    t
 I d H  g dksJ W d   I d H  d S 1 I d H sw   Y  d S )
Nr   r   r   c                     s(    d   I d H   d d S )Nsleepingwoken)appendwait erecordr   9usr/lib/python3.10/site-packages/trio/_tests/test_sync.pychild      
ztest_Event.<locals>.childr   r   )r   r   r   r   r   r   )Eventis_set
statisticstasks_waitingsetr
   r   r   open_nursery
start_soonr   )r   nurseryr   r   r   
test_Event   s,   

.r#   c               
     s"  t t td W d    n1 sw   Y  t t td W d    n1 s.w   Y  td} t|  | jdksBJ | jdksIJ | jdksPJ t t	 | 
  W d    n1 sdw   Y  | jdkspJ |   | jdks{J | jdksJ |  }|jdksJ |jdksJ |jt gksJ |jdksJ t t	 |   W d    n1 sw   Y  | jdksJ t t	 |  I d H  W d    n1 sw   Y  | jdksJ t  | dI d H  W d    n1 sw   Y  | jdksJ t tj | d W d    n	1 s"w   Y  t|  jt dhks7J | t  |  jdgksIJ | d | jdksVJ t - | 4 I d H  | jdksiJ W d   I d H  n1 I d H szw   Y  W d    n	1 sw   Y  t 4 I d H b}| dI d H  | d	I d H  || jd
 t I d H  | jdksJ |  jdksJ | d	 | jdksJ t tj |   W d    n	1 sw   Y  W d   I d H  n1 I d H s w   Y  | d
 | d d S )N      ?r   r      Zsomeonezthird partyzvalue 1zvalue 2zvalue 3)pytestraises	TypeErrorCapacityLimiter
ValueErrorreprtotal_tokensborrowed_tokensavailable_tokensRuntimeErrorreleaseacquire_nowaitr   	borrowersr   current_taskr   acquirer
   acquire_on_behalf_of
WouldBlockZacquire_on_behalf_of_nowaitr   release_on_behalf_ofr    r!   r   )cZstatsr"   r   r   r   test_CapacityLimiter/   s   



 
*

 *
r:   c                    s   ddl m}  t| }t| |j| ksJ |jdksJ |j| ks$J tt	 |
  W d    n1 s8w   Y  |jdksDJ |  |jdksOJ |j| ksVJ d S )Nr   )infr&   )mathr;   r*   r,   r-   r.   r/   r'   r(   r0   r1   r2   )r;   r9   r   r   r   test_CapacityLimiter_inft   s   
r=   c               	     s   t d} tt d| _W d    n1 sw   Y  tt d| _W d    n1 s0w   Y  tt d| _W d    n1 sHw   Y  | jdksTJ t 4 I d H }tdD ]}|	| j
| t I d H  qat|  jddhks~J |  jdksJ |  jd7  _t|  jh dksJ |  jdksJ |  jd8  _| jd	ksJ | jdksJ | d | d | d t|  jdhksJ |  jdksJ | d t|  jd	hksJ |  jdksJ W d   I d H  d S 1 I d H s	w   Y  d S )
Nr   r$   r   i   r&      >   r   r&   r   r?      )r*   r'   r(   r)   r-   r+   r   r    ranger!   r6   r   r   r   r3   r   r.   r8   )r9   r"   ir   r   r   (test_CapacityLimiter_change_total_tokens   sB   



0rC   c               	     s   t dd} |  I d H  t 4 I d H }|| j t I d H  |j  W d   I d H  n1 I d H s7w   Y  t| j	dksEJ d S )Nr&   )r-   r   )
r*   r5   r   r    r!   r   cancel_scopecancellenZ_pending_borrowers)Zlimiternr   r   r    test_CapacityLimiter_memleak_548   s   
(rH   c               
     s  t t td W d    n1 sw   Y  t t td W d    n1 s.w   Y  td} t|  | jdksBJ | jd u sIJ |   | jdksTJ | 	 j
dks]J |   | jdkshJ t  |  I d H  W d    n1 s}w   Y  | jdksJ t tj |   W d    n1 sw   Y  |   | jdksJ t + | 4 I d H  | jdksJ W d   I d H  n1 I d H sw   Y  W d    n1 sw   Y  | jdksJ |   g  d fd
d}t 4 I d H N}|||  t I d H   dgksJ | jdksJ |   | jdks)J t tj |   W d    n	1 s?w   Y  W d   I d H  n1 I d H sUw   Y   ddgkscJ d S )Nr$   r%   r&   r   r   s	Semaphorer   r   c                   s(     d |  I d H    d d S Nstartedfinished)r   r5   )rI   r   r   r   
do_acquire   r   z"test_Semaphore.<locals>.do_acquirerL   rM   )rI   rJ   r   r   )r'   r(   r)   rJ   r+   r,   value	max_valuer1   r   r   r2   r
   r5   r   r7   r    r!   r   )rI   rO   r"   r   rN   r   test_Semaphore   s^   


(
 *
rR   c                    s   t t tddd W d    n1 sw   Y  t t tddd W d    n1 s2w   Y  tddd} | jdksDJ t|  t t |   W d    n1 s\w   Y  | jdkshJ | 	  | jdkssJ |   | jdks~J d S )Nr&   r$   )rQ   r   r   )
r'   r(   r)   rJ   r+   rQ   r,   r1   rP   r2   )bsr   r   r   test_Semaphore_bounded   s$   
rT   lockclsc                 C  s   | j S N)__name__)fnr   r   r   <lambda>   s    rY   )Zidstype[Lock | StrictFIFOLock]c              
     sT  |    r
J t}| u sJ t | jtv s#J t . 4 I d H    s4J t W d   I d H  n1 I d H sHw   Y  W d    n1 sWw   Y    rbJ     slJ     rvJ t   I d H  W d    n1 sw   Y    sJ     rJ   t	
t   W d    n1 sw   Y    t	
t   W d    n1 sw   Y  d  d fdd}t 4 I d H }  rJ || t I d H    sJ t	
tj   W d    n	1 sw   Y  t	
t   W d    n	1 s5w   Y   }t| |j sHJ |j u sPJ |jdksXJ || t I d H   }t| |jdkssJ |j  W d   I d H  n1 I d H sw   Y   }|j rJ |jd u sJ |jdksJ d S )Nr   r   c                	     sT   t   4 I d H  t I d H  W d   I d H  d S 1 I d H s#w   Y  d S rV   )r   r4   r	   r   Zholder_tasklr   r   holder   s
   .z,test_Lock_and_StrictFIFOLock.<locals>.holderr   r&   r   )lockedweakrefrefr,   rW   r
   r2   r1   r5   r'   r(   r0   r   r    r!   r   r7   r   printownerr   rD   rE   )rU   rr]   r"   r   r   r[   r   test_Lock_and_StrictFIFOLock   s|   

(





*rd   c               
     s,  t t ttd W d    n1 sw   Y  t t tt W d    n1 s0w   Y  t } t|  |  rBJ   rHJ t   	 I d H  W d    n1 s]w   Y  |  shJ   snJ t    rwJ  
    sJ t t  
  W d    n1 sw   Y     t t   I d H  W d    n1 sw   Y  t t    W d    n1 sw   Y  t t    W d    n1 sw   Y  t d fdd}t 4 I d H }tdD ]}||| t I d H  q 4 I d H     W d   I d H  n1 I d H s0w   Y    s<J t I d H  d	hksJJ  4 I d H     W d   I d H  n1 I d H sfw   Y  t I d H  h d
kszJ W d   I d H  n1 I d H sw   Y  t t 4 I d H }tdD ]}||| t I d H  q 4 I d H )  d   }t| |jdksJ |jjdksJ W d   I d H  n1 I d H sw   Y    jjdksJ t I d H  d	dhksJ  4 I d H     W d   I d H  n1 I d H s!w   Y  W d   I d H  n1 I d H s7w   Y  t K} 4 I d H ( |  z  I d H  W   s\J n  sdJ w W d   I d H  n1 I d H svw   Y  W d    d S W d    d S 1 sw   Y  d S )Nr&   rB   intr   r   c              	     sV    4 I d H     I d H  W d   I d H  n1 I d H sw   Y  |  d S rV   )r   add)rB   r9   Zfinished_waitersr   r   waiterh  s
   (ztest_Condition.<locals>.waiterr?   r   >   r   r&   r   r   )rB   re   r   r   )r'   r(   r)   	ConditionrJ   StrictFIFOLockLockr^   r
   r5   r2   r0   r1   r   notify
notify_allr   r   r    rA   r!   r   r   ra   r   Zlock_statisticsZCancelScoperE   )r\   rh   r"   rB   r   scoper   rg   r   test_ConditionF  s   




*
**
*
,*
",$ro   )open_memory_channel)AsyncContextManagerMixinc                   @  s4   e Zd ZdddZdddZdd	d
ZdddZdS )ChannelLock1capacityre   r   r   c                 C  s6   t d  |\| _| _t|d D ]}| jd  qd S Nr&   )rp   rI   rc   rA   send_nowait)selfrs   _r   r   r   __init__  s   zChannelLock1.__init__c                 C     | j d  d S rV   rI   ru   rv   r   r   r   r2        zChannelLock1.acquire_nowaitc                   s   | j d I d H  d S rV   )rI   sendr{   r   r   r   r5     s   zChannelLock1.acquirec                 C     | j   d S rV   rc   receive_nowaitr{   r   r   r   r1        zChannelLock1.releaseN)rs   re   r   r   r   rW   
__module____qualname__rx   r2   r5   r1   r   r   r   r   rr     s
    


rr   c                   @  4   e Zd ZdddZdddZdddZdd	d
ZdS )ChannelLock2r   r   c                 C  s$   t d  d\| _| _| jd  d S N
   )rp   rI   rc   ru   r{   r   r   r   rx     s   zChannelLock2.__init__c                 C  r~   rV   r   r{   r   r   r   r2     r   zChannelLock2.acquire_nowaitc                   s   | j  I d H  d S rV   )rc   Zreceiver{   r   r   r   r5     s   zChannelLock2.acquirec                 C  ry   rV   rz   r{   r   r   r   r1     r|   zChannelLock2.releaseNr   r   r   r   r   r   r     s
    


r   c                   @  r   )ChannelLock3r   r   c                 C  s   t d  d\| _| _d| _d S )Nr   F)rp   rI   rc   acquiredr{   r   r   r   rx     s   
zChannelLock3.__init__c                 C  s   | j rJ d| _ d S NT)r   r{   r   r   r   r2     s   

zChannelLock3.acquire_nowaitc                   s6   | j r| jd I d H  d S d| _ t I d H  d S r   )r   rI   r}   r   
checkpointr{   r   r   r   r5     s
   zChannelLock3.acquirec                 C  s8   z| j   W d S  tjy   | jsJ d| _Y d S w )NF)rc   r   r   r7   r   r{   r   r   r   r1     s   
zChannelLock3.releaseNr   r   r   r   r   r   r     s
    


r   c                   C     t dS rt   )r*   r   r   r   r   rY         c                   C  r   rt   )rJ   r   r   r   r   rY     r   c                   C  r   r   rr   r   r   r   r   rY     r   c                   C  r   rt   r   r   r   r   r   rY     r   )zCapacityLimiter(1)zSemaphore(1)rk   rj   zChannelLock1(10)zChannelLock1(1)r   r   lock_factoryr   LockLikeLockFactoryc              	     s   d d}ddd fd	d
}t  4 I d H }|  }t|D ]}||| q"W d   I d H  n1 I d H s;w   Y  rDJ  | ksLJ d S )Nr   r>   Fr   	lock_liker   r   r   c              
     s   t  D ]<}| 4 I d H ) d7 rJ dt I d H  t I d H  s*J dW d   I d H  n1 I d H s<w   Y  qd S )Nr&   TF)rA   r   r   )r   rw   LOOPSZacquiresZin_critical_sectionr   r   worker	  s   (z+test_generic_lock_exclusion.<locals>.worker)r   r   r   r   )r   r    rA   r!   )r   ZWORKERSr   r"   r   rw   r   r   r   test_generic_lock_exclusion  s   (r   c              	     s   g g d d fdd	}|  }t  4 I d H  }||d
| ||d| ||d| W d   I d H  n1 I d H sAw   Y  t D ]}d| d|d
   ks\J qJd S )Nr>   namestrr   r   r   r   c              
     s`    |  t D ]#}|4 I d H   |  W d   I d H  n1 I d H s(w   Y  q
d S rV   )r   rA   )r   r   rw   r   Zinitial_orderr   r   r   loopy%  s   
(z.test_generic_lock_fifo_fairness.<locals>.loopyr&   r   r?   )r   r   r   r   r   r   )r   r    r!   rA   )r   r   r   r"   rB   r   r   r   test_generic_lock_fifo_fairness  s   ("r   c              	     s   |   g d fdd}t  4 I d H &}   || t I d H  dgks-J    W d   I d H  d S 1 I d H sBw   Y  d S )Nr   r   c                	     sR    d  4 I d H  W d   I d H  n1 I d H sw   Y   d d S rK   )r   r   r   r   r   r   
lock_taker?  s   
(zCtest_generic_lock_acquire_nowait_blocks_acquire.<locals>.lock_takerrL   r   )r   r    r2   r!   r   r1   )r   r   r"   r   r   r   /test_generic_lock_acquire_nowait_blocks_acquire7  s   

.r   r   )rU   rZ   r   r   )r   r   r   r   )0
__future__r   r_   typingr   r   r   r'    r   Z_syncZ	_timeoutsr	   testingr
   r   typing_extensionsr   r#   r:   r=   rC   rH   rR   rT   ZmarkZparametrizerk   rj   rd   ro   Z_channelrp   rq   rr   r   r   Zlock_factoriesZlock_factory_namesZgeneric_lock_testr*   rJ   r   __annotations__r   r   r   r   r   r   r   r   <module>   sn    


E

%

0
MT
	