a
    (ñ»jž  ã                   @  sî  U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ d dlmZmZmZmZ d dlZd dlZddlmZmZmZmZmZmZmZmZ ddlmZ ddlmZ dd	l m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' dd
l(m)Z) e�rd dl*m+Z+m,Z,m-Z- d dl.m/Z/ ddl0m1Z1 e2e3e4eej5e6e7 f f  Z8edƒZ9ddœdd„Z:ddœdd„Z;ddœdd„Z<ddœdd„Z=ddœdd„Z>dydddœdd„Z?ddœd d!„Z@ddœd"d#„ZAddœd$d%„ZBddœd&d'„ZCd(d)dd*œd+d,„ZDejE Fd-g d.¢¡ejE Fd/d0d1g¡ejE Fd2d0d1g¡d3d4d4dd5œd6d7„ƒƒƒZGddœd8d9„ZHddœd:d;„ZId)dd<œd=d>„ZJddœd?d@„ZKddœdAdB„ZLe MdC¡ZNdDeOdC< ddœdEdF„ZPddœdGdH„ZQddœdIdJ„ZRddœdKdL„ZSddœdMdN„ZTddœdOdP„ZUddœdQdR„ZVddœdSdT„ZWddœdUdV„ZXddœdWdX„ZYddœdYdZ„ZZddœd[d\„Z[ddœd]d^„Z\ddœd_d`„Z]ddœdadb„Z^ddœdcdd„Z_d4dedfdgddhœdidj„Z`ejE Fdkd0d1g¡d4ddlœdmdn„ƒZaddœdodp„Zbddœdqdr„Zceddœdsdt„ƒZdddœdudv„Zeddœdwdx„ZfdS )zé    )ÚannotationsN©Úpartial)ÚTYPE_CHECKINGÚNoReturnÚTypeVarÚUnioné   )ÚCancelScopeÚCapacityLimiterÚEventÚ_coreÚ
fail_afterÚmove_on_afterÚsleepÚsleep_forever)Úki_self)Úslow)Úactive_thread_countÚcurrent_default_thread_limiterÚfrom_thread_check_cancelledÚfrom_thread_runÚfrom_thread_run_syncÚto_thread_run_syncÚwait_all_threads_completed)Úwait_all_tasks_blocked)ÚAsyncGeneratorÚ	AwaitableÚCallable)ÚOutcome)ÚTaskÚTÚNone©Úreturnc                  ƒ  sÐ   t  ¡ ‰ dddddddœ‡ fdd„} t ¡ }d	d
dœdd„}| t|d|d�I d H  d	ddœdd„}| t|dtf|d�I d H  d	d
dœdd„}| t|d|d�I d H  d	ddœdd„}| t|dtf|d�I d H  d S )NzCallable[..., threading.Thread]zCallable[..., T | Awaitable[T]]ztuple[str, T]ú_core.TrioToken | Noner"   )Údo_in_trio_threadÚfnÚexpectedÚ
trio_tokenr$   c                 “  sp   g ‰ddœ‡ ‡‡‡fdd„}t j|dd�}| ¡  | ¡ rRtdƒ tdƒI d H  q2ˆd	|fd
ˆf|gkslJ ‚d S )Nr"   r#   c               
     sv   z2ˆ  dt ¡ f¡ ˆ ˆˆˆd�} ˆ  d| f¡ W n> typ } z&t|ƒ ˆ  dt|ƒf¡ W Y d }~n
d }~0 0 d S )NÚstart©r)   ÚgotÚerror)ÚappendÚ	threadingÚcurrent_threadÚBaseExceptionÚprintÚtype)ÚxÚexc©r&   r'   Úrecordr)   © ú>E:\soccer\ml_env\Lib\site-packages\trio/_tests/test_threads.pyÚthreadfnB   s    z<test_do_in_trio_thread.<locals>.check_case.<locals>.threadfnT)ÚtargetÚdaemonZyawnç{®Gáz„?r*   Úf)r/   ÚThreadr*   Úis_aliver2   r   )r&   r'   r(   r)   r:   Úchild_thread©Útrio_threadr6   r9   Ú
check_case:   s    	z*test_do_in_trio_thread.<locals>.check_caseÚ
RecordTypeÚint)r7   r$   c                 S  s"   t  ¡ rJ ‚|  dt ¡ f¡ dS )Nr>   r	   )r   Úcurrently_ki_protectedr.   r/   r0   ©r7   r8   r8   r9   Úf1T   s    z"test_do_in_trio_thread.<locals>.f1)r,   r	   r+   r   c                 S  s&   t  ¡ rJ ‚|  dt ¡ f¡ t‚d S ©Nr>   )r   rG   r.   r/   r0   Ú
ValueErrorrH   r8   r8   r9   Úf2[   s    z"test_do_in_trio_thread.<locals>.f2r-   c                 Ó  s0   t  ¡ rJ ‚t  ¡ I d H  |  dt ¡ f¡ dS )Nr>   é   )r   rG   Ú
checkpointr.   r/   r0   rH   r8   r8   r9   Úf3b   s    z"test_do_in_trio_thread.<locals>.f3)r,   rM   c                 Ó  s4   t  ¡ rJ ‚t  ¡ I d H  |  dt ¡ f¡ t‚d S rJ   )r   rG   rN   r.   r/   r0   ÚKeyErrorrH   r8   r8   r9   Úf4j   s    z"test_do_in_trio_thread.<locals>.f4)N)r/   r0   r   Úcurrent_trio_tokenr   rK   r   rP   )rD   ÚtokenrI   rL   rO   rQ   r8   rB   r9   Útest_do_in_trio_thread7   s     ürT   c                  Ã  sz   t  t¡� tdd„ ƒ W d   ƒ n1 s,0    Y  ddœdd„} t  t¡� t| ƒ W d   ƒ n1 sl0    Y  d S )Nc                   S  s   d S ©Nr8   r8   r8   r8   r9   Ú<lambda>u   ó    z9test_do_in_trio_thread_from_trio_thread.<locals>.<lambda>r"   r#   c                   Ó  s   d S rU   r8   r8   r8   r8   r9   Úfoow   s    z4test_do_in_trio_thread_from_trio_thread.<locals>.foo)ÚpytestÚraisesÚRuntimeErrorr   r   )rX   r8   r8   r9   Ú'test_do_in_trio_thread_from_trio_threads   s
    *r\   c                    s6   t ƒ ‰ ddœ‡ fdd„} t | ¡ ˆ ddhks2J ‚d S )Nr"   r#   c                  “  s�   t  ¡ ‰ ddœdd„‰ddœ‡fdd„‰ddœ‡‡ ‡‡fdd„} tj| d	�}| ¡  td
