o
    dTi                     @  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 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l/m0Z0 e1e2e3ej4e5e6 B f  Z7edZ8dzddZ9dzddZ:dzddZ;dzddZ<dzddZ=d{d|ddZ>dzd d!Z?dzd"d#Z@dzd$d%ZAdzd&d'ZBd}d,d-ZCejDEd.g d/ejDEd0d1d2gejDEd3d1d2gd~d6d7ZFdzd8d9ZGdzd:d;ZHdd<d=ZIdzd>d?ZJdzd@dAZKeLdBZMdCeNdB< dzdDdEZOdzdFdGZPdzdHdIZQdzdJdKZRdzdLdMZSdzdNdOZTdzdPdQZUdzdRdSZVdzdTdUZWdzdVdWZXdzdXdYZYdzdZd[ZZdzd\d]Z[dzd^d_Z\dzd`daZ]dzdbdcZ^ddkdlZ_ejDEdmd1d2gddndoZ`dzdpdqZadzdrdsZbedzdtduZcdzdvdwZddzdxdyZedS )    )annotationsNpartial)TYPE_CHECKINGNoReturnTypeVar   )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)    T/home/air/sos-pdf/back/venv/lib/python3.10/site-packages/trio/_tests/test_threads.pythreadfnA   s    z<test_do_in_trio_thread.<locals>.check_case.<locals>.threadfnT)targetdaemonyawn{Gz?r+   fr!   r"   )r0   Threadr+   is_aliver3   r   )r#   r%   r'   r)   r;   child_threadtrio_threadr7   r:   
check_case9   s   	z*test_do_in_trio_thread.<locals>.check_caser8   
RecordTypeintc                 S  s"   t  rJ | dt f dS )Nr@   r   )r   currently_ki_protectedr/   r0   r1   r8   r9   r9   r:   f1S      z"test_do_in_trio_thread.<locals>.f1)r-   r   r,   r   c                 S  s"   t  rJ | dt f tNr@   )r   rJ   r/   r0   r1   
ValueErrorrK   r9   r9   r:   f2Z   rM   z"test_do_in_trio_thread.<locals>.f2r.   c                   s2   t  rJ t  I d H  | dt f dS )Nr@      )r   rJ   
checkpointr/   r0   r1   rK   r9   r9   r:   f3a   
   z"test_do_in_trio_thread.<locals>.f3)r-   rQ   c                   s2   t  rJ t  I d H  | dt f trN   )r   rJ   rR   r/   r0   r1   KeyErrorrK   r9   r9   r:   f4i   rT   z"test_do_in_trio_thread.<locals>.f4N)
r#   r$   r%   r&   r'   r(   r)   r*   r!   r"   )r8   rH   r!   rI   )r8   rH   r!   r   )r0   r1   r   current_trio_tokenr   rO   r   rU   )rG   tokenrL   rP   rS   rV   r9   rE   r:   test_do_in_trio_thread6   s   



rZ   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 rW   r9   r9   r9   r9   r:   <lambda>t       z9test_do_in_trio_thread_from_trio_thread.<locals>.<lambda>r!   r"   c                        d S rW   r9   r9   r9   r9   r:   foov      z4test_do_in_trio_thread_from_trio_thread.<locals>.foorA   )pytestraisesRuntimeErrorr   r   )r_   r9   r9   r:   'test_do_in_trio_thread_from_trio_threadr   s   

