o
    4@Hh                     @  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rd dl*m+Z+m,Z,m-Z- d dl.m/Z/ ddl0m1Z1 e2e3e4eej5e6e7 f f  Z8edZ9dnddZ:dnddZ;dnddZ<dnddZ=dnddZ>dodpddZ?dnd d!Z@dnd"d#ZAdnd$d%ZBdnd&d'ZCdqd,d-ZDejEFd.g d/ejEFd0d1d2gejEFd3d1d2gdrd6d7ZGdnd8d9ZHdnd:d;ZIdsd<d=ZJdnd>d?ZKdnd@dAZLeMdBZNdCeOdB< dndDdEZPdndFdGZQdndHdIZRdndJdKZSdndLdMZTdndNdOZUdndPdQZVdndRdSZWdndTdUZXdndVdWZYdndXdYZZdndZd[Z[dnd\d]Z\dnd^d_Z]dnd`daZ^dndbdcZ_dndddeZ`dndfdgZaedndhdiZbdndjdkZcdndldmZddS )t    )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returnNonec                    s   t   	 dd fdd} t }ddd}| t|d|dI d H  d dd}| t|dtf|dI d H  ddd}| t|d|dI d H  d dd}| t|dtf|dI d H  d S )!Ndo_in_trio_threadCallable[..., threading.Thread]fnCallable[..., T | Awaitable[T]]expectedtuple[str, T]
trio_token_core.TrioToken | Noner"   r#   c                   st   g d fdd}t j|dd}|  | r+td tdI d H  | sd	|fd
f|gks8J d S )Nr"   r#   c               
     sv   z dt f  d}  d| f W d S  ty: } zt|  dt|f W Y d }~d S d }~ww )Nstartr*   goterror)append	threadingcurrent_threadBaseExceptionprinttype)xexcr$   r&   recordr*    X/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/trio/_tests/test_threads.pythreadfnB   s    z<test_do_in_trio_thread.<locals>.check_case.<locals>.threadfnT)targetdaemonyawn{Gz?r,   fr"   r#   )r1   Threadr,   is_aliver4   r   )r$   r&   r(   r*   r<   child_threadtrio_threadr8   r;   
check_case:   s   	z*test_do_in_trio_thread.<locals>.check_caser9   
RecordTypeintc                 S  s"   t  rJ | dt f dS )NrA   r	   )r   currently_ki_protectedr0   r1   r2   r9   r:   r:   r;   f1T      z"test_do_in_trio_thread.<locals>.f1)r.   r	   r-   r   c                 S  s"   t  rJ | dt f tNrA   )r   rK   r0   r1   r2   
ValueErrorrL   r:   r:   r;   f2[   rN   z"test_do_in_trio_thread.<locals>.f2r/   c                   s2   t  rJ t  I d H  | dt f dS )NrA      )r   rK   
checkpointr0   r1   r2   rL   r:   r:   r;   f3b   
   z"test_do_in_trio_thread.<locals>.f3)r.   rR   c                   s2   t  rJ t  I d H  | dt f trO   )r   rK   rS   r0   r1   r2   KeyErrorrL   r:   r:   r;   f4j   rU   z"test_do_in_trio_thread.<locals>.f4N)
r$   r%   r&   r'   r(   r)   r*   r+   r"   r#   )r9   rI   r"   rJ   )r9   rI   r"   r   )r1   r2   r   current_trio_tokenr   rP   r   rV   )rH   tokenrM   rQ   rT   rW   r:   rF   r;   test_do_in_trio_thread7   s   



r[   c                    sz   t t tdd  W d    n1 sw   Y  ddd} t t t|  W d    d S 1 s6w   Y  d S )Nc                   S     d S rX   r:   r:   r:   r:   r;   <lambda>u       z9test_do_in_trio_thread_from_trio_thread.<locals>.<lambda>r"   r#   c                        d S rX   r:   r:   r:   r:   r;   foow      z4test_do_in_trio_thread_from_trio_thread.<locals>.foorB   )pytestraisesRuntimeErrorr   r   )r`   r:   r:   r;   'test_do_in_trio_thread_from_trio_threads   s   

"re   c                    s2   t   d fdd} t|   ddhksJ d S )Nr"   r#   c                    s   t   ddddfddd fdd} tj| d	}|  td
 | r8tdI d H  | s-td |  td d S )Nr"   r#   c               
   S  sX   t d t r