ƒ | ¡ rttdƒI d H  q\tdƒ | ¡  tdƒ d S )Nr"   r#   c               
   S  sZ   t dƒ t ¡ rJ ‚t dƒ z tƒ  W dd l} t d|  ¡ ƒ ndd l} t d|  ¡ ƒ 0 d S )Nzin Trio threadr   r   Úfinally)r2   r   rG   r   ÚsysÚexc_info)r^   r8   r8   r9   Útrio_thread_fn†   s    þzTtest_run_in_trio_thread_ki.<locals>.check_run_in_trio_thread.<locals>.trio_thread_fnc                   “  s
   ˆ ƒ  d S rU   r8   r8   )r`   r8   r9   Útrio_thread_afn‘   s    zUtest_run_in_trio_thread_ki.<locals>.check_run_in_trio_thread.<locals>.trio_thread_afnc                     sx   zt dƒ tˆˆd� W n$ ty<   t dƒ ˆ  d¡ Y n0 ztˆˆd� W n$ tyr   t dƒ ˆ  d¡ Y n0 d S )NÚrunningr+   Úok1Úok2)r2   r   ÚKeyboardInterruptÚaddr   r8   )r7   rS   ra   r`   r8   r9   Úexternal_thread_fn”   s    zXtest_run_in_trio_thread_ki.<locals>.check_run_in_trio_thread.<locals>.external_thread_fn)r;   Zwaitingr=   zwaited, joiningÚdone)	r   rR   r/   r?   r*   r2   r@   r   Újoin)rg   ÚthreadrH   )rS   ra   r`   r9   Úcheck_run_in_trio_threadƒ   s    z<test_run_in_trio_thread_ki.<locals>.check_run_in_trio_threadrc   rd   )Úsetr   Úrun)rk   r8   rH   r9   Útest_run_in_trio_thread_ki~   s    '
rn   c                    sp   g ‰t ƒ ‰ ddœ‡ ‡fdd„‰dddœ‡‡fdd„‰d	dœ‡ ‡‡fd
d„} t | ¡}| ¡  ˆddgkslJ ‚d S )Nr"   r#   c                   “  s*   ˆ  d¡ ˆ  ¡  t dd„ ¡I d H  d S )NÚsleepingc                 S  s   t jjS rU   )r   ZAbortZ	SUCCEEDED©Ú_r8   r8   r9   rV   µ   rW   zMtest_await_in_trio_thread_while_main_exits.<locals>.trio_fn.<locals>.<lambda>)r.   rl   r   Zwait_task_rescheduledr8   )Úevr7   r8   r9   Útrio_fn²   s    
z;test_await_in_trio_thread_while_main_exits.<locals>.trio_fnú_core.TrioToken©rS   r$   c                   s4   zt ˆ| d� W n tjy.   ˆ  d¡ Y n0 d S )Nr+   Ú	cancelled)r   r   Ú	Cancelledr.   ©rS   )r7   rs   r8   r9   Ú	thread_fn·   s    z=test_await_in_trio_thread_while_main_exits.<locals>.thread_fnúthreading.Threadc                  “  s@   t  ¡ } tjˆ| fd�}| ¡  ˆ  ¡ I d H  ˆdgks<J ‚|S )N)r;   Úargsro   )r   rR   r/   r?   r*   Úwait)rS   rj   )rr   r7   ry   r8   r9   Úmain½   s    z8test_await_in_trio_thread_while_main_exits.<locals>.mainro   rv   )r   r   rm   ri   )r}   rj   r8   )rr   r7   ry   rs   r9   Ú*test_await_in_trio_thread_while_main_exits®   s    
r~   c                  ƒ  s¶   d} d|  fdddœdd„‰dddœ‡fd	d
„‰ t ˆƒI d H  t ˆd d�I d H  t ˆ d|  ƒƒI d H  dddœ‡ fdd„}|dƒI d H  |dƒI d H  |dƒI d H  |dƒI d H  d S )Nz0 from trio._tests.test_threads.test_named_threadÚinnerÚstrrz   ©Únamer$   c                 S  s   t  ¡ j| ksJ ‚t  ¡ S rU   )r/   r0   r‚   ©r‚   r8   r8   r9   r   Í   s    z test_named_thread.<locals>.innerúCallable[[], threading.Thread]c                   s
   t ˆ | ƒS rU   r   rƒ   ©r   r8   r9   r>   Ñ   s    ztest_named_thread.<locals>.f©Zthread_namer"   c                 “  s,   t ˆ | ƒ| d�I d H }t d|j¡s(J ‚d S )Nr†   úTrio thread [0-9]*)r   ÚreÚmatchr‚   )r‚   rj   ©r>   r8   r9   Útest_thread_nameÜ   s    z+test_named_thread.<locals>.test_thread_nameÚ ÚfobiedooÚname_longer_than_15_charactersõ   ðŸ’™©r   )Úendingr‹   r8   ©r>   r   r9   Útest_named_threadÊ   s    r“   z
int | Noneú
str | None)Úidentr$   c              
   C  s  dd l }dd l}|j d¡}|s$d}z| |¡}W n$ tyV   tdtj› �ƒ Y d S 0 t	|dd ƒ}|slJ ‚|j
|j|jg|_|j|_|jddd�}| d u r¤t ¡ } || |dƒdks¸J ‚z|j ¡ W S  t�y } z$t d	|j›d
|› �¡ W Y d }~n
d }~0 0 d S )Nr   Zpthreadzlibc.sozno pthread on Úpthread_getname_nprW   é   )Úsizezvalue: z, exception: )ÚctypesZctypes.utilÚutilZfind_libraryÚCDLLÚ	Exceptionr2   r^   ÚplatformÚgetattrÚc_void_pÚc_char_pÚc_size_tÚargtypesÚc_intÚrestypeÚcreate_string_bufferr/   Ú	get_identÚvalueÚdecodeÚUnicodeDecodeErrorrY   Zfail)r•   r™   Zlibpthread_pathZ
libpthreadr–   Zname_bufferÚer8   r8   r9   Ú_get_thread_nameç   s2    ýr«   c                  ƒ  s¨   dddœdd„‰dddœ‡fdd„‰ d	} t ˆ | ƒƒI d H  t ˆ | ƒd d
�I d H  dddddœ‡ fdd„}|dƒI d H  |dƒI d H  |dƒI d H  |ddd�I d H  d S )Nr€   rz   r�   c                 S  sH   t ƒ }|d u r,tjdkr,t dtj› �¡ n|| d d… ks@J ‚t ¡ S )NÚlinuxzno pthread OS support on é   )r«   r^   r�   rY   Úskipr/   r0   )r‚   Úos_thread_namer8   r8   r9   r     s
    z#test_named_thread_os.<locals>.innerr„   c                   s
   t ˆ | ƒS rU   r   rƒ   r…   r8   r9   r>     s    ztest_named_thread_os.<locals>.fz4None from trio._tests.test_threads.test_named_threadr†   r”   r"   )r‚   r(   r$   c                 “  sP   |d u r| }t ˆ |ƒ| d�I d H }t|jƒ}|d us<J dƒ‚t d|¡sLJ ‚d S )Nr†   z'should skip earlier if this is the caser‡   )r   r«   r•   rˆ   r‰   )r‚   r(   rj   r¯   rŠ   r8   r9   r‹   (  s    
z.test_named_thread_os.<locals>.test_thread_namerŒ   r�   rŽ   r�   ú?)r(   )Nr�   )Údefaultr‹   r8   r’   r9   Útest_named_thread_os  s    		r²   c                  C  s>   ddl m}  | ƒ }|d u r:tjdks(J ‚t dtj› �¡ d S )Nr   )Úget_os_thread_name_funcr¬   zno pthread_setname_np on )Ztrio._core._thread_cacher³   r^   r�   rY   r®   )r³   Úkr8   r8   r9   Útest_has_pthread_setname_np8  s
    rµ   c                  Ã  s²   t  ¡ } dddœdd„}t|dƒI d H \}}|dks8J ‚|| ksDJ ‚ddœd	d
„}tjtdd��}t|ƒI d H  W d   ƒ n1 s„0    Y  t|jjƒ |jjd | ks®J ‚d S )Nr!   ztuple[T, threading.Thread])r4   r$   c                 S  s   | t  ¡ fS rU   )r/   r0   )r4   r8   r8   r9   r>   D  s    z$test_run_in_worker_thread.<locals>.fé   r   r#   c                   S  s   t t ¡ ƒ‚d S rU   )rK   r/   r0   r8   r8   r8   r9   ÚgK  s    z$test_run_in_worker_thread.<locals>.gz1^<Thread\(Trio thread \d+, started daemon \d+\)>$©r‰   r   )	r/   r0   r   rY   rZ   rK   r2   r§   r{   )rC   r>   r4   rA   r·   Úexcinfor8   r8   r9   Útest_run_in_worker_threadA  s    þ,rº   c               	   ƒ  s  d g‰dddœ‡fdd„‰ ddddœ‡ ‡fdd	„} g ‰t  ¡ }t ¡ 4 I d H šH}| | |d
¡ tƒ I d H  ˆdgksxJ ‚|j ¡  W d   ƒI d H  q¬1 I d H s¢0    Y  ˆd dks¼J ‚| d ¡ ˆd dkrÞt	 
d¡ qÆg ‰d ˆd< t ¡ 4 I d H š¢}| | |d¡ tƒ I d H  |j ¡  tjd
d��. tdƒD ]}t ¡ I d H  �q6W d   ƒ n1 �sb0    Y  ˆdgk�s|J ‚| d ¡ W d   ƒI d H  �q´1 I d H �sª0    Y  t ¡ �(}| ¡  | |dƒI d H  W d   ƒ n1 �sì0    Y  |j�sJ ‚d S )Nzstdlib_queue.Queue[None]r"   )Úqr$   c                   s   dˆ d< |   ¡  dˆ d< d S )NÚblockingr   Úfinished)Úget©r»   )Úregisterr8   r9   r>   Z  s    z1test_run_in_worker_thread_cancellation.<locals>.fÚbool)r»   Úabandon_on_cancelr$   c              	   “  s<   ˆ  d¡ z tˆ | |d�I d H W ˆ  d¡ S ˆ  d¡ 0 d S ©Nr*   ©rÂ   Úexit)r.   r   )r»   rÂ   )r>   r7   r8   r9   Úchild`  s    