"rd   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)r3   r   rJ   r   sysexc_info)rf   r9   r9   r:   trio_thread_fn   s   zTtest_run_in_trio_thread_ki.<locals>.check_run_in_trio_thread.<locals>.trio_thread_fnc                     s      d S rW   r9   r9   )rh   r9   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)r3   r   KeyboardInterruptaddr   r9   )r8   rY   ri   rh   r9   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donerA   )	r   rX   r0   rB   r+   r3   rC   r   join)ro   threadrK   )rY   ri   rh   r:   check_run_in_trio_thread   s   
z<test_run_in_trio_thread_ki.<locals>.check_run_in_trio_threadrk   rl   rA   )setr   run)rt   r9   rK   r:   test_run_in_trio_thread_ki}   s   
'rw   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 rW   )r   Abort	SUCCEEDED_r9   r9   r:   r\          zMtest_await_in_trio_thread_while_main_exits.<locals>.trio_fn.<locals>.<lambda>)r/   ru   r   wait_task_rescheduledr9   )evr8   r9   r:   trio_fn   s   
z;test_await_in_trio_thread_while_main_exits.<locals>.trio_fnrY   _core.TrioTokenc                   s4   z	t | d W d S  tjy    d Y d S w )Nr,   	cancelled)r   r   	Cancelledr/   rY   )r8   r   r9   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<   argsrx   )r   rX   r0   rB   r+   wait)rY   rs   )r   r8   r   r9   r:   main   s   z8test_await_in_trio_thread_while_main_exits.<locals>.mainrx   r   rA   )rY   r   r!   r"   )r!   r   )r   r   rv   rr   )r   rs   r9   )r   r8   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 rW   )r0   r1   r   r   r9   r9   r:   r      s   z test_named_thread.<locals>.innerCallable[[], threading.Thread]c                   
   t  | S rW   r   r   r   r9   r:   r@         
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   rs   r@   r9   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   r9   r@   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	Exceptionr3   rf   platformgetattrc_void_pc_char_pc_size_targtypesc_intrestypecreate_string_bufferr0   	get_identvaluedecodeUnicodeDecodeErrorra   fail)r   r   libpthread_path
libpthreadr   name_bufferer9   r9   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   rf   r   ra   skipr0   r1   )r   os_thread_namer9   r9   r:   r     s   z#test_named_thread_os.<locals>.innerr   c                   r   rW   r   r   r   r9   r:   r@     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'   rs   r   r   r9   r:   r   '  s   
z.test_named_thread_os.<locals>.test_thread_namer   r   r   r   ?)r'   r   r   rW   )r   r   r'   r   r!   r"   r   )defaultr   r9   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   rf   r   ra   r   )r   kr9   r9   r:   test_has_pthread_setname_np7  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 )Nr5   r    r!   tuple[T, threading.Thread]c                 S  s   | t  fS rW   )r0   r1   )r5   r9   r9   r:   r@   C     z$test_run_in_worker_thread.<locals>.f   r   c                   S  s   t t rW   )rO   r0   r1   r9   r9   r9   r:   gJ  r   z$test_run_in_worker_thread.<locals>.gz1^<Thread\(Trio thread \d+, started daemon \d+\)>$r   r   )r5   r    r!   r   )r!   r   )	r0   r1   r   ra   rb   rO   r3   r   r   )rF   r@   r5   rD   r   excinfor9   r9   r:   test_run_in_worker_thread@  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   )registerr9   r:   r@   Y  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)r/   r   )r   r   )r@   r8   r9   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	   rangerR   cancelled_caught)r   r   nurseryr|   scoper9   )r@   r8   r   r:   &test_run_in_worker_thread_cancellationV  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 rW   )r   r   r0   r1   r9   )q1q2r9   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   r9   r   r9   r:   r     s   z@test_run_in_worker_thread_abandoned.<locals>.main.<locals>.childrA   )r   r   r   r   r   r   )r   r   r   r9   r:   r     s   
.z1test_run_in_worker_thread_abandoned.<locals>.mainzException in threadrA   )setattrr   _thread_cacher   r   rv   r   r   rC   r   r   
readouterr)r   r   r   rs   outerrr9   )r   r   r   r:   #test_run_in_worker_thread_abandoned  s   
	

r  MAX)rQ      r   r   FTuse_default_limiterrI   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>.staterI   ran
high_waterrj   parkedN)__name__
__module____qualname____annotations__r9   r9   r9   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)	r3   r   r   r  rj   maxr  r  r   r   )gatelockr  rY   r9   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   r3   r   ru   )r  r   )r   limiter_argr   r9   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"   )r0   r   Lockr   total_tokensr
   r  r  rj   r  r   rX   r   r3   r   r/   r   r   r   