J t d zt  W dd l} t d|   d S dd l} t d|   w )Nzin Trio threadr   r   finally)r4   r   rK   r   sysexc_info)rg   r:   r:   r;   trio_thread_fn   s   zTtest_run_in_trio_thread_ki.<locals>.check_run_in_trio_thread.<locals>.trio_thread_fnc                     s      d S rX   r:   r:   )ri   r:   r;   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w z	td W d S  ty;   t d  d Y d S w )Nrunningr-   ok1ok2)r4   r   KeyboardInterruptaddr   r:   )r9   rZ   rj   ri   r:   r;   external_thread_fn   s   zXtest_run_in_trio_thread_ki.<locals>.check_run_in_trio_thread.<locals>.external_thread_fn)r=   waitingr@   zwaited, joiningdonerB   )	r   rY   r1   rC   r,   r4   rD   r   join)rp   threadrL   )rZ   rj   ri   r;   check_run_in_trio_thread   s   
z<test_run_in_trio_thread_ki.<locals>.check_run_in_trio_threadrl   rm   rB   )setr   run)ru   r:   rL   r;   test_run_in_trio_thread_ki~   s   
'rx   c                    sb   g t   d fdddfddd fd
d} t| }|  ddgks/J d S )Nr"   r#   c                     s,    d    tdd I d H  d S )Nsleepingc                 S  s   t jjS rX   )r   Abort	SUCCEEDED_r:   r:   r;   r]          zMtest_await_in_trio_thread_while_main_exits.<locals>.trio_fn.<locals>.<lambda>)r0   rv   r   wait_task_rescheduledr:   )evr9   r:   r;   trio_fn   s   
z;test_await_in_trio_thread_while_main_exits.<locals>.trio_fnrZ   _core.TrioTokenc                   s4   z	t | d W d S  tjy    d Y d S w )Nr-   	cancelled)r   r   	Cancelledr0   rZ   )r9   r   r:   r;   	thread_fn   s
   z=test_await_in_trio_thread_while_main_exits.<locals>.thread_fnthreading.Threadc                    sB   t  } tj| fd}|    I d H  dgksJ |S )N)r=   argsry   )r   rY   r1   rC   r,   wait)rZ   rt   )r   r9   r   r:   r;   main   s   z8test_await_in_trio_thread_while_main_exits.<locals>.mainry   r   rB   )rZ   r   r"   r#   )r"   r   )r   r   rw   rs   )r   rt   r:   )r   r9   r   r   r;   *test_await_in_trio_thread_while_main_exits   s   
r   c                    s   d} d|  fddddfd
d t I d H  t d dI d H  t  d|  I d H  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namestrr"   r   c                 S  s   t  j| ks	J t  S rX   )r1   r2   r   r   r:   r:   r;   r      s   z test_named_thread.<locals>.innerCallable[[], threading.Thread]c                   
   t  | S rX   r   r   r   r:   r;   rA         
ztest_named_thread.<locals>.f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   rt   rA   r:   r;   test_thread_name   s   z+test_named_thread.<locals>.test_thread_name fobiedooname_longer_than_15_characters   💙r   r   r"   r   r   r   r"   r   )r   r   r"   r#   r   )endingr   r:   rA   r   r;   test_named_thread   s   r   ident
int | None
str | Nonec              
   C  s  dd l }dd l}|jd}|sd}z||}W n ty+   tdtj  Y d S w t	|dd }|s6J |j