þz5test_run_in_worker_thread_cancellation.<locals>.childTr*   r   r½   r=   F©Úshieldé
   )Ústdlib_queueÚQueuer   Úopen_nurseryÚ
start_soonr   Úcancel_scopeÚcancelÚputÚtimer   r
   ÚrangerN   Úcancelled_caught)rÆ   r»   Únurseryrq   Úscoper8   )r>   r7   rÀ   r9   Ú&test_run_in_worker_thread_cancellationW  s:    4

28
0rÖ   zpytest.CaptureFixture[str]zpytest.MonkeyPatch)ÚcapfdÚmonkeypatchr$   c                   sž   |  tjdd¡ t ¡ ‰ t ¡ ‰ddœ‡ ‡fdd„‰ddœ‡fdd„}t |¡ ˆ  d ¡ ˆ ¡ }| ¡ rvt	 
d¡ qb|  ¡ \}}d	|vsŽJ ‚d	|vsšJ ‚d S )
NZIDLE_TIMEOUTr=   r"   r#   c                     s   ˆ   ¡  ˆ t ¡ ¡ d S rU   )r¾   rÐ   r/   r0   r8   )Úq1Úq2r8   r9   ry   œ  s    z6test_run_in_worker_thread_abandoned.<locals>.thread_fnc               	   “  sr   ddœ‡ fdd„} t  ¡ 4 I d H š6}| | ¡ tƒ I d H  |j ¡  W d   ƒI d H  qn1 I d H sd0    Y  d S )Nr"   r#   c                   “  s   t ˆ dd�I d H  d S )NTrÄ   r�   r8   ©ry   r8   r9   rÆ   ¡  s    z@test_run_in_worker_thread_abandoned.<locals>.main.<locals>.child)r   rÌ   rÍ   r   rÎ   rÏ   )rÆ   rÔ   rÛ   r8   r9   r}      s
    