statisticstasks_waitingr   ru   borrowed_tokens)
r  r   r  COUNTcorig_total_tokensr  r   eventsr|   r9   )r   r  r  r  r  r   rY   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r/   	_borrowerselfr!  rK   r9   r:   acquire_on_behalf_of5  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&  rK   r9   r:   release_on_behalf_of9  s   
zTtest_run_in_worker_thread_custom_limiter.<locals>.CustomLimiter.release_on_behalf_ofNr!  r   r!   r"   r  r	  r
  r(  r*  r9   rK   r9   r:   CustomLimiter4  s    r-  c                   S  r[   rW   r9   r9   r9   r9   r:   r\   ?  r]   z:test_run_in_worker_thread_custom_limiter.<locals>.<lambda>r  r#  r)  r   )r-  r9   rK   r:   (test_run_in_worker_thread_custom_limiter/  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 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"  )r/   r&  rK   r9   r:   r(  G  s   zXtest_run_in_worker_thread_limiter_error.<locals>.BadCapacityLimiter.acquire_on_behalf_ofr   c                   s     d td)Nr)  zrelease on behalf)r/   rO   r&  rK   r9   r:   r*  J  s   
zXtest_run_in_worker_thread_limiter_error.<locals>.BadCapacityLimiter.release_on_behalf_ofNr+  )r!  r   r!   r   r,  r9   rK   r9   r:   BadCapacityLimiterF  s    r0  z^release on behalf$r   c                   S  r[   rW   r9   r9   r9   r9   r:   r\   Q  r]   z9test_run_in_worker_thread_limiter_error.<locals>.<lambda>r.  r#  r)  c                     s    d S )Nr5   r9   r9   )dr9   r:   r\   Z  r}   )ra   rb   rO   r   r   __context__
isinstancerU   )r0  bsr   r9   )r1  r8   r:   'test_run_in_worker_thread_limiter_errorC  s    r5  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)rc   )r'  r   r9   r9   r:   	bad_startc  s   z:test_run_in_worker_thread_fail_to_spawn.<locals>.bad_startstart_thread_soonr   c                   S  r[   rW   r9   r9   r9   r9   r:   r\   m  r]   z9test_run_in_worker_thread_fail_to_spawn.<locals>.<lambda>engines)r'  r6  r   r6  r!   r   )r   r   r   ThreadCacher   r  ra   rb   rc   r   r   r   )r   r7  r  r   r9   r9   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 rW   r   r   rX   callee_tokenr9   r9   r:   r   v     
z5test_trio_to_thread_run_sync_token.<locals>.thread_fnr!   r   r   rX   r   r   caller_tokenr@  r9   r9   r:   "test_trio_to_thread_run_sync_tokens  
   
