o
    US`c?                     @   s`  d dl Z d dlZddlmZmZ ddlmZ ddlmZ ddlmZm	Z	 ddl
T dd	 Zd
d Zdd Zdd Zdd Zdd Zdd Ze jjdeegdd ddd Z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d+eedZ e d,d- Z!e d.d/ Z"e d0d1 Z#dS )2    N   )wait_all_tasks_blockedassert_checkpoints)_core)	_timeouts)sleep_forevermove_on_after)*c               	      s.  t     r
J   jdksJ      sJ t    I d H  W d    n1 s2w   Y  t   g  fdd} t 4 I d H ?}|	|  |	|  t
 I d H  ddgksdJ   jdksmJ    t
 I d H  g dksJ W d   I d H  d S 1 I d H sw   Y  d S )Nr   c                      s(    d   I d H   d d S )Nsleepingwoken)appendwait erecordr   ?/usr/local/lib/python3.10/dist-packages/trio/tests/test_sync.pychild      
ztest_Event.<locals>.childr
   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   )cstatsr   r   r   r   test_CapacityLimiter+   s   



 
*

 *
r5   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    )mathr6   r$   r&   r'   r(   r)   r!   r"   r*   r+   r,   )r6   r3   r   r   r   test_CapacityLimiter_infp   s   
r8   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   r0   r   r   r   r-   r   r(   r2   )r3   r   ir   r   r   (test_CapacityLimiter_change_total_tokens   sB   



0r>   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$   r/   r   r   r   r   cancel_scopecancellenZ_pending_borrowers)Zlimiternr   r   r    test_CapacityLimiter_memleak_548   s   
(rC   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   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 sTw   Y   dd	gksbJ d S )
Nr   r   r    r   r   c                    s(     d |  I d H    d d S Nstartedfinished)r   r/   )sr   r   r   
do_acquire   r   z"test_Semaphore.<locals>.do_acquirerE   rF   )r!   r"   r#   	Semaphorer%   r&   value	max_valuer+   r   r   r,   r   r/   r   r1   r   r   r   )rG   rI   r   r   rH   r   test_Semaphore   s^   


(
 *
rM   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   )rL   r   r   )
r!   r"   r#   rJ   r%   rL   r&   r+   rK   r,   )bsr   r   r   test_Semaphore_bounded   s$   
rO   lockclsc                 C   s   | j S N)__name__)fnr   r   r   <lambda>   s    rT   )idsc              
      sR  |    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   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 s4w   Y   }t| |j sGJ |j u sOJ |jdksWJ || t I d H   }t| |jdksrJ |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 )Nc                	      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 rQ   )r   r.   r   r   Zholder_tasklr   r   holder  s
   .z,test_Lock_and_StrictFIFOLock.<locals>.holderr   r    )lockedweakrefrefr&   rR   r   r,   r+   r/   r!   r"   r*   r   r   r   r   r1   r   printownerr   r?   r@   )rP   rrX   r   r   r   rV   r   test_Lock_and_StrictFIFOLock   s|   

(





*r_   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  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 s/w   Y    s;J t I d H  dhksIJ  4 I d H     W d   I d H  n1 I d H sew   Y  t I d H  h dksyJ 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 s6w   Y  t K} 4 I d H ( |  z  I d H  W   s[J n  scJ w W d   I d H  n1 I d H suw   Y  W d    d S W d    d S 1 sw   Y  d S )Nr    c              	      sV    4 I d H     I d H  W d   I d H  n1 I d H sw   Y  |  d S rQ   )r   add)r=   r3   Zfinished_waitersr   r   waiterb  s
   (ztest_Condition.<locals>.waiterr:   r   >   r   r    r   r   )r!   r"   r#   	ConditionrJ   StrictFIFOLockLockrY   r   r/   r,   r*   r+   r   notify
notify_allr   r   r   r<   r   r   r   r\   r   Zlock_statisticsZCancelScoper@   )rW   rb   r   r=   r   scoper   ra   r   test_Condition@  s   