z1test_run_in_worker_thread_abandoned.<locals>.mainzException in thread)Úsetattrr   Ú_thread_cacherÊ   rË   rm   rÐ   r¾   r@   rÑ   r   Z
readouterr)r×   rØ   r}   rj   ÚoutÚerrr8   )rÙ   rÚ   ry   r9   Ú#test_run_in_worker_thread_abandoned“  s    	

rà   ÚMAX)rM   é   rÉ   rÏ   FTÚuse_default_limiterrF   rÁ   )rá   rÏ   rã   r$   c           
   	   ƒ  sö  d|  }t  ¡ ‰t  ¡ ‰|r4tƒ }|j}| |_d ‰nt| ƒ}| }|‰�z¢G dd„ dƒ‰dˆ_dˆ_dˆ_dˆ_	t
 ¡ ‰dddœ‡‡‡‡fdd	„‰d
ddœ‡ ‡‡fdd„}t
 ¡ 4 I d H š¼}tdƒ g }t|ƒD ],}	| tƒ ¡ | ||d ¡ tƒ I d H  qÎˆ �r(tdƒ |d  ¡ I d H  tƒ I d H  ˆj	| k�sD| ¡ j| k�rVtdƒI d H  �q(ˆ ¡  W d   ƒI d H  �qŒ1 I d H �s‚0    Y  ˆj| k�sœJ ‚ˆ �rÀ|jdk�rÀtdƒI d H  �q¢ˆj|k�sÐJ ‚ˆjdk�sàJ ‚W ||_n||_0 d S )Nr	   c                   @  s.   e Zd ZU ded< ded< ded< ded< dS )z0test_run_in_worker_thread_limiter.<locals>.staterF   ÚranÚ
high_waterrb   ÚparkedN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r8   r8   r8   r9   ÚstateÝ  s   
rë   r   r
   r"   )rÎ   r$   c                   sÈ   t dƒ t| jˆd� ˆ�J ˆ jd7  _ˆ jd7  _tˆjˆjƒˆ_ˆ jd7  _W d   ƒ n1 sj0    Y  ˆ  ¡  ˆ�, ˆ jd8  _ˆ jd8  _W d   ƒ n1 s²0    Y  t dƒ d S )Nzthread_fn startr+   r¶   zthread_fn exiting)	r2   r   rÏ   rä   rb   Úmaxrå   ræ   r|   ©rÎ   )ÚgateÚlockrë   rS   r8   r9   ry   ê  s    ,,z4test_run_in_worker_thread_limiter.<locals>.thread_fnr   )Úeventr$   c                 “  sV   t  ¡ �&}tˆ|ˆ ˆd�I d H  W d   ƒ n1 s40    Y  td|jƒ |  ¡  d S )N)rÂ   Úlimiterzrun_thread finished, cancelled:)r   r
   r   r2   rÓ   rl   )rð   rÎ   )rÏ   Úlimiter_argry   r8   r9   Ú
run_threadú  s    
ü*z5test_run_in_worker_thread_limiter.<locals>.run_threadZspawningéÿÿÿÿz'waiting for first cancellation to clearr=   )r/   r   ÚLockr   Ztotal_tokensr   rä   rå   rb   ræ   r   rR   rÌ   r2   rÒ   r.   rÍ   r   r|   Ú
statisticsZtasks_waitingr   rl   Úborrowed_tokens)
rá   rÏ   rã   ZCOUNTÚcZorig_total_tokensró   rÔ   Úeventsrq   r8   )rÏ   rî   rò   rï   rë   ry   rS   r9   Ú!test_run_in_worker_thread_limiter¹  sX    ÿÿ6rú   c                  ƒ  sB   g ‰ G ‡ fdd„dƒ} t dd„ | ƒ d�I d H  ˆ ddgks>J ‚d S )Nc                      s4   e Zd Zdddœ‡ fdd„Zdddœ‡ fdd„ZdS )	z?test_run_in_worker_thread_custom_limiter.<locals>.CustomLimiterr    r"   ©Úborrowerr$   c                 “  s   ˆ   d¡ || _d S ©NÚacquire©r.   Z	_borrower©Úselfrü   rH   r8   r9   Úacquire_on_behalf_of6  s    
zTtest_run_in_worker_thread_custom_limiter.<locals>.CustomLimiter.acquire_on_behalf_ofc                   s   ˆ   d¡ || jksJ ‚d S )NÚreleaserÿ   r   rH   r8   r9   Úrelease_on_behalf_of:  s    
zTtest_run_in_worker_thread_custom_limiter.<locals>.CustomLimiter.release_on_behalf_ofN©rç   rè   ré   r  r  r8   rH   r8   r9   ÚCustomLimiter5  s   r  c                   S  s   d S rU   r8   r8   r8   r8   r9   rV   @  rW   z:test_run_in_worker_thread_custom_limiter.<locals>.<lambda>©rñ   rþ   r  r�   )r  r8   rH   r9   Ú(test_run_in_worker_thread_custom_limiter0  s    r  c                  ƒ  sö   g ‰G ‡fdd„dƒ} | ƒ }t jtdd��&}tdd„ |d�I d H  W d   ƒ n1 sV0    Y  |jjd u spJ ‚ˆdd	gks€J ‚g ‰i ‰ t jtdd��*}t‡ fd
d„|d�I d H  W d   ƒ n1 sÆ0    Y  t|jjtƒsâJ ‚ˆdd	gksòJ ‚d S )Nc                      s4   e Zd Zdddœ‡ fdd„Zdddœ‡ fdd„Zd	S )
zCtest_run_in_worker_thread_limiter_error.<locals>.BadCapacityLimiterr    r"   rû   c                 “  s   ˆ   d¡ d S rý   )r.   r   rH   r8   r9   r  H  s    zXtest_run_in_worker_thread_limiter_error.<locals>.BadCapacityLimiter.acquire_on_behalf_ofr   c                   s   ˆ   d¡ tdƒ‚d S )Nr  zrelease on behalf)r.   rK   r   rH   r8   r9   r  K  s    
zXtest_run_in_worker_thread_limiter_error.<locals>.BadCapacityLimiter.release_on_behalf_ofNr  r8   rH   r8   r9   ÚBadCapacityLimiterG  s   r	  z^release on behalf$r¸   c                   S  s   d S rU   r8   r8   r8   r8   r9   rV   R  rW   z9test_run_in_worker_thread_limiter_error.<locals>.<lambda>r  rþ   r  c                     s   ˆ d S )Nr4   r8   r8   )Údr8   r9   rV   [  rW   )rY   rZ   rK   r   r§   Ú__context__Ú
isinstancerP   )r	  Úbsr¹   r8   )r
  r7   r9   Ú'test_run_in_worker_thread_limiter_errorD  s    48r  )rØ   r$   c                 Ã  s˜   ddddœdd„}|   tjjd|¡ tƒ }|jdks8J ‚t t¡�"}t	dd	„ ƒI d H  W d   ƒ n1 sj0    Y  d