rF  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^   rW   r9   r9   r9   r9   r:   async_fn  r`   z=test_trio_to_thread_run_sync_expected_error.<locals>.async_fnzexpected a sync functionr   rA   )ra   rb   	TypeErrorr   rH  r9   r9   r:   +test_trio_to_thread_run_sync_expected_error  s
   
"rK  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 rW   )	rL  r   ra   rb   sniffioAsyncLibraryNotFoundErrorcurrent_async_libraryr0   r1   )r   r9   r9   r:   r@     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)
rL  r   ru   ra   rb   rN  rO  rP  r0   r1   )parent_valueinner_valuer9   r9   r:   r     s   

z3test_trio_to_thread_run_sync_contextvars.<locals>.grR  zRThe contextvar value set on the worker would not propagate back to the main threadtrio)r!   rM  )r!   rQ  )r0   r1   rL  ru   r   r   rN  rP  )rF   r@   r   rD   r   rS  rT  current_valuer9   r9   r:   (test_trio_to_thread_run_sync_contextvars  s    



rW  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=  rW   )r   r   current_time)	trio_timer9   r9   r:   thread_fn_1  rA  z3test_trio_from_thread_run_sync.<locals>.thread_fn_1r"   c                     r^   rW   r9   r9   r9   r9   r:   rH    r`   z0test_trio_from_thread_run_sync.<locals>.async_fnc                     s   t   d S rW   )r   r9   rJ  r9   r:   thread_fn_2  r   z3test_trio_from_thread_run_sync.<locals>.thread_fn_2zexpected a synchronous functionr   )r!   rX  rA   )r   r3  rX  ra   rb   rI  )r[  rZ  r\  r9   rJ  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   rY  r/   r9   rK   r9   r:   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   r9   r_  r8   r9   r:   r     s   
z,test_trio_from_thread_run.<locals>.thread_fnr`  r^  c                   S  r[   rW   r9   r9   r9   r9   r:   sync_fn     z*test_trio_from_thread_run.<locals>.sync_fnzappears to be synchronousr   rA   )r   ra   rb   rI  r   )r   rb  r9   ra  r:   test_trio_from_thread_run  s   
"rd  c                    r<  )Nr!   r   c                  S  r=  rW   r>  r?  r9   r9   r:   r     rA  z.test_trio_from_thread_token.<locals>.thread_fnrB  rC  rD  r9   r9   r:   test_trio_from_thread_token  rG  re  c                    s4   ddd} t  }t| |I d H }||ksJ d S )NrY   r   r!   c                 S  s   t tj| d}|S )Nr,   r>  )rY   r@  r9   r9   r:   r     s   z4test_trio_from_thread_token_kwarg.<locals>.thread_fn)rY   r   r!   r   rC  rD  r9   r9   r:   !test_trio_from_thread_token_kwarg  s
   
rf  c                     s<   t t ttj W d    d S 1 sw   Y  d S rW   ra   rb   rc   r   r   rY  r9   r9   r9   r:   test_from_thread_no_token  s   "rh  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 )NrR  r!   tuple[str, str]c                  S  s2   t  } t d t  }t dksJ | |fS Nback_in_mainrU  rL  r   ru   rN  rP  back_parent_valueback_current_valuer9   r9   r:   rm  	  s
   
zStest_trio_from_thread_run_sync_contextvars.<locals>.thread_fn.<locals>.back_in_mainr!   rk  )	rL  r   ru   ra   rb   rN  rO  rP  r   )thread_parent_valuethread_current_valuerm  rp  rq  thread_after_valuer9   r9   r:   r     $   



z=test_trio_from_thread_run_sync_contextvars.<locals>.thread_fnrR  rU  rm  r!   ri  rL  ru   r   r   rN  rP  r   rs  rt  ru  rp  rq  rV  r9   r9   r:   *test_trio_from_thread_run_sync_contextvars  s   

 &rz  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!   ri  c                  S  rj  )NrR  r!   rk  c                    s4   t  } t d t  }t dksJ | |fS rl  rn  ro  r9   r9   r:   async_back_in_main4  s   
zTtest_trio_from_thread_run_contextvars.<locals>.thread_fn.<locals>.async_back_in_mainrr  )	rL  r   ru   ra   rb   rN  rO  rP  r   )rs  rt  r{  rp  rq  ru  r9   r9   r:   r   -  rv  z8test_trio_from_thread_run_contextvars.<locals>.thread_fnrR  rm  rU  rw  rx  ry  r9   r9   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,   rg  r9   r9   r9   r:   3test_run_fn_as_system_task_caught_badly_typed_tokenU  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  rW   )AssertionErrorr9   r9   r9   r:   
not_called^  s   z7test_from_thread_inside_trio_thread.<locals>.not_calledr,   rA   )r   rX   ra   rb   rc   r   )r  r)   r9   r9   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 )NrY   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   RunFinishedErrorr/   r   rK   r9   r:   agenj  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  )r/   r   rX   asend)r  )r  saver9   r:   r   x  s   z2test_from_thread_run_during_shutdown.<locals>.mainTFr   r  )rY   r*   r!   r  )r  r   r!   r"   )r   rv   )r   r9   )r  r8   r  r:   $test_from_thread_run_during_shutdownf  s   r  c                    s6   t  } t| t jsJ t| }| | u sJ d S rW   )r   rX   r3  	TrioTokenweakrefref)rY   weak_referencer9   r9   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 rW   )NotImplementedError)r'  r9   r9   r:   __bool__  rc  z=test_unsafe_abandon_on_cancel_kwarg.<locals>.BadBool.__bool__Nr!   r   )r  r	  r
  r  r9   r9   r9   r:   BadBool  s    r  r   )ra   rb   r  r   rI   )r  r9   r9   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 rW   )r   current_taskr9   r9   r9   r:   async_current_task  s   z8test_from_thread_reuses_task.<locals>.async_current_task)r!   r  )r   r  r   r   r   )taskr  r9   r9   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!   rI   c                     s   t   ttt jS rW   )r0   r   r   r   r9   tidr9   r:   get_tid_then_reenter  s   z6test_recursive_to_thread.<locals>.get_tid_then_reenter)r!   rI   r   )r  r9   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   r9   )r   queuer9   r:   
sync_check  s   
z3test_from_thread_host_cancelled.<locals>.sync_checkTr   r   timeoutr   c                     s   dS NTr9   r9   r9   r9   r:   no_checkpoint  r`   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   r9   r   r  r  r9   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   r9   r  r9   r:   async_time_bomb  s
   
"z8test_from_thread_host_cancelled.<locals>.async_time_bombrA   r  )
r   r   r   r	   r   r   
get_nowaitr   r   r   )r  r  r  r9   r  r:   test_from_thread_host_cancelled  s<   
	




	



r  r   r   r	   r8   	list[str]r@   Callable[[], None]c                   s   |: | d z-zt|| dI d H W W | d W  d    S  tjy6 } z| t|  d }~ww | d w 1 s@w   Y  d S r   )r/   r   r   r   r   )r   r   r8   r@   r   r9   r9   r:   r     s   