|j|jg|_|j|_|jddd}| d u rRt } || |ddks\J z|j W S  ty } ztd	|jd
|  W Y d }~d S d }~ww )Nr   pthreadzlibc.sozno pthread on pthread_getname_np       )sizezvalue: z, exception: )ctypesctypes.utilutilfind_libraryCDLL	Exceptionr4   rg   platformgetattrc_void_pc_char_pc_size_targtypesc_intrestypecreate_string_bufferr1   	get_identvaluedecodeUnicodeDecodeErrorrb   fail)r   r   libpthread_path
libpthreadr   name_bufferer:   r:   r;   _get_thread_name   s8   &r   c                    s   ddddfdd	 d
} t  | I d H  t  | d dI d H  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   r   r"   r   c                 S  sN   t  }|d u rtjdkrtdtj  t S || d d ks#J t S )Nlinuxzno pthread OS support on    )r   rg   r   rb   skipr1   r2   )r   os_thread_namer:   r:   r;   r     s   z#test_named_thread_os.<locals>.innerr   c                   r   rX   r   r   r   r:   r;   rA     r   ztest_named_thread_os.<locals>.fz4None from trio._tests.test_threads.test_named_threadr   r(   r   r#   c                   sR   |d u r| }t  || dI d H }t|j}|d usJ dtd|s'J d S )Nr   z'should skip earlier if this is the caser   )r   r   r   r   r   )r   r(   rt   r   r   r:   r;   r   (  s   
z.test_named_thread_os.<locals>.test_thread_namer   r   r   r   ?)r(   r   r   rX   )r   r   r(   r   r"   r#   r   )defaultr   r:   r   r;   test_named_thread_os  s   
		r   c                  C  sB   ddl m}  |  }|d u rtjdksJ tdtj  d S d S )Nr   )get_os_thread_name_funcr   zno pthread_setname_np on )trio._core._thread_cacher   rg   r   rb   r   )r   kr:   r:   r;   test_has_pthread_setname_np8  s   r   c                    s   t  } ddd}t|dI d H \}}|dksJ || ks J dd	d
}tjtdd}t|I d H  W d    n1 s>w   Y  t|jj |jjd | ksSJ d S )Nr6   r!   r"   tuple[T, threading.Thread]c                 S  s   | t  fS rX   )r1   r2   )r6   r:   r:   r;   rA   D     z$test_run_in_worker_thread.<locals>.f   r   c                   S  s   t t rX   )rP   r1   r2   r:   r:   r:   r;   gK  r   z$test_run_in_worker_thread.<locals>.gz1^<Thread\(Trio thread \d+, started daemon \d+\)>$r   r   )r6   r!   r"   r   )r"   r   )	r1   r2   r   rb   rc   rP   r4   r   r   )rG   rA   r6   rE   r   excinfor:   r:   r;   test_run_in_worker_threadA  s    

r   c               	     s  d gdfdd d fd	d
} g t  }t 4 I d H $}|| |d t I d H  dgks6J |j  W d   I d H  n1 I d H sKw   Y  d dksXJ |d  d dkrnt	
d d dkscg d d< t 4 I d H M}|| |d t I d H  |j  tjdd tdD ]	}t I d H  qW d    n1 sw   Y  dgksJ |d  W d   I d H  n1 I d H sw   Y  t }|  | |dI d H  W d    n1 sw   Y  |jsJ d S )Nqstdlib_queue.Queue[None]r"   r#   c                   s   d d< |    d d< d S )Nblockingr   finished)getr   )registerr:   r;   rA   Z  s   z1test_run_in_worker_thread_cancellation.<locals>.fabandon_on_cancelboolc              	     s:    d zt | |dI d H W  d S  d w )Nr,   r   exit)r0   r   )r   r   rA   r9   r:   r;   child`  s
   
z5test_run_in_worker_thread_cancellation.<locals>.childTr,   r   r   r@   Fshield
   )r   r   r"   r#   )r   r   r   r   r"   r#   )stdlib_queueQueuer   open_nursery
start_soonr   cancel_scopecancelputtimer   r
   rangerS   cancelled_caught)r   r   nurseryr}   scoper:   )rA   r9   r   r;   &test_run_in_worker_thread_cancellationW  sH   (



(
r   capfdpytest.CaptureFixture[str]monkeypatchpytest.MonkeyPatchc                   s   | tjdd t  t d
 fddd
fdd}t|  d   }| r:t	
d | s1|  \}}d	|vsFJ d	|vsLJ d S )NIDLE_TIMEOUTr@   r"   r#   c                     s       t  d S rX   )r   r   r1   r2   r:   )q1q2r:   r;   r     s   z6test_run_in_worker_thread_abandoned.<locals>.thread_fnc               	     sr   d fdd} t  4 I d H }||  t I d H  |j  W d   I d H  d S 1 I d H s2w   Y  d S )Nr"   r#   c                     s   t  ddI d H  d S )NTr   r   r:   r   r:   r;   r     s   z@test_run_in_worker_thread_abandoned.<locals>.main.<locals>.childrB   )r   r   r   r   r   r   )r   r   r   r:   r;   r     s   
.z1test_run_in_worker_thread_abandoned.<locals>.mainzException in threadrB   )setattrr   _thread_cacher   r   rw   r   r   rD   r   r   
readouterr)r   r   r   rt   outerrr:   )r   r   r   r;   #test_run_in_worker_thread_abandoned  s   
	