t
|jƒv s†J ‚|jdks”J ‚d S )NÚobjectr   )r  r{   r$   c                 W  s   t dƒ‚d S )Nz!the engines canna take it captain)r[   )r  r{   r8   r8   r9   Ú	bad_startd  s    z:test_run_in_worker_thread_fail_to_spawn.<locals>.bad_startÚstart_thread_soonr   c                   S  s   d S rU   r8   r8   r8   r8   r9   rV   n  rW   z9test_run_in_worker_thread_fail_to_spawn.<locals>.<lambda>Zengines)rÜ   r   rÝ   ZThreadCacher   r÷   rY   rZ   r[   r   r€   r§   )rØ   r  rñ   r¹   r8   r8   r9   Ú'test_run_in_worker_thread_fail_to_spawn`  s    0r  c                  Ã  s4   ddœdd„} t  ¡ }t| ƒI d H }||ks0J ‚d S )Nrt   r#   c                  S  s   t tjƒ} | S rU   ©r   r   rR   ©Úcallee_tokenr8   r8   r9   ry   w  s    
z5test_trio_to_thread_run_sync_token.<locals>.thread_fn©r   rR   r   ©ry   Zcaller_tokenr  r8   r8   r9   Ú"test_trio_to_thread_run_sync_tokent  s    r  c                  Ã  sN   ddœdd„} t jtdd�� t| ƒI d H  W d   ƒ n1 s@0    Y  d S )Nr"   r#   c                   Ó  s   d S rU   r8   r8   r8   r8   r9   Úasync_fn‚  s    z=test_trio_to_thread_run_sync_expected_error.<locals>.async_fnzexpected a sync functionr¸   )rY   rZ   Ú	TypeErrorr   ©r  r8   r8   r9   Ú+test_trio_to_thread_run_sync_expected_error€  s    r  Útrio_test_contextvarzcontextvars.ContextVar[str]c                  Ã  s°   t  ¡ } t d¡ ddœdd„}t|ƒI d H \}}|dks>J ‚|| ksJJ ‚ddœdd„}t|ƒI d H \}}}t ¡ }|dks€J ‚|d	ksŒJ ‚|dksœJ d
ƒ‚t ¡ dks¬J ‚d S )Nr}   ztuple[str, threading.Thread]r#   c                  S  sH   t  ¡ } t tj¡� t ¡  W d   ƒ n1 s20    Y  | t ¡ fS rU   )	r  r¾   rY   rZ   ÚsniffioÚAsyncLibraryNotFoundErrorÚcurrent_async_libraryr/   r0   )r§   r8   r8   r9   r>   ’  s    &z3test_trio_to_thread_run_sync_contextvars.<locals>.fz!tuple[str, str, threading.Thread]c                  S  s\   t  ¡ } t  d¡ t  ¡ }t tj¡� t ¡  W d   ƒ n1 sD0    Y  | |t 	¡ fS )NÚworker)
r  r¾   rl   rY   rZ   r  r  r   r/   r0   )Úparent_valueÚinner_valuer8   r8   r9   r·   œ  s    
&ýz3test_trio_to_thread_run_sync_contextvars.<locals>.gr!  zRThe contextvar value set on the worker would not propagate back to the main threadÚtrio)r/   r0   r  rl   r   r¾   r  r   )rC   r>   r§   rA   r·   r"  r#  Úcurrent_valuer8   r8   r9   Ú(test_trio_to_thread_run_sync_contextvarsŽ  s    