r   cancel_the_scopec              	     s"  t  d fdd}g }t  t }t 4 I d H 6}|td||| t	 I d H  |d dks7J j
dd	d
ksAJ | rG|     W d   I d H  n1 I d H s[w   Y  | sl|d dksjJ d S |jsqJ td|d sJ |d |d dksJ t|dksJ d S )Nr!   r"   c               
     sX   zt   W n tjy }  zt|  W Y d } ~ n
d } ~ ww d    t  S NNot Cancelled)r   r   r   r   r   r   r   r   r   r9   r:   r@     s   

z6test_from_thread_check_cancelled_no_abandon.<locals>.fFr   r+   r   r  r  r   zzcancelled due to explicit from task <Task 'trio._tests.test_threads.test_from_thread_check_cancelled_no_abandon' at 0x\w*>r   rQ   rA   )r   r   r0   r   r   r	   r   r   r   r   r   r   ru   r   r   	fullmatchlen)r  r@   r8   r   r   r9   r  r:   +test_from_thread_check_cancelled_no_abandon  s4   

(	
r  c               	     s  t  d fdd} g }t  t }t 4 I d H &}|td|||  t	 I d H  |d dks7J |
  W d   I d H  n1 I d H sKw   Y     |jsYJ td|d	 sgJ |d	 |d
 dksoJ jd	d}t|tr||td|sJ |d S )Nr!   r"   c               
     s       zt  W n2 tjy$ }  zt|  W Y d } ~ d S d } ~ w ty; }  z|  W Y d } ~ d S d } ~ ww d d S r  )r   r   r   r   r   r   r2   r  r  r9   r:   r@   %  s   
z=test_from_thread_check_cancelled_abandon_on_cancel.<locals>.fTr   r+   zcancelled due to explicit from task <Task 'trio._tests.test_threads.test_from_thread_check_cancelled_abandon_on_cancel' at 0x\w*>r   r  r   r  rA   )r   r   r0   r   r   r	   r   r   r   r   r   ru   r   r   r  r   r3  r2   )r@   r8   r   r   resr9   r  r:   2test_from_thread_check_cancelled_abandon_on_cancel   s<   
(

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 rW   )r   r{   r   r9   r:   r\   T  s   
 zLtest_from_thread_check_cancelled_raises_in_foreign_threads.<locals>.<lambda>r   r  )
ra   rb   rc   r   r   r   r   r8  r   unwrapr9   r9   r   r:   :test_from_thread_check_cancelled_raises_in_foreign_threadsP  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   r9   r9   r9   r:   r   _  s   z+test_reentry_doesnt_deadlock.<locals>.childr      rA   )r   r   r   r   r   )r   r   r|   r9   r9   r:   test_reentry_doesnt_deadlockY  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 rW   )r   r   r9   r  r9   r:   rs   r  s   zCtest_wait_all_threads_completed.<locals>.wait_event.<locals>.threadrA   )r   ru   )r   r  rs   r9   r  r:   
wait_eventq  s   z3test_wait_all_threads_completed.<locals>.wait_eventc                     s   t  I d H  d d S r  )r   r9   no_threads_leftr9   r:   wait_no_threads_leftx  s   z=test_wait_all_threads_completed.<locals>.wait_no_threads_leftr   r   r   )r   r   r  r   r!   r"   rA   )r   r   r   r   r   r   ru   r   )e1e2	e1_exited	e2_exitedr  r  r   r9   r  r:   test_wait_all_threads_completedi  s6   

.r  c                     s    t  I d H  t dksJ d S )Nr   )r   r   r9   r9   r9   r:   *test_wait_all_threads_completed_no_threads  s   r  rA   rW   )r   r   r!   r   )r   r   r   r   r!   r"   )r  rI   r   r   r  r   r!   r"   )r   r   r!   r"   )
r   r   r   r	   r8   r  r@   r  r!   r"   )r  r   r!   r"   )f
__future__r   contextvarsr  r   r   rf   r0   r   r  	functoolsr   typingr   r   r   ra   rN  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   rB   r4   r2   rH   r    rZ   rd   rw   r   r   r   r   r   r   r   r  markparametrizer   r/  r5  r;  rF  rK  
ContextVarrL  r  rW  r]  rd  re  rf  rh  rz  r|  r}  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r9   r9   r9   r:   <module>   s    (
$	

<

0

.
#
	

<&
t



	

%





+
+

	






;
+
0	
*