r  MAX)rR      r   r   FTuse_default_limiterrJ   r   c           
   	     s  d|  }t  t  |rt }|j}| |_d nt| }| }|zG dd dd_d_d_d_	t
 dfd	d
d fdd}t
 4 I d H d}td g }t|D ]}	|t  |||d  t I d H  qa rtd |d  I d H  t I d H  j	| ks| j| krtdI d H  j	| ks| j| ks  W d   I d H  n1 I d H sw   Y  j| ksJ  r|jdkrtdI d H  |jdksӈj|ksJ jdksJ W ||_d S ||_w )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>.staterJ   ran
high_waterrk   parkedN)__name__
__module____qualname____annotations__r:   r:   r:   r;   state  s
   
 r  r   r   r
   r"   r#   c                   s   t d t| jd %  jd7  _ jd7  _tjj_ jd7  _W d    n1 s5w   Y       jd8  _ jd8  _W d    n1 sYw   Y  t d d S )Nzthread_fn startr-   r   zthread_fn exiting)	r4   r   r   r  rk   maxr  r  r   r   )gatelockr  rZ   r:   r;   r     s   z4test_run_in_worker_thread_limiter.<locals>.thread_fneventr   c                   sX   t  }t| dI d H  W d    n1 sw   Y  td|j |   d S )N)r   limiterzrun_thread finished, cancelled:)r   r
   r   r4   r   rv   )r  r   )r   limiter_argr   r:   r;   
run_thread  s   
z5test_run_in_worker_thread_limiter.<locals>.run_threadspawningz'waiting for first cancellation to clearr@   )r   r
   r"   r#   )r  r   r"   r#   )r1   r   Lockr   total_tokensr   r  r  rk   r  r   rY   r   r4   r   r0   r   r   r   
statisticstasks_waitingr   rv   borrowed_tokens)
r  r   r  COUNTcorig_total_tokensr  r   eventsr}   r:   )r   r  r  r  r  r   rZ   r;   !test_run_in_worker_thread_limiter  sZ   
(

r!  c                    sD   g  G  fddd} t dd |  dI d H   ddgks J d S )Nc                      s(   e Zd Zd
 fddZd
 fddZd	S )z?test_run_in_worker_thread_custom_limiter.<locals>.CustomLimiterborrowerr    r"   r#   c                   s     d || _d S Nacquirer0   	_borrowerselfr"  rL   r:   r;   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'  rL   r:   r;   release_on_behalf_of:  s   
zTtest_run_in_worker_thread_custom_limiter.<locals>.CustomLimiter.release_on_behalf_ofNr"  r    r"   r#   r	  r
  r  r)  r+  r:   rL   r:   r;   CustomLimiter5  s    r.  c                   S  r\   rX   r:   r:   r:   r:   r;   r]   @  r^   z:test_run_in_worker_thread_custom_limiter.<locals>.<lambda>r  r$  r*  r   )r.  r:   rL   r;   (test_run_in_worker_thread_custom_limiter0  s
   r0  c                    s   g G fddd} |  }t jtdd}tdd |dI d H  W d    n1 s,w   Y  |jjd u s9J dd	gksAJ g i  t jtdd}t fd
d|dI d H  W d    n1 sdw   Y  t|jjtsrJ dd	gkszJ d S )Nc                      s(   e Zd Zd fddZd fdd	Zd
S )zCtest_run_in_worker_thread_limiter_error.<locals>.BadCapacityLimiterr"  r    r"   r#   c                   s     d d S r#  )r0   r'  rL   r:   r;   r)  H  s   zXtest_run_in_worker_thread_limiter_error.<locals>.BadCapacityLimiter.acquire_on_behalf_ofr   c                   s     d td)Nr*  zrelease on behalf)r0   rP   r'  rL   r:   r;   r+  K  s   
zXtest_run_in_worker_thread_limiter_error.<locals>.BadCapacityLimiter.release_on_behalf_ofNr,  )r"  r    r"   r   r-  r:   rL   r:   r;   BadCapacityLimiterG  s    r1  z^release on behalf$r   c                   S  r\   rX   r:   r:   r:   r:   r;   r]   R  r^   z9test_run_in_worker_thread_limiter_error.<locals>.<lambda>r/  r$  r*  c                     s    d S )Nr6   r:   r:   )dr:   r;   r]   [  r~   )rb   rc   rP   r   r   __context__
isinstancerV   )r1  bsr   r:   )r2  r9   r;   'test_run_in_worker_thread_limiter_errorD  s    r6  c                   s   ddd}|  tjjd| t }|jd	ksJ tt}t	d
d I d H  W d    n1 s2w   Y  dt
|jv s@J |jd	ksGJ d S )Nr(  objectr   r"   r   c                 W  s   t d)Nz!the engines canna take it captain)rd   )r(  r   r:   r:   r;   	bad_startd  s   z:test_run_in_worker_thread_fail_to_spawn.<locals>.bad_startstart_thread_soonr   c                   S  r\   rX   r:   r:   r:   r:   r;   r]   n  r^   z9test_run_in_worker_thread_fail_to_spawn.<locals>.<lambda>engines)r(  r7  r   r7  r"   r   )r   r   r   ThreadCacher   r  rb   rc   rd   r   r   r   )r   r8  r  r   r:   r:   r;   'test_run_in_worker_thread_fail_to_spawn`  s   
r<  c                    2   ddd} t  }t| I d H }||ksJ d S )Nr"   r   c                  S     t tj} | S rX   r   r   rY   callee_tokenr:   r:   r;   r   w     
z5test_trio_to_thread_run_sync_token.<locals>.thread_fnr"   r   r   rY   r   r   caller_tokenrA  r:   r:   r;   "test_trio_to_thread_run_sync_tokent  
   