ÿr&  c                  ƒ  sŠ   ddœdd„} t | ƒI d H }t|tƒs*J ‚ddœdd„‰ ddœ‡ fdd	„}tjtd
d�� t |ƒI d H  W d   ƒ n1 s|0    Y  d S )NÚfloatr#   c                  S  s   t tjƒ} | S rU   )r   r   Úcurrent_time)Ú	trio_timer8   r8   r9   Úthread_fn_1¶  s    
z3test_trio_from_thread_run_sync.<locals>.thread_fn_1r"   c                   Ó  s   d S rU   r8   r8   r8   r8   r9   r  ¾  s    z0test_trio_from_thread_run_sync.<locals>.async_fnc                     s   t ˆ ƒ d S rU   )r   r8   r  r8   r9   Úthread_fn_2Á  s    z3test_trio_from_thread_run_sync.<locals>.thread_fn_2zexpected a synchronous functionr¸   )r   r  r'  rY   rZ   r  )r*  r)  r+  r8   r  r9   Útest_trio_from_thread_run_sync³  s    r,  c                  ƒ  s˜   g ‰ddœ‡fdd„‰ ddœ‡ ‡fdd„} t | ƒI d H  ˆddgksHJ ‚ddœd	d
„}tjtdd��  t t|ƒI d H  W d   ƒ n1 sŠ0    Y  d S )Nr"   r#   c                   “  s   t  ¡  ˆ  d¡ d S )Núback in trio)r   r(  r.   r8   rH   r8   r9   Úback_in_trio_fnÍ  s    z2test_trio_from_thread_run.<locals>.back_in_trio_fnc                     s   ˆ  d¡ tˆ ƒ d S )Nú	in thread)r.   r   r8   ©r.  r7   r8   r9   ry   Ñ  s    
z,test_trio_from_thread_run.<locals>.thread_fnr/  r-  c                   S  s   d S rU   r8   r8   r8   r8   r9   Úsync_fnÙ  s    z*test_trio_from_thread_run.<locals>.sync_fnzappears to be synchronousr¸   )r   rY   rZ   r  r   )ry   r1  r8   r0  r9   Útest_trio_from_thread_runÈ  s    r2  c                  Ã  s4   ddœdd„} t  ¡ }t| ƒI d H }||ks0J ‚d S )Nrt   r#   c                  S  s   t tjƒ} | S rU   r  r  r8   r8   r9   ry   ã  s    
z.test_trio_from_thread_token.<locals>.thread_fnr  r  r8   r8   r9   Útest_trio_from_thread_tokenà  s    r3  c                  Ã  s8   dddœdd„} t  ¡ }t| |ƒI d H }||ks4J ‚d S )Nrt   ru   c                 S  s   t tj| d�}|S )Nr+   r  )rS   r  r8   r8   r9   ry   ï  s    z4test_trio_from_thread_token_kwarg.<locals>.thread_fnr  r  r8   r8   r9   Ú!test_trio_from_thread_token_kwargì  s    r4  c                   Ã  s8   t  t¡� ttjƒ W d   ƒ n1 s*0    Y  d S rU   ©rY   rZ   r[   r   r   r(  r8   r8   r8   r9   Útest_from_thread_no_tokenø  s    r6  c                  Ã  s–   t  d¡ ddœdd„} t| ƒI d H \}}}}}t  ¡ }||  krLdksRn J ‚||  krp|  krpdksvn J ‚t ¡ dks†J ‚|dks’J ‚d S )	Nr}   útuple[str, str, str, str, str]r#   c                  S  s²   t  ¡ } t  d¡ t  ¡ }t tj¡� t ¡  W d   ƒ n1 sD0    Y  ddœdd„}t|ƒ\}}t  ¡ }t tj¡� t ¡  W d   ƒ n1 sš0    Y  | ||||fS )Nr!  útuple[str, str]r#   c                  S  s2   t  ¡ } t  d¡ t  ¡ }t ¡ dks*J ‚| |fS ©NÚback_in_mainr$  ©r  r¾   rl   r  r   ©Úback_parent_valueÚback_current_valuer8   r8   r9   r:  
  s
    
zStest_trio_from_thread_run_sync_contextvars.<locals>.thread_fn.<locals>.back_in_main)	r  r¾   rl   rY   rZ   r  r  r   r   )Úthread_parent_valueÚthread_current_valuer:  r=  r>  Úthread_after_valuer8   r8   r9   ry     s     
&&ûz=test_trio_from_thread_run_sync_contextvars.<locals>.thread_fnr!  r$  r:  ©r  rl   r   r¾   r  r   ©ry   r?  r@  rA  r=  r>  r%  r8   r8   r9   Ú*test_trio_from_thread_run_sync_contextvars   s    
 ú$rD  c                  Ã  s–   t  d¡ ddœdd„} t| ƒI d H \}}}}}t  ¡ }||  krLdksRn J ‚||  krp|  krpdksvn J ‚|dks‚J ‚t ¡ dks’J ‚d S )	Nr}   r7  r#   c                  S  s²   t  ¡ } t  d¡ t  ¡ }t tj¡� t ¡  W d   ƒ n1 sD0    Y  ddœdd„}t|ƒ\}}t  ¡ }t tj¡� t ¡  W d   ƒ n1 sš0    Y  | ||||fS )Nr!  r8  r#   c                  Ó  s2   t  ¡ } t  d¡ t  ¡ }t ¡ dks*J ‚| |fS r9  r;  r<  r8   r8   r9   Úasync_back_in_main5  s
    
zTtest_trio_from_thread_run_contextvars.<locals>.thread_fn.<locals>.async_back_in_main)	r  r¾   rl   rY   rZ   r  r  r   r   )r?  r@  rE  r=  r>  rA  r8   r8   r9   ry   .  s     
&&ûz8test_trio_from_thread_run_contextvars.<locals>.thread_fnr!  r:  r$  rB  rC  r8   r8   r9   Ú%test_trio_from_thread_run_contextvars+  s    
 ú$rF  c                   C  s<   t  t¡� ttjdd� W d   ƒ n1 s.0    Y  d S )NzNot TrioTokentyper+   r5  r8   r8   r8   r9   Ú3test_run_fn_as_system_task_caught_badly_typed_tokenV  s
    þrG  c                  Ã  sP   ddœdd„} t  ¡ }t t¡� t| |d� W d   ƒ n1 sB0    Y  d S )Nr"   r#   c                   S  s
   t ƒ ‚d S rU   )ÚAssertionErrorr8   r8   r8   r9   Ú
not_called_  s    z7test_from_thread_inside_trio_thread.<locals>.not_calledr+   )r   rR   rY   rZ   r[   r   )rI  r)   r8   r8   r9   Ú#test_from_thread_inside_trio_thread^  s    rJ  c                    s^   g ‰g ‰dddœ‡fdd„‰ dddœ‡ ‡fd	d
„} t  | d¡ t  | d¡ ˆddgksZJ ‚d S )Nr%   zAsyncGenerator[None, None]ru   c                  sú   z~d V  W t jdd��X zttttd| d�ƒI d H  W n t jyT   ˆ  d¡ Y n0 ˆ  d¡ W d   ƒ qö1 st0    Y  nvt jdd��X zttttd| d�ƒI d H  W n t jyÊ   ˆ  d¡ Y n0 ˆ  d¡ W d   ƒ n1 sê0    Y  0 d S )NTrÇ   r   r+   r½   Úclean)r   r
   r   r   r   r   ZRunFinishedErrorr.   rx   rH   r8   r9   Úagenk  s$    ÿ*øÿz2test_from_thread_run_during_shutdown.<locals>.agenrÁ   r"   )Úuse_system_taskr$   c                 “  s2   ˆ  ˆ | rt ¡ nd ƒ¡ ˆd  d ¡I d H  d S )Nrô   )r.   r   rR   Úasend)rM  )rL  Úsaver8   r9   r}   y  s    z2test_from_thread_run_during_shutdown.<locals>.mainTFr½   rK  )r   rm   )r}   r8   )rL  r7   rO  r9   Ú$test_from_thread_run_during_shutdowng  s    rP  c                  Ã  s4   t  ¡ } t| t jƒsJ ‚t | ¡}| |ƒ u s0J ‚d S rU   )r   rR   r  Z	TrioTokenÚweakrefÚref)rS   Zweak_referencer8   r8   r9   Ú"test_trio_token_weak_referenceable‚  s    