*
**
*
,*
",$ri   )AsyncContextManagerMixin)open_memory_channelc                   @   ,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ChannelLock1c                 C   s2   t |\| _| _t|d D ]}| jd  qd S Nr    )rk   rG   r^   r<   send_nowait)selfcapacity_r   r   r   __init__  s   zChannelLock1.__init__c                 C      | j d  d S rQ   rG   ro   rp   r   r   r   r,        zChannelLock1.acquire_nowaitc                    s   | j d I d H  d S rQ   )rG   sendrv   r   r   r   r/     s   zChannelLock1.acquirec                 C      | j   d S rQ   r^   receive_nowaitrv   r   r   r   r+        zChannelLock1.releaseNrR   
__module____qualname__rs   r,   r/   r+   r   r   r   r   rm     s
    rm   c                   @   rl   )
ChannelLock2c                 C   s    t d\| _| _| jd  d S N
   )rk   rG   r^   ro   rv   r   r   r   rs     s   zChannelLock2.__init__c                 C   ry   rQ   rz   rv   r   r   r   r,     r|   zChannelLock2.acquire_nowaitc                    s   | j  I d H  d S rQ   )r^   Zreceiverv   r   r   r   r/     s   zChannelLock2.acquirec                 C   rt   rQ   ru   rv   r   r   r   r+     rw   zChannelLock2.releaseNr}   r   r   r   r   r     s
    r   c                   @   rl   )
ChannelLock3c                 C   s   t d\| _| _d| _d S )Nr   F)rk   rG   r^   acquiredrv   r   r   r   rs     s   
zChannelLock3.__init__c                 C   s   | j rJ d| _ d S NT)r   rv   r   r   r   r,     s   

zChannelLock3.acquire_nowaitc                    s6   | j r| jd I d H  d S d| _ t I d H  d S r   )r   rG   rx   r   
checkpointrv   r   r   r   r/     s
   zChannelLock3.acquirec                 C   s8   z| j   W d S  tjy   | jsJ d| _Y d S w )NF)r^   r{   r   r1   r   rv   r   r   r   r+     s   
zChannelLock3.releaseNr}   r   r   r   r   r     s
    r   c                   C      t dS rn   )r$   r   r   r   r   rT         c                   C   r   rn   )rJ   r   r   r   r   rT     r   c                   C   r   r   rm   r   r   r   r   rT     r   c                   C   r   rn   r   r   r   r   r   rT     r   )zCapacityLimiter(1)zSemaphore(1)re   rd   zChannelLock1(10)zChannelLock1(1)r   r   lock_factoryc              	      s   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  rCJ  | ksKJ d S )Nr   r9   Fr   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)r<   r   r   )	lock_likerr   LOOPSZacquiresZin_critical_sectionr   r   worker  s   (z+test_generic_lock_exclusion.<locals>.worker)r   r   r<   r   )r   ZWORKERSr   r   r   rr   r   r   r   test_generic_lock_exclusion  s   (r   c              	      s   g g d  fdd}|  }t  4 I d H  }||d| ||d| ||d| W d   I d H  n1 I d H s@w   Y  t D ]}d| d|d   ks[J qId S )Nr9   c              
      s`    |  t D ]#}|4 I d H   |  W d   I d H  n1 I d H s(w   Y  q
d S rQ   )r   r<   )namer   rr   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=   r   r   r   test_generic_lock_fifo_fairness  s   ("r   c              	      s   |   g  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 sAw   Y  d S )Nc                	      sR    d  4 I d H  W d   I d H  n1 I d H sw   Y   d d S rD   )r   r   r   r   r   r   
lock_taker,  s   
(zCtest_generic_lock_acquire_nowait_blocks_acquire.<locals>.lock_takerrE   )r   r   r,   r   r   r+   )r   r   r   r   r   r   /test_generic_lock_acquire_nowait_blocks_acquire&  s   

.r   )$r!   rZ   testingr   r    r   r   r   r   Z_syncr   r5   r8   r>   rC   rM   rO   markZparametrizere   rd   r_   ri   rj   Z_channelrk   rm   r   r   Zlock_factoriesZlock_factory_namesZgeneric_lock_testr   r   r   r   r   r   r   <module>   sR    E%0
KT