rG  c                    sN   ddd} t jtdd t| I d H  W d    d S 1 s w   Y  d S )Nr"   r#   c                     r_   rX   r:   r:   r:   r:   r;   async_fn  ra   z=test_trio_to_thread_run_sync_expected_error.<locals>.async_fnzexpected a sync functionr   rB   )rb   rc   	TypeErrorr   rI  r:   r:   r;   +test_trio_to_thread_run_sync_expected_error  s
   
"rL  trio_test_contextvarzcontextvars.ContextVar[str]c                    s   t  } td ddd}t|I d H \}}|dksJ || ks$J ddd}t|I d H \}}}t }|dks=J |d	ksCJ |dksKJ d
t dksSJ d S )Nr   r"   tuple[str, threading.Thread]c                  S  sH   t  } ttj t  W d    n1 sw   Y  | t fS rX   )	rM  r   rb   rc   sniffioAsyncLibraryNotFoundErrorcurrent_async_libraryr1   r2   )r   r:   r:   r;   rA     s
   
z3test_trio_to_thread_run_sync_contextvars.<locals>.f!tuple[str, str, threading.Thread]c                  S  s\   t  } t d t  }ttj t  W d    n1 s"w   Y  | |t	 fS )Nworker)
rM  r   rv   rb   rc   rO  rP  rQ  r1   r2   )parent_valueinner_valuer:   r:   r;   r     s   

z3test_trio_to_thread_run_sync_contextvars.<locals>.grS  zRThe contextvar value set on the worker would not propagate back to the main threadtrio)r"   rN  )r"   rR  )r1   r2   rM  rv   r   r   rO  rQ  )rG   rA   r   rE   r   rT  rU  current_valuer:   r:   r;   (test_trio_to_thread_run_sync_contextvars  s    



rX  c                    s   ddd} t | I d H }t|tsJ ddd d fdd	}tjtd
d t |I d H  W d    d S 1 s:w   Y  d S )Nr"   floatc                  S  r>  rX   )r   r   current_time)	trio_timer:   r:   r;   thread_fn_1  rB  z3test_trio_from_thread_run_sync.<locals>.thread_fn_1r#   c                     r_   rX   r:   r:   r:   r:   r;   rI    ra   z0test_trio_from_thread_run_sync.<locals>.async_fnc                     s   t   d S rX   )r   r:   rK  r:   r;   thread_fn_2  r   z3test_trio_from_thread_run_sync.<locals>.thread_fn_2zexpected a synchronous functionr   )r"   rY  rB   )r   r4  rY  rb   rc   rJ  )r\  r[  r]  r:   rK  r;   test_trio_from_thread_run_sync  s   