rS  c                  Ã  sP   G dd„ dƒ} t  t¡�$ tt| ƒ d�I d H  W d   ƒ n1 sB0    Y  d S )Nc                   @  s   e Zd Zddœdd„ZdS )z4test_unsafe_abandon_on_cancel_kwarg.<locals>.BadBoolrÁ   r#   c                 S  s   t ‚d S rU   )ÚNotImplementedError)r  r8   r8   r9   Ú__bool__�  s    z=test_unsafe_abandon_on_cancel_kwarg.<locals>.BadBool.__bool__N)rç   rè   ré   rU  r8   r8   r8   r9   ÚBadBoolŒ  s   rV  rÄ   )rY   rZ   rT  r   rF   )rV  r8   r8   r9   Ú#test_unsafe_abandon_on_cancel_kwarg‰  s    rW  c                  Ã  sL   t  ¡ } ddœdd„}| ttt jƒI d H u s0J ‚| tt|ƒI d H u sHJ ‚d S )Nz
_core.Taskr#   c                   Ó  s   t  ¡ S rU   )r   Úcurrent_taskr8   r8   r8   r9   Úasync_current_task—  s    z8test_from_thread_reuses_task.<locals>.async_current_task)r   rX  r   r   r   )ÚtaskrY  r8   r8   r9   Útest_from_thread_reuses_task”  s    r[  c                  ƒ  s0   d ‰ ddœ‡ fdd„} ˆ t | ƒI d H ks,J ‚d S )NrF   r#   c                     s   t  ¡ ‰ ttt jƒS rU   )r/   r¦   r   r   r8   ©Útidr8   r9   Úget_tid_then_reenter¡  s    z6test_recursive_to_thread.<locals>.get_tid_then_reenterr�   )r^  r8   r\  r9   Útest_recursive_to_threadž  s    r_  c                  ƒ  s   t  ¡ ‰ddœ‡ ‡fdd„} t ¡ �‰ t| ƒI d H  W d   ƒ n1 sH0    Y  ˆ jr\J ‚ˆ ¡ rhJ ‚t ¡ �"‰ t| dd�I d H  W d   ƒ n1 s˜0    Y  ˆ js¬J ‚ttˆjdd�ƒI d H rÈJ ‚d	dœd
d„‰ddœ‡ ‡‡fdd„}t ¡ �‰ t|ƒI d H  W d   ƒ n1 �s0    Y  ˆ j�r0J ‚ˆ ¡ �r>J ‚t ¡ �"‰ t|dd�I d H  W d   ƒ n1 �sp0    Y  ˆ j�s†J ‚ttˆjdd�ƒI d H �r¤J ‚ddœ‡ fdd„}t ¡ � ‰ tt	|ƒI d H  W d   ƒ n1 �sæ0    Y  ˆ j�süJ ‚d S )Nr"   r#   c                     sD   t ˆ jƒ zt tƒ W n tjy4   ˆ d¡ Y n0 ˆ d¡ d S ©NTF)r   rÏ   rÁ   r   rw   rÐ   r8   )rÎ   Úqueuer8   r9   Ú
sync_check¬  s    
z3test_from_thread_host_cancelled.<locals>.sync_checkTrÄ   r¶   ©ÚtimeoutrÁ   c                   Ó  s   dS ©NTr8   r8   r8   r8   r9   Úno_checkpointÁ  s    z6test_from_thread_host_cancelled.<locals>.no_checkpointc                     sH   t ˆ jƒ ztˆƒsJ ‚W n tjy8   ˆ d¡ Y n0 ˆ d¡ d S r`  )r   rÏ   r   r   rw   rÐ   r8   ©rÎ   rf  ra  r8   r9   Úasync_checkÄ  s    
z4test_from_thread_host_cancelled.<locals>.async_checkc                   “  s@   ˆ   ¡  tdƒ� tƒ I d H  W d   ƒ n1 s20    Y  d S )NrÉ   )rÏ   r   r   r8   rí   r8   r9   Úasync_time_bombÙ  s    
z8test_from_thread_host_cancelled.<locals>.async_time_bomb)
rÊ   rË   r   r
   r   rÓ   Ú
get_nowaitr   r¾   r   )rb  rh  ri  r8   rg  r9   Útest_from_thread_host_cancelled©  s0    	
,

0
	
.
2
0rk  r
   z	list[str]zCallable[[], None])rÂ   rÕ   r7   r>   r$   c                 Ã  s´   |�œ |  d¡ ztz.t|| d�I d H W W |  d¡ W  d   ƒ S  tjyv } z|  t|ƒ¡ ‚ W Y d }~n
d }~0 0 W |  d¡ n|  d¡ 0 W d   ƒ n1 s¦0    Y  d S rÃ   )r.   r   r   rw   r€   )rÂ   rÕ   r7   r>   rª   r8   r8   r9   rÆ   ä  s    

ûrÆ   Úcancel_the_scope)rl  r$   c              	   ƒ  s&  t  ¡ ‰ddœ‡ ‡fdd„}g }t ¡ ‰ t ¡ }t ¡ 4 I d H šl}| td|||¡ t	ƒ I d H  |d dkspJ ‚ˆj
dd	�d
ks„J ‚| r�| ¡  ˆ  ¡  W d   ƒI d H  qÂ1 I d H s¸0    Y  | sØ|d dksÖJ ‚nJ|jsâJ ‚t d|d ¡sþJ |d ƒ‚|d dk�sJ ‚t|ƒdk�s"J ‚d S )Nr"   r#   c               
     sX   z
t ƒ  W n4 tjy> }  zˆ t| ƒ¡ W Y d } ~ nd } ~ 0 0 ˆ d¡ ˆ  ¡  t ƒ S ©NúNot Cancelled)r   r   rw   rÐ   r€   r|   ©rª   ©rr   r»   r8   r9   r>   ù  s    
$
z6test_from_thread_check_cancelled_no_abandon.<locals>.fFr   r*   r¶   rc  rn  rÅ   zzcancelled due to explicit from task <Task 'trio._tests.test_threads.test_from_thread_check_cancelled_no_abandon' at 0x\w*>r	   rM   )rÊ   rË   r/   r   r   r
   rÌ   rÍ   rÆ   r   r¾   rÏ   rl   rÓ   rˆ   Ú	fullmatchÚlen)rl  r>   r7   rÕ   rÔ   r8   rp  r9   Ú+test_from_thread_check_cancelled_no_abandonõ  s0    
2
ýürs  c               	   ƒ  s  t  ¡ ‰ddœ‡ ‡fdd„} g }t ¡ ‰ t ¡ }t ¡ 4 I d H šL}| td||| ¡ t	ƒ I d H  |d dkspJ ‚| 
¡  W d   ƒI d H  q¢1 I d H s˜0    Y  ˆ  ¡  |js´J ‚t d|d	 ¡sÐJ |d	 ƒ‚|d
 dksàJ ‚ˆjd	d�}t|tƒrü|‚nt d|¡�sJ |ƒ‚d S )Nr"   r#   c               
     s‚   ˆ   ¡  z
tƒ  W n` tjyF }  zˆ t| ƒ¡ W Y d } ~ n@d } ~ 0  tyr }  zˆ | ¡ W Y d } ~ nd } ~ 0 0 ˆ d¡ d S rm  )r|   r   r   rw   rÐ   r€   r1   ro  rp  r8   r9   r>   &  s    
" z=test_from_thread_check_cancelled_abandon_on_cancel.<locals>.fTr   r*   z�cancelled due to explicit from task <Task 'trio._tests.test_threads.test_from_thread_check_cancelled_abandon_on_cancel' at 0x\w*>r¶   rô   rÅ   rc  )rÊ   rË   r/   r   r   r
   rÌ   rÍ   rÆ   r   rÏ   rl   rÓ   rˆ   rq  r¾   r  r1   )r>   r7   rÕ   rÔ   Úresr8   rp  r9   Ú2test_from_thread_check_cancelled_abandon_on_cancel!  s8    2
ýü
ýüru  c                     sŠ   t  t¡� tƒ  W d   ƒ n1 s&0    Y  t ¡ ‰ t t‡ fdd„¡ t  t¡�  ˆ jdd� 	¡  W d   ƒ n1 s|0    Y  d S )Nc                   s
   ˆ   | ¡S rU   )rÐ   rp   r¿   r8   r9   rV   U  rW   zLtest_from_thread_check_cancelled_raises_in_foreign_threads.<locals>.<lambda>r¶   rc  )
rY   rZ   r[   r   rÊ   rË   r   r  r¾   Úunwrapr8   r8   r¿   r9   Ú:test_from_thread_check_cancelled_raises_in_foreign_threadsQ  s    $rw  c               
   Ã  sŽ   ddœdd„} t dƒ�d t ¡ 4 I d H š.}tdƒD ]}| | ¡ q2W d   ƒI d H  ql1 I d H sb0    Y  W d   ƒ n1 s€0    Y  d S )Nr"   r#   c                   Ó  s   t ttddd�I d H  q d S )Nr   FrÄ   )r   r   r   r8   r8   r8   r9   rÆ   `  s    z+test_reentry_doesnt_deadlock.<locals>.childr	   é   )r   r   rÌ   rÒ   rÍ   )rÆ   rÔ   rq   r8   r8   r9   Útest_reentry_doesnt_deadlockZ  s
    
ry  c               	   ƒ  sL  d‰ t ƒ } t ƒ }t ƒ }t ƒ }ddddœdd„}ddœ‡ fdd	„}t ¡ 4 I d H šà}| || |¡ | |||¡ tƒ I d H  | |¡ tƒ I d H  ˆ r˜J ‚tƒ d
ks¦J ‚|  ¡  | ¡ I d H  tƒ I d H  ˆ rÐJ ‚tƒ dksÞJ ‚| ¡  | ¡ I d H  tƒ I d H  ˆ �s
J ‚tƒ dk�sJ ‚W d   ƒI d H  �qH1 I d H �s>0    Y  d S )NFr   r"   )rª   Úe_exitr$   c                 “  s,   ddœ‡ fdd„}t |ƒI d H  | ¡  d S )Nr"   r#   c                     s   t ˆ jƒ d S rU   )r   r|   r8   ro  r8   r9   rj   s  s    zCtest_wait_all_threads_completed.<locals>.wait_event.<locals>.thread)r   rl   )rª   rz  rj   r8   ro  r9   Ú
wait_eventr  s    z3test_wait_all_threads_completed.<locals>.wait_eventr#   c                   “  s   t ƒ I d H  d‰ d S re  )r   r8   ©Zno_threads_leftr8   r9   Úwait_no_threads_lefty  s    z=test_wait_all_threads_completed.<locals>.wait_no_threads_leftr	   r¶   r   )r   r   rÌ   rÍ   r   r   rl   r|   )Úe1Úe2Z	e1_exitedZ	e2_exitedr{  r}  rÔ   r8   r|  r9   Útest_wait_all_threads_completedj  s2    

r€  c                   Ã  s   t ƒ I d H  tƒ dksJ ‚d S )Nr   )r   r   r8   r8   r8   r9   Ú*test_wait_all_threads_completed_no_threads”  s    r�  )N)gÚ
__future__r   Zcontextvarsra  rÊ   rˆ   r^   r/   rÑ   rQ  Ú	functoolsr   Útypingr   r   r   r   rY   r  rŒ   r
   r   r   r   r   r   r   r   Z_core._tests.test_kir   Z_core._tests.tutilr   Ú_threadsr   r   r   r   r   r   r   Ztestingr   Úcollections.abcr   r   r   Úoutcomer   Zlowlevelr    ÚlistÚtupler€   r?   r3   r1   rE   r!   rT   r\   rn   r~   r“   r«   r²   rµ   rº   rÖ   rà   ÚmarkZparametrizerú   r  r  r  r  r  Z
ContextVarr  rê   r&  r,  r2  r3  r4  r6  rD  rF  rG  rJ  rP  rS  rW  r[  r_  rk  rÆ   rs  ru  rw  ry  r€  r�  r8   r8   r8   r9   Ú<module>   sŒ   (
$	<0.#	<&t	ÿ%++	
;+0	*