"r^  c                    s   g dfdd d fdd} t | I d H  ddgks!J dd	d
}tjtdd t t|I d H  W d    d S 1 sAw   Y  d S )Nr"   r#   c                     s   t    d d S )Nback in trio)r   rZ  r0   r:   rL   r:   r;   back_in_trio_fn  s   z2test_trio_from_thread_run.<locals>.back_in_trio_fnc                     s    d t  d S )N	in thread)r0   r   r:   r`  r9   r:   r;   r     s   
z,test_trio_from_thread_run.<locals>.thread_fnra  r_  c                   S  r\   rX   r:   r:   r:   r:   r;   sync_fn     z*test_trio_from_thread_run.<locals>.sync_fnzappears to be synchronousr   rB   )r   rb   rc   rJ  r   )r   rc  r:   rb  r;   test_trio_from_thread_run  s   
"re  c                    r=  )Nr"   r   c                  S  r>  rX   r?  r@  r:   r:   r;   r     rB  z.test_trio_from_thread_token.<locals>.thread_fnrC  rD  rE  r:   r:   r;   test_trio_from_thread_token  rH  rf  c                    s4   ddd} t  }t| |I d H }||ksJ d S )NrZ   r   r"   c                 S  s   t tj| d}|S )Nr-   r?  )rZ   rA  r:   r:   r;   r     s   z4test_trio_from_thread_token_kwarg.<locals>.thread_fn)rZ   r   r"   r   rD  rE  r:   r:   r;   !test_trio_from_thread_token_kwarg  s
   
rg  c                     s<   t t ttj W d    d S 1 sw   Y  d S rX   rb   rc   rd   r   r   rZ  r:   r:   r:   r;   test_from_thread_no_token  s   "ri  c                    s   t d d	dd} t| I d H \}}}}}t  }||  kr&dks)J  J ||  kr9|  kr9dks<J  J t dksDJ |dksJJ d S )
Nr   r"   tuple[str, str, str, str, str]c                  S     t  } t d t  }ttj t  W d    n1 s"w   Y  ddd}t|\}}t  }ttj t  W d    n1 sKw   Y  | ||||fS )NrS  r"   tuple[str, str]c                  S  s2   t  } t d t  }t dksJ | |fS Nback_in_mainrV  rM  r   rv   rO  rQ  back_parent_valueback_current_valuer:   r:   r;   rn  
  s
   
zStest_trio_from_thread_run_sync_contextvars.<locals>.thread_fn.<locals>.back_in_mainr"   rl  )	rM  r   rv   rb   rc   rO  rP  rQ  r   )thread_parent_valuethread_current_valuern  rq  rr  thread_after_valuer:   r:   r;   r     $   



z=test_trio_from_thread_run_sync_contextvars.<locals>.thread_fnrS  rV  rn  r"   rj  rM  rv   r   r   rO  rQ  r   rt  ru  rv  rq  rr  rW  r:   r:   r;   *test_trio_from_thread_run_sync_contextvars   s   

 &r{  c                    s   t d d	dd} t| I d H \}}}}}t  }||  kr&dks)J  J ||  kr9|  kr9dks<J  J |dksBJ t dksJJ d S )
Nr   r"   rj  c                  S  rk  )NrS  r"   rl  c                    s4   t  } t d t  }t dksJ | |fS rm  ro  rp  r:   r:   r;   async_back_in_main5  s   
zTtest_trio_from_thread_run_contextvars.<locals>.thread_fn.<locals>.async_back_in_mainrs  )	rM  r   rv   rb   rc   rO  rP  rQ  r   )rt  ru  r|  rq  rr  rv  r:   r:   r;   r   .  rw  z8test_trio_from_thread_run_contextvars.<locals>.thread_fnrS  rn  rV  rx  ry  rz  r:   r:   r;   %test_trio_from_thread_run_contextvars+  s   

 &r}  c                   C  s>   t t ttjdd W d    d S 1 sw   Y  d S )NzNot TrioTokentyper-   rh  r:   r:   r:   r;   3test_run_fn_as_system_task_caught_badly_typed_tokenV  s   "r~  c                    sP   ddd} t  }tt t| |d W d    d S 1 s!w   Y  d S )Nr"   r#   c                   S  s   t  rX   )AssertionErrorr:   r:   r:   r;   
not_called_  s   z7test_from_thread_inside_trio_thread.<locals>.not_calledr-   rB   )r   rY   rb   rc   rd   r   )r  r*   r:   r:   r;   #test_from_thread_inside_trio_thread^  s   
"r  c                    sR   g g dfdd d fd
d} t | d t | d ddgks'J d S )NrZ   r+   r"   AsyncGenerator[None, None]c                  s  zId V  W t jdd5 zttttd| dI d H  W n t jy+    d Y nw  d W d    d S W d    d S 1 sDw   Y  d S t jdd3 zttttd| dI d H  W n t jyp    d Y nw  d W d    w W d    w 1 sw   Y  w )NTr   r   r-   r   clean)r   r
   r   r   r   r   RunFinishedErrorr0   r   rL   r:   r;   agenk  s4   0z2test_from_thread_run_during_shutdown.<locals>.agenuse_system_taskr   r#   c                   s4     | r
t nd  d d I d H  d S )Nr  )r0   r   rY   asend)r  )r  saver:   r;   r   y  s   z2test_from_thread_run_during_shutdown.<locals>.mainTFr   r  )rZ   r+   r"   r  )r  r   r"   r#   )r   rw   )r   r:   )r  r9   r  r;   $test_from_thread_run_during_shutdowng  s   r  c                    s6   t  } t| t jsJ t| }| | u sJ d S rX   )r   rY   r4  	TrioTokenweakrefref)rZ   weak_referencer:   r:   r;   "test_trio_token_weak_referenceable  s
   
r  c                    sT   G dd d} t t tt|  dI d H  W d    d S 1 s#w   Y  d S )Nc                   @  s   e Zd ZdddZdS )z4test_unsafe_abandon_on_cancel_kwarg.<locals>.BadBoolr"   r   c                 S  s   t rX   )NotImplementedError)r(  r:   r:   r;   __bool__  rd  z=test_unsafe_abandon_on_cancel_kwarg.<locals>.BadBool.__bool__Nr"   r   )r	  r
  r  r  r:   r:   r:   r;   BadBool  s    r  r   )rb   rc   r  r   rJ   )r  r:   r:   r;   #test_unsafe_abandon_on_cancel_kwarg  s
   "r  c                    sJ   t  } ddd}| ttt jI d H u sJ | tt|I d H u s#J d S )Nr"   
_core.Taskc                     s
   t  S rX   )r   current_taskr:   r:   r:   r;   async_current_task  s   z8test_from_thread_reuses_task.<locals>.async_current_task)r"   r  )r   r  r   r   r   )taskr  r:   r:   r;   test_from_thread_reuses_task  s
   
r  c                    s.   d  d fdd}  t | I d H ksJ d S )Nr"   rJ   c                     s   t   ttt jS rX   )r1   r   r   r   r:   tidr:   r;   get_tid_then_reenter  s   z6test_recursive_to_thread.<locals>.get_tid_then_reenter)r"   rJ   r   )r  r:   r  r;   test_recursive_to_thread  s   r  c                    s  t  d fdd} t  t| I d H  W d    n1 s#w   Y   jr-J  r3J t  t| ddI d H  W d    n1 sKw   Y   jsUJ ttjddI d H rcJ dd
dd fdd}t  t|I d H  W d    n1 sw   Y   jrJ  rJ t  t|ddI d H  W d    n1 sw   Y   jsJ ttjddI d H rJ d fdd}t  tt	|I d H  W d    n1 sw   Y   jsJ d S )Nr"   r#   c                     sF   t  j zt t W n tjy   d Y d S w d d S NTF)r   r   r   r   r   r   r:   )r   queuer:   r;   
sync_check  s   
z3test_from_thread_host_cancelled.<locals>.sync_checkTr   r   timeoutr   c                     s   dS NTr:   r:   r:   r:   r;   no_checkpoint  ra   z6test_from_thread_host_cancelled.<locals>.no_checkpointc                     sJ   t  j ztsJ W n tjy   d Y d S w d d S r  )r   r   r   r   r   r   r:   r   r  r  r:   r;   async_check  s   
z4test_from_thread_host_cancelled.<locals>.async_checkc                     sD       td t I d H  W d    d S 1 sw   Y  d S )Nr   )r   r   r   r:   r  r:   r;   async_time_bomb  s
   
"z8test_from_thread_host_cancelled.<locals>.async_time_bombrB   r  )
r   r   r   r
   r   r   
get_nowaitr   r   r   )r  r  r  r:   r  r;   test_from_thread_host_cancelled  s<   
	




	



r  c               	     sr  t  dfdd} d fd	d
g t  t 4 I d H 0}|| dt  t I d H  d dks;J j	dddksEJ  
  W d   I d H  n1 I d H sYw   Y  d dksfJ g t  t }t 4 I d H 2}|| d| t I d H  d dksJ j	dddksJ |   
  W d   I d H  n1 I d H sw   Y  |jsJ dv sJ d dksJ d fdd
g t  t }t 4 I d H (}|| d| t I d H  d dksJ |   
  W d   I d H  n1 I d H sw   Y  |jsJ dv s#J d dks,J j	dddks7J d S )Nr   r   r   r
   r"   r#   c              
     s   |3  d z&zt | dI d H W W  d W  d    S  tjy/    d  w  d w 1 s9w   Y  d S )Nr,   r   r   r   )r0   r   r   r   )r   r   r   r:   r;   r     s   


z/test_from_thread_check_cancelled.<locals>.childc                     sB   zt   W n tjy   d Y nw d    t  S Nr   Not Cancelled)r   r   r   r   r   r:   r   r   r:   r;   rA     s   

z+test_from_thread_check_cancelled.<locals>.fFr   r,   r   r  r  r   r   r  c                     sB       zt  W n tjy   d Y d S w d d S r  )r   r   r   r   r   r:   r  r:   r;   rA     s   
Tr   )r   r   r   r
   r"   r#   rB   )r   r   r1   r   r   r   r   r
   r   r   rv   r   r   )r   r   r   r:   )r   rA   r   r9   r;    test_from_thread_check_cancelled  sV   
(
(
	
*r  c                     s   t t t  W d    n1 sw   Y  t  tt fdd t t  jdd	  W d    d S 1 s?w   Y  d S )Nc                   s
     | S rX   )r   r|   r   r:   r;   r]   6  s   
 zLtest_from_thread_check_cancelled_raises_in_foreign_threads.<locals>.<lambda>r   r  )
rb   rc   rd   r   r   r   r   r9  r   unwrapr:   r:   r   r;   :test_from_thread_check_cancelled_raises_in_foreign_threads2  s   "r  c               
     s   ddd} t d; t 4 I d H }tdD ]}||  qW d   I d H  n1 I d H s0w   Y  W d    d S W d    d S 1 sHw   Y  d S )Nr"   r#   c                     s   	 t ttdddI d H  q)NTr   Fr   )r   r   r   r:   r:   r:   r;   r   A  s   z+test_reentry_doesnt_deadlock.<locals>.childr	      rB   )r   r   r   r   r   )r   r   r}   r:   r:   r;   test_reentry_doesnt_deadlock;  s   

*"r  c               	     s<  d t  } t  }t  }t  }ddd}d fd	d
}t 4 I d H n}||| | |||| t I d H  || t I d H   rGJ t dksNJ |   | I d H  t I d H   rcJ t dksjJ |  | I d H  t I d H   sJ t dksJ W d   I d H  d S 1 I d H sw   Y  d S )NFr   r   e_exitr"   r#   c                   s*   d fdd}t |I d H  |  d S )Nr"   r#   c                     s   t  j d S rX   )r   r   r:   r   r:   r;   rt   T  s   zCtest_wait_all_threads_completed.<locals>.wait_event.<locals>.threadrB   )r   rv   )r   r  rt   r:   r  r;   
wait_eventS  s   z3test_wait_all_threads_completed.<locals>.wait_eventc                     s   t  I d H  d d S r  )r   r:   no_threads_leftr:   r;   wait_no_threads_leftZ  s   z=test_wait_all_threads_completed.<locals>.wait_no_threads_leftr	   r   r   )r   r   r  r   r"   r#   rB   )r   r   r   r   r   r   rv   r   )e1e2	e1_exited	e2_exitedr  r  r   r:   r  r;   test_wait_all_threads_completedK  s6   

.r  c                     s    t  I d H  t dksJ d S )Nr   )r   r   r:   r:   r:   r;   *test_wait_all_threads_completed_no_threadsu  s   r  rB   rX   )r   r   r"   r   )r   r   r   r   r"   r#   )r  rJ   r   r   r  r   r"   r#   )r   r   r"   r#   )e
__future__r   contextvarsr  r   r   rg   r1   r   r  	functoolsr   typingr   r   r   r   rb   rO  r   r
   r   r   r   r   r   r   r   _core._tests.test_kir   _core._tests.tutilr   _threadsr   r   r   r   r   r   r   testingr   collections.abcr   r   r   outcomer   lowlevelr    listtupler   rC   r5   r3   rI   r!   r[   re   rx   r   r   r   r   r   r   r   r  markparametrizer!  r0  r6  r<  rG  rL  
ContextVarrM  r  rX  r^  re  rf  rg  ri  r{  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r:   r:   r:   r;   <module>   s    (
$	

<

0

.
#
	

<&
t



	

%





+
+

	






;
N	
*