U
    &%e                    @  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	m
Z
 d dlmZmZ d dlmZ d dlmZmZ d dlmZ d dlmZmZ d d	l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# d dl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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: d dl;m<Z< d dl=Z=ddl>m?Z?m@Z@mAZAmBZB ddlCmDZDmEZE ddlFmGZGmHZH ddlImJZJmKZKmLZLmMZMmNZN ddlImOZP ddlQmRZRmSZS ddlTmUZV ddlTmWZX ddlTmYZY ddlZm[Z\ ddlBm]Z]m^Z^ ddl_m`Z` ejadkr4d d!d"d#d$Zbnd d!d"d%d$Zbd d&lmcZcmdZdmeZemfZf d d'lmgZh d d(d"d)d*Zie8d+Zje8d,d-d.Zkelejmd/Zne`d0Zod1epd0< d d2d3d4Zqd5d6d7d8d9Zre< ZsefZtd d:d"d;d<Zud=d:d>d?d@dAZvdBdBddCdDdEd:d:d=d+dFdGdHZgejwZwejxZxG dIdJ dJe\Z[d>d2dKdLZyd>d2dMdNZzd>d2dOdPZ{dQd2dRdSZ|dQd2dTdUZ}G dVdW dWZ~e< ZG dXdY dYePZOG dZd[ d[eBjZG d\d] d]eBjZe7e5ej e5e f ZG d^d_ d_e'Ze`d`Zdaepd`< e`dbZdcepdb< dBddddedEd:dfd+dgdhdiZddjdedEdkd+dldmdnZdDdEd+dodpdqZG drds dseBjZedBdtG dudv dveBjZedBdtG dwdx dxeBjZedBdtG dydz dzeBjZdddBd{d|d:d}d}d}d~dd:dzd	ddZddEd>dddZdd>dddZdd>dddZG dd dejZG dd dejZG dd deBjZG dd deBjZG dd deBjZG dd deBjZG dd deBjZG dd deBjZdd6ddddddZd6ddddZdddd:ddddZd d d d dddddddddddZdddddddZe`dZdepd< e`dZdepd< dd>dddZdd>dddZG ddĄ deXZWG ddƄ deVZUe`dǃZdepd< dd2ddʄZG dd̄ deDd Zddd͜ddτZd dd"dd҄Zdd2ddԄZdd2ddׄZd>d2ddلZG ddۄ deBjZdS )    )annotationsN)_run_until_complete_cb)OrderedDictdeque)Future)Contextcopy_context)	dataclass)partialwraps)CORO_RUNNINGCORO_SUSPENDEDGEN_RUNNINGGEN_SUSPENDEDgetcoroutinestategetgeneratorstate)IOBase)PathLike)Queue)AddressFamily
SocketKind)Thread)TracebackType)IOAnyAsyncGenerator	AwaitableCallable
Collection	Coroutine	GeneratorIterableMappingOptionalSequenceTupleTypeVarUnioncast)WeakKeyDictionary   )CapacityLimiterStatisticsEventStatisticsTaskInfoabc)DeprecatedAsyncContextManagerDeprecatedAwaitable)claim_worker_threadthreadlocals)BrokenResourceErrorBusyResourceErrorClosedResourceErrorEndOfStream
WouldBlock)ExceptionGroup)GetAddrInfoReturnTypeconvert_ipv6_sockaddr)CapacityLimiter)Event)ResourceGuard)CancelScope)IPSockAddrTypeUDPPacketType)RunVar      asyncio.TaskzGenerator | Awaitable[Any])taskreturnc                 C  s   |   S N)get_cororF    rK   W/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/anyio/_backends/_asyncio.pyrI   H   s    rI   c                 C  s   | j S rH   )_cororJ   rK   rK   rL   rI   M   s    )	all_taskscreate_taskcurrent_taskget_running_loop)runzIterable[Callable]c                 C  s   dd | j D S )Nc                 S  s   g | ]\}}|qS rK   rK   ).0cbcontextrK   rK   rL   
<listcomp>V   s     z'_get_task_callbacks.<locals>.<listcomp>)
_callbacksrJ   rK   rK   rL   _get_task_callbacksU   s    rX   T_RetvalT_contraT)contravariantget_name
_root_taskzRunVar[asyncio.Task | None]rG   c                  C  s   t d } | d k	r|  s| S t D ]N}|jr$| s$t|D ]2}|tksZt|dd dkr>t | |    S q>q$t	t
jt }t|}|r|j}|r|jd k	r|j}q|d k	rt	t
j|jS |S )N
__module__zuvloop.loop)r]   getdonerN   rW   rX   r   getattrsetr(   asyncioTaskrP   _task_statescancel_scope_parent_scope
_host_task)	root_taskrF   rT   staterg   rK   rK   rL   find_root_taskc   s*    



rl   r   str)funcrG   c                 C  s0   t | dd }t | dd }ddd ||fD S )Nr_   __qualname__.c                 S  s   g | ]}|r|qS rK   rK   )rS   xrK   rK   rL   rV      s      z%get_callable_name.<locals>.<listcomp>)rb   join)rn   modulequalnamerK   rK   rL   get_callable_name   s    ru   boolc                 C  s   t ttttf t| }zt|ttfkW S  tk
r   ztt t	|t
tfkW  Y S  tk
rz   td|  dY nX Y nX dS )zBReturn ``True`` if the task has been started and has not finished.zCannot determine if task z has started or notN)r(   r   r   rI   r   r   r   AttributeErrorr   r    r   r   	Exception)rF   cororK   rK   rL   _task_started   s    rz   &asyncio.AbstractEventLoopPolicy | NoneNone)policy
use_uvlooprG   c                 C  sr   | d kr\|r\t jjdkr\zdd l}W n tk
r8   Y n$X ttjdrTt|jj	dr\|
 } | d k	rnt|  d S )Ncpythonr   Zshutdown_default_executor)sysimplementationnameuvloopImportErrorhasattrrd   AbstractEventLooploopZLoopZEventLoopPolicyset_event_loop_policy)r}   r~   r   rK   rK   rL   _maybe_set_event_loop_policy   s     r   Fdebugr~   r}   z"Callable[..., Awaitable[T_Retval]]object)rn   argsr   r~   r}   rG   c                  s4   t dd fdd}t|| t| |dS )NrY   r^   c                    sV   t tjt } td td }|t| < tr6| |j	 z  I d H W S t| = X d S rH   )
r(   rd   re   rP   	TaskStateru   rf   _native_task_namesset_namer   )rF   
task_stater   rn   rK   rL   wrapper   s    zrun.<locals>.wrapper)r   )r   r   
native_run)rn   r   r~   r}   r   r   rK   r   rL   rR      s    
rR   c                   @  s  e Zd Zejddddd dddZejdfddddd	Zd d
ddZdddddddZdd
ddZ	dd
ddZ
dd
ddZdd
ddZdd
ddZdd
d d!Zedd
d"d#Zejddd$d%d#Zedd
d&d'Zedd
d(d)Zejddd$d*d)Zd+S ),r>   F)deadlineshieldfloatrv   )r   r   rG   c                C  s
   t | S rH   r   __new__)clsr   r   rK   rK   rL   r      s    zCancelScope.__new__c                 C  sH   || _ || _d | _d| _d| _d | _d | _t | _d | _	d| _
d| _d S )NFr   )	_deadline_shieldrh   _cancel_called_active_timeout_handle_cancel_handlerc   _tasksri   _timeout_expired_cancel_calls)selfr   r   rK   rK   rL   __init__   s    zCancelScope.__init__r^   c                 C  s   | j rtdttjt  | _}| j| zt	| }W n8 t
k
rr   trV| nd }td || }|t	|< Y nX |j| _| |_|   d| _ | jr|   | S )Nz;Each CancelScope may only be used for a single 'with' blockT)r   RuntimeErrorr(   rd   re   rP   ri   r   addrf   KeyErrorr   r\   r   rg   rh   _timeoutr   _deliver_cancellation)r   Z	host_taskr   Z	task_namerK   rK   rL   	__enter__   s&    zCancelScope.__enter__type[BaseException] | NoneBaseException | NoneTracebackType | Nonebool | Noneexc_typeexc_valexc_tbrG   c                 C  s   | j stdt | jk	r"td| jd k	s0tt| j}|d ksN|j| k	rVtdd| _ | jrr| j	  d | _| j
| j | j|_| jr|   |d k	rt|tr|jn|g}tdd |D r| jr|  S | jsd S |  s|  S d S )NzThis cancel scope is not activezIAttempted to exit cancel scope in a different task than it was entered inzTAttempted to exit a cancel scope that isn't the current tasks's current cancel scopeFc                 s  s   | ]}t |tV  qd S rH   )
isinstanceCancelledError)rS   excrK   rK   rL   	<genexpr>3  s     z'CancelScope.__exit__.<locals>.<genexpr>)r   r   rP   ri   AssertionErrorrf   r`   rg   r   cancelr   removerh   r   _deliver_cancellation_to_parentr   r8   
exceptionsallr   	_uncancelr   _parent_cancelled)r   r   r   r   Zhost_task_stater   rK   rK   rL   __exit__  s>    
zCancelScope.__exit__c                 C  sJ   t jdk s| jd krd| _dS t| jD ]}| j  q(d| _| j  S )N)rC      r   T)r   version_infori   r   rangeZuncancel
cancelling)r   irK   rK   rL   r   ?  s    zCancelScope._uncancelr|   c                 C  sF   | j tjkrBt }| | j kr0d| _|   n|| j | j| _	d S NT)
r   mathinfrQ   timer   r   call_atr   r   )r   r   rK   rK   rL   r   K  s    
zCancelScope._timeoutc                 C  s   d}t  }| jD ]l}|jrqt| j}|| k	rH|dks||jr@qq&|j}q&d}||k	r|| jksft|r|  j	d7  _	|
  q|rt | j| _nd| _dS )z
        Deliver cancellation to directly contained tasks and nested cancel scopes.

        Schedule another run at the end if we still have tasks eligible for cancellation.
        FNT   )rP   r   _must_cancelrf   rg   r   rh   ri   rz   r   r   rQ   	call_soonr   r   )r   Zshould_retrycurrentrF   rg   rK   rK   rL   r   T  s.    


z!CancelScope._deliver_cancellationc                 C  sJ   | j }d}|dk	r6|jr&|jdkr&|}|jr.q6|j }q
|dk	rF|  dS )zIStart cancellation effort in the farthest directly cancelled parent scopeN)rh   r   r   r   r   )r   scopeZscope_to_cancelrK   rK   rL   r   x  s    z+CancelScope._deliver_cancellation_to_parentc                 C  s*   | j }|d k	r&|js&|jrdS |j }qdS )NTF)rh   r   r   )r   rg   rK   rK   rL   r     s    zCancelScope._parent_cancelledr0   c                 C  s>   | j s4| jr| j  d | _d| _ | jd k	r4|   t| jS r   )r   r   r   ri   r   r0   r   rK   rK   rL   r     s    

zCancelScope.cancelc                 C  s   | j S rH   )r   r   rK   rK   rL   r     s    zCancelScope.deadlinevaluerG   c                 C  s<   t || _| jd k	r$| j  d | _| jr8| js8|   d S rH   )r   r   r   r   r   r   r   r   r   rK   rK   rL   r     s    


c                 C  s   | j S rH   )r   r   rK   rK   rL   cancel_called  s    zCancelScope.cancel_calledc                 C  s   | j S rH   )r   r   rK   rK   rL   r     s    zCancelScope.shieldc                 C  s    | j |kr|| _ |s|   d S rH   )r   r   r   rK   rK   rL   r     s    
N)__name__r_   ro   r   r   r   r   r   r   r   r   r   r   r   r   propertyr   setterr   r   rK   rK   rK   rL   r>      s,    4	$	r>   c                     s   t dI d H  d S Nr   )sleeprK   rK   rK   rL   
checkpoint  s    r   c                    sh   t  } | d krd S zt|  j}W n tk
r6   Y d S X |rd|jrRtdI d H  q8|jr\qdq8|j}q8d S r   )rP   rf   rg   r   r   r   r   rh   )rF   rg   rK   rK   rL   checkpoint_if_cancelled  s    r   c                	     s(   t dd tdI d H  W 5 Q R X d S )NTr   r   )r>   r   rK   rK   rK   rL   cancel_shielded_checkpoint  s    r   r   c                  C  sj   zt t  j} W n tk
r*   tj Y S X tj}| rft|| j}| jrTtj }qfq2| j	r^qfq2| j
} q2|S rH   )rf   rP   rg   r   r   r   minr   r   r   rh   )rg   r   rK   rK   rL   current_effective_deadline  s    r   c                   C  s
   t   S rH   )rQ   r   rK   rK   rK   rL   current_time  s    r   c                   @  s&   e Zd ZdZdZddddddZdS )	r   z
    Encapsulates auxiliary task information that cannot be added to the Task instance itself
    because there are no guarantees about its implementation.
    	parent_idr   rg   
int | Nonez
str | NoneCancelScope | Nonec                 C  s   || _ || _|| _d S rH   r   )r   r   r   rg   rK   rK   rL   r     s    zTaskState.__init__N)r   r_   ro   __doc__	__slots__r   rK   rK   rK   rL   r     s   r   c                      s"   e Zd Zdd fddZ  ZS )r8   list[BaseException])r   c                   s   t    || _d S rH   )superr   r   r   r   	__class__rK   rL   r     s    
zExceptionGroup.__init__)r   r_   ro   r   __classcell__rK   rK   r   rL   r8     s   r8   c                   @  s.   e Zd ZdddddZdddd	d
dZdS )_AsyncioTaskStatusasyncio.Futureint)futurer   c                 C  s   || _ || _d S rH   )_future
_parent_id)r   r   r   rK   rK   rL   r     s    z_AsyncioTaskStatus.__init__NzT_contra | Noner|   r   c                 C  sP   z| j | W n  tjk
r0   tdd Y nX ttjt }| jt	| _
d S )Nz.called 'started' twice on the same task status)r   
set_resultrd   InvalidStateErrorr   r(   re   rP   r   rf   r   )r   r   rF   rK   rK   rL   started  s    z_AsyncioTaskStatus.started)N)r   r_   ro   r   r   rK   rK   rK   rL   r     s   r   c                   @  s   e Zd ZddddZd dddZddd	d
dddZedddddZddddddZd&ddddddddZ	dd ddddd!d"d#Z
dd ddddd!d$d%ZdS )'	TaskGroupr|   r^   c                 C  s   t  | _d| _g | _d S )NF)r>   rg   r   _exceptionsr   rK   rK   rL   r   *  s    zTaskGroup.__init__c                   s   | j   d| _| S r   )rg   r   r   r   rK   rK   rL   
__aenter__/  s    
zTaskGroup.__aenter__r   r   r   r   r   c              
     s  | j |||}|d k	r.| j   | j| | j jrrzt| j jI d H  W q. tjk
rn   | j   Y q.X q.d| _	| j 
 s| | j}n| j}zJt|dkrtdd |D rtqt|n|r|d |k	r|d W n, tk
r } zd |_ W 5 d }~X Y nX |S )NFr   c                 s  s    | ]}t |to|j V  qd S rH   )r   r   r   )rS   erK   rK   rL   r   M  s    z&TaskGroup.__aexit__.<locals>.<genexpr>r   )rg   r   r   r   appendr   rd   waitr   r   r   _filter_cancellation_errorslenr   r8   BaseException__context__)r   r   r   r   Zignore_exceptionr   r   rK   rK   rL   	__aexit__4  s4    


zTaskGroup.__aexit__zSequence[BaseException]r   )r   rG   c                 C  s   g }| D ]}t |trt|j}t|dkr:|| qt|dkrV||d  q|rt|}|j|_|j|_|j	|_	|| qt |t
r|jr|| q|S Nr   r   )r   r8   r   r   r   r   r   	__cause__r   __traceback__r   r   )r   Zfiltered_exceptionsr   Znew_exceptionsnew_excrK   rK   rL   r   ^  s"    
z%TaskGroup._filter_cancellation_errorsr   asyncio.Future | None)ry   task_status_futurerG   c              
     s   d }}t tjt }zz|I d H  W nT tk
rz } z6|d ksH|	 r`| j
| | j  n
|| W 5 d }~X Y n X |d k	r|	 s|td W 5 || jjkr| jj| t|= X d S )NT2Child exited without calling task_status.started())r(   rd   re   rP   rg   r   r   rf   r   ra   r   r   r   set_exceptionr   )r   ry   r  Z__traceback_hide__Z__tracebackhide__rF   r   rK   rK   rL   _run_wrapped_tasku  s     zTaskGroup._run_wrapped_taskNzCallable[..., Awaitable[Any]]tupler   rE   )rn   r   r   r  rG   c                   s"  ddd fdd} j s$tdi }|d kr8t|nt|}trL||d< i }rvtt }tt jj	|d< nt jj	}|||}	t
|	std	| d
t|	d ot|	d }
|
stjdk r؈ |	}	t|	f|}|
stjdkr|| t|| jdt|<  jj| |S )NrE   r|   )_taskrG   c              
     s   |  j jkst j j|  t| = z|  }W n: tk
rj } zt|jtrV|j}qB|}W 5 d }~X Y nX |d k	rd ks	 r j
|  j   qƈ| nd k	rƈ	 sƈtd d S )Nr  )rg   r   r   r   rf   	exceptionr   r   r   ra   r   r   r   r  r   )r  r   r   r   r  rK   rL   	task_done  s$    z#TaskGroup._spawn.<locals>.task_donez;This task group is not active; no new tasks can be started.r   Ztask_statusz Expected an async function, but z appears to be synchronouscr_framegi_framerB   r   )r   r   ru   rm   r   idrP   r   rg   ri   rd   iscoroutine	TypeErrorr   r   r   r	  rO   add_done_callbackr   rf   r   r   )r   rn   r   r   r  r  optionskwargsr   ry   Zforeign_cororF   rK   r  rL   _spawn  sF    
 





  
zTaskGroup._spawnr   )rn   r   r   rG   c                G  s   |  ||| d S rH   )r  )r   rn   r   r   rK   rK   rL   
start_soon  s    zTaskGroup.start_soonc             
     sj   t  }| ||||}tdd> z|I d H W W  5 Q R  S  tk
rZ   |   Y nX W 5 Q R X d S )NTr   )rd   r   r  r>   r   r   )r   rn   r   r   r   rF   rK   rK   rL   start  s    zTaskGroup.start)N)r   r_   ro   r   r   r   staticmethodr   r	  r  r  r  rK   rK   rK   rL   r   )  s   * Ir   c                      s^   e Zd ZdZdddd fddZdd	d
ddddZddddZddddddZ  ZS )WorkerThread
   rE   zset[WorkerThread]zdeque[WorkerThread])rj   workersidle_workersc                   sD   t  jdd || _|| _|| _|j| _td| _t	 | _
d| _d S )NzAnyIO worker threadr  r*   F)r   r   rj   r  r  _loopr   r   queuer   
idle_sincestopping)r   rj   r  r  r   rK   rL   r     s    zWorkerThread.__init__r   r   r   r|   )r   resultr   rG   c                 C  s`   t  | _| js| j|  | s\|d k	rRt|trFtd}||_	|}|
| n
|| d S )Nzcoroutine raised StopIteration)r   r"  r#  r  r   	cancelledr   StopIterationr   r  r  r   )r   r   r$  r   r  rK   rK   rL   _report_result  s    
zWorkerThread._report_resultr^   c           	      C  s   t d | jt_| j }|d kr2W 5 Q R  d S |\}}}}| sd }d }z|j|f| }W n& tk
r } z|}W 5 d }~X Y nX | j s| j	| j
||| | j  qW 5 Q R X d S )Nrd   )r1   r   r2   r!  r`   r%  rR   r   	is_closedcall_soon_threadsafer'  r  )	r   itemrU   rn   r   r   r$  r  r   rK   rK   rL   rR     s*    


   zWorkerThread.runNzasyncio.Task | NonefrG   c                 C  sH   d| _ | jd  | j|  z| j|  W n tk
rB   Y nX d S r   )r#  r!  
put_nowaitr  discardr  r   
ValueError)r   r,  rK   rK   rL   stop2  s    zWorkerThread.stop)N)	r   r_   ro   MAX_IDLE_TIMEr   r'  rR   r0  r   rK   rK   r   rL   r    s
   r  _threadpool_idle_workerszRunVar[deque[WorkerThread]]_threadpool_workerszRunVar[set[WorkerThread]])cancellablelimiterzCallable[..., T_Retval]zCapacityLimiter | None)rn   r   r4  r5  rG   c                  sj  t  I d H  zt }t }W n4 tk
rT   t }t }t| t| Y nX |p^t 4 I d H  t| d t	
 }t }|st|||}|  || ||j nH| }t }	|r|	|d j tjk rq| }
|
j|
j |
  qt }|tjjd  |j|| ||f |I d H W  5 Q R  W  5 Q I d H R  S Q R X W 5 Q I d H R X d S )Nr   r   )r   r2  r`   r3  LookupErrorr   rc   current_default_thread_limiterr>   rd   r   rl   r  r  r   r  r0  popr   r"  r1  popleftrj   remove_done_callbackr   rR   sniffioZcurrent_async_library_cvarr!  r-  )rn   r4  r5  r   r  r  r   rj   ZworkernowZexpired_workerrU   rK   rK   rL   run_sync_in_worker_threadB  s<    


r=  r   z asyncio.AbstractEventLoop | None)rn   r   r   rG   c                  s@   t dd fdd}t |p,tj}||  S )Nr|   r^   c               
     sP   z    W n8 tk
rJ }  z|  t| ts: W 5 d } ~ X Y nX d S rH   )r   r   r  r   rx   )r   r   r,  rn   rK   rL   r   u  s    

z%run_sync_from_thread.<locals>.wrapper)r   r   r2   r   r)  r$  )rn   r   r   r   rK   r?  rL   run_sync_from_threadp  s    

r@  )rn   r   rG   c                 G  s   t | | tj}| S rH   )rd   run_coroutine_threadsafer2   r   r$  )rn   r   r,  rK   rK   rL   run_async_from_thread  s
     rB  c                      sH   e Zd Zd dddZdd fddZddd	d
dddddZ  ZS )BlockingPortalr^   c                 C  s
   t | S rH   r   r   rK   rK   rL   r     s    zBlockingPortal.__new__r|   c                   s   t    t | _d S rH   )r   r   rQ   r   r   r   rK   rL   r     s    
zBlockingPortal.__init__r   r
  dict[str, Any]r   r   )rn   r   r  r   r   rG   c              	   C  s*   t t| jj|d| j||||| jd d S )Nr  r>  )r@  r
   Z_task_groupr  Z
_call_funcr   )r   rn   r   r  r   r   rK   rK   rL   _spawn_task_from_thread  s    z&BlockingPortal._spawn_task_from_thread)r   r_   ro   r   r   rF  r   rK   rK   r   rL   rC    s   rC  )eqc                   @  s6   e Zd ZU ded< ddddddZd	d
ddZdS )StreamReaderWrapperzasyncio.StreamReader_stream   r   bytes	max_bytesrG   c                   s"   | j |I d H }|r|S td S rH   )rI  readr6   )r   rM  datarK   rK   rL   receive  s    zStreamReaderWrapper.receiver|   r^   c                   s   | j   d S rH   )rI  feed_eofr   rK   rK   rL   aclose  s    zStreamReaderWrapper.acloseN)rJ  )r   r_   ro   __annotations__rP  rR  rK   rK   rK   rL   rH    s   
rH  c                   @  s4   e Zd ZU ded< dddddZddd	d
ZdS )StreamWriterWrapperzasyncio.StreamWriterrI  rK  r|   r*  rG   c                   s    | j | | j  I d H  d S rH   )rI  writedrainr   r*  rK   rK   rL   send  s    zStreamWriterWrapper.sendr^   c                   s   | j   d S rH   )rI  closer   rK   rK   rL   rR    s    zStreamWriterWrapper.acloseN)r   r_   ro   rS  rY  rR  rK   rK   rK   rL   rT    s   
rT  c                   @  s   e Zd ZU ded< ded< ded< ded< dd	d
dZdd	ddZdd	ddZdd	ddZdddddZe	dd	ddZ
e	dd	ddZe	dd	ddZe	dd	dd Ze	dd	d!d"Zd#S )$Processzasyncio.subprocess.Process_processzStreamWriterWrapper | None_stdinzStreamReaderWrapper | None_stdout_stderrr|   r^   c                   sT   | j r| j  I d H  | jr,| j I d H  | jrB| j I d H  |  I d H  d S rH   )r]  rR  r^  r_  r   r   rK   rK   rL   rR    s    zProcess.acloser   c                   s   | j  I d H S rH   )r\  r   r   rK   rK   rL   r     s    zProcess.waitc                 C  s   | j   d S rH   )r\  	terminater   rK   rK   rL   r`    s    zProcess.terminatec                 C  s   | j   d S rH   )r\  killr   rK   rK   rL   ra    s    zProcess.kill)signalrG   c                 C  s   | j | d S rH   )r\  send_signal)r   rb  rK   rK   rL   rc    s    zProcess.send_signalc                 C  s   | j jS rH   )r\  pidr   rK   rK   rL   rd    s    zProcess.pidr   c                 C  s   | j jS rH   )r\  
returncoder   rK   rK   rL   re    s    zProcess.returncodezabc.ByteSendStream | Nonec                 C  s   | j S rH   )r]  r   rK   rK   rL   stdin  s    zProcess.stdinzabc.ByteReceiveStream | Nonec                 C  s   | j S rH   )r^  r   rK   rK   rL   stdout  s    zProcess.stdoutc                 C  s   | j S rH   )r_  r   rK   rK   rL   stderr  s    zProcess.stderrN)r   r_   ro   rS  rR  r   r`  ra  rc  r   rd  re  rf  rg  rh  rK   rK   rK   rL   r[    s&   

r[  )cwdenvstart_new_sessionz#str | bytes | Sequence[str | bytes]zint | IO[Any] | Nonezstr | bytes | PathLike | NonezMapping[str, str] | None)	commandshellrf  rg  rh  ri  rj  rk  rG   c             	     s   t  I d H  |r>tjttttf | ||||||dI d H }n tj| ||||||dI d H }|jrnt	|jnd }	|j
rt|j
nd }
|jrt|jnd }t||	|
|S )N)rf  rg  rh  ri  rj  rk  )r   rd   create_subprocess_shellr(   r'   rm   rK  create_subprocess_execrf  rT  rg  rH  rh  r[  )rl  rm  rf  rg  rh  ri  rj  rk  processZstdin_streamZstdout_streamZstderr_streamrK   rK   rL   open_process  s0    

rq  zset[Process])r  r  rG   c                 C  s   zt   }W n tk
r(   d}Y nX | D ]R}|jdkr>q.|jjj  |j	jj  |j
jj  |  |r.||j q.dS )zG
    Forcibly shuts down worker processes belonging to this event loop.N)rd   get_event_loop_policyget_child_watcherNotImplementedErrorre  r]  rI  
_transportrZ  r^  r_  ra  remove_child_handlerrd  )r  r  Zchild_watcherrp  rK   rK   rL   '_forcibly_shutdown_process_pool_on_exit!  s    

rw  )r  rG   c                   sd   zt tjI dH  W nJ tjk
r^   | D ]}|jdkr*|  q*| D ]}| I dH  qFY nX dS )z
    Shuts down worker processes belonging to this event loop.

    NOTE: this only works when the event loop was started using asyncio.run() or anyio.run().

    N)r   r   r   rd   r   re  ra  rR  )r  rp  rK   rK   rL   _shutdown_process_pool_on_exit9  s    

rx  c                 C  s6   t rddini }tt| f| t tt|  d S )Nr   z AnyIO process pool shutdown task)r   rO   rx  rl   r  r
   rw  )r  r  rK   rK   rL   #setup_process_pool_exit_at_shutdownL  s    ry  c                   @  s   e Zd ZU ded< ded< ded< dZded< d	d
dddZdd
dddZdd
dddZddddZd
dddZ	d
dddZ
dS )StreamProtocolzdeque[bytes]
read_queueasyncio.Event
read_eventwrite_eventNException | Noner  asyncio.BaseTransportr|   	transportrG   c                 C  s<   t  | _t | _t | _| j  ttj|	d d S r   )
r   r{  rd   r<   r}  r~  rc   r(   	Transportset_write_buffer_limitsr   r  rK   rK   rL   connection_madea  s
    


zStreamProtocol.connection_mader   rG   c                 C  s,   |rt  | _|| j_| j  | j  d S rH   )r3   r  r  r}  rc   r~  r   r   rK   rK   rL   connection_losth  s
    
zStreamProtocol.connection_lostrK  )rO  rG   c                 C  s   | j | | j  d S rH   )r{  r   r}  rc   )r   rO  rK   rK   rL   data_receivedp  s    zStreamProtocol.data_receivedr   r^   c                 C  s   | j   dS r   )r}  rc   r   rK   rK   rL   eof_receivedt  s    
zStreamProtocol.eof_receivedc                 C  s   t  | _d S rH   )rd   r<   r~  r   rK   rK   rL   pause_writingx  s    zStreamProtocol.pause_writingc                 C  s   | j   d S rH   r~  rc   r   rK   rK   rL   resume_writing{  s    zStreamProtocol.resume_writing)r   r_   ro   rS  r  r  r  r  r  r  r  rK   rK   rK   rL   rz  [  s   
rz  c                   @  s   e Zd ZU ded< ded< ded< dZded< d	d
dddZdd
dddZddd
dddZdd
dddZd
dddZ	d
dddZ
dS )DatagramProtocolz#deque[tuple[bytes, IPSockAddrType]]r{  r|  r}  r~  Nr  r  r  r|   r  c                 C  s.   t dd| _t | _t | _| j  d S )Nd   )maxlen)r   r{  rd   r<   r}  r~  rc   r  rK   rK   rL   r    s    

z DatagramProtocol.connection_mader  c                 C  s   | j   | j  d S rH   )r}  rc   r~  r  rK   rK   rL   r    s    
z DatagramProtocol.connection_lostrK  r?   )rO  addrrG   c                 C  s&   t |}| j||f | j  d S rH   )r:   r{  r   r}  rc   )r   rO  r  rK   rK   rL   datagram_received  s    z"DatagramProtocol.datagram_receivedrx   c                 C  s
   || _ d S rH   )r  r  rK   rK   rL   error_received  s    zDatagramProtocol.error_receivedr^   c                 C  s   | j   d S rH   )r~  clearr   rK   rK   rL   r    s    zDatagramProtocol.pause_writingc                 C  s   | j   d S rH   r  r   rK   rK   rL   r    s    zDatagramProtocol.resume_writing)r   r_   ro   rS  r  r  r  r  r  r  r  rK   rK   rK   rL   r    s   
r  c                   @  sl   e Zd ZdddddZedddd	ZddddddZdddddZddddZddddZ	dS )SocketStreamzasyncio.Transportrz  r  protocolc                 C  s*   || _ || _td| _td| _d| _d S Nreading from
writing toFru  	_protocolr=   _receive_guard_send_guard_closedr   r  r  rK   rK   rL   r     s
    

zSocketStream.__init__socket.socketr^   c                 C  s   | j dS Nsocketru  get_extra_infor   rK   rK   rL   _raw_socket  s    zSocketStream._raw_socketrJ  r   rK  rL  c              	     s   | j  t I d H  | jj sP| j sP| j  | jj I d H  | j	  z| jj
 }W n: tk
r   | jr~td n| jjr| jjntd Y nX t||kr|d | ||d   }}| jj
| | jj
s| jj  W 5 Q R X |S rH   )r  r   r  r}  is_setru  
is_closingresume_readingr   pause_readingr{  r9  
IndexErrorr  r5   r  r6   r   
appendleftr  )r   rM  chunkleftoverrK   rK   rL   rP    s.    



zSocketStream.receiver|   rU  c                   s   | j  t I d H  | jr tn| jjd k	r4| jjz| j| W n6 tk
rz } z| j	 rht
|n W 5 d }~X Y nX | jj I d H  W 5 Q R X d S rH   )r  r   r  r5   r  r  ru  rV  r   r  r3   r~  r   )r   r*  r   rK   rK   rL   rY    s    
zSocketStream.sendc                   s(   z| j   W n tk
r"   Y nX d S rH   )ru  	write_eofOSErrorr   rK   rK   rL   send_eof  s    zSocketStream.send_eofc                   sZ   | j  sVd| _z| j   W n tk
r2   Y nX | j   tdI d H  | j   d S NTr   )ru  r  r  r  r  rZ  r   abortr   rK   rK   rL   rR    s    

zSocketStream.acloseN)rJ  )
r   r_   ro   r   r   r  rP  rY  r  rR  rK   rK   rK   rL   r    s   "r  c                   @  s   e Zd ZU dZded< dZded< dZdddd	Zedd
ddZ	dddddZ
dddddZdd
ddZd*dddddZdddddZddd d!d"d#Zdd$dd%d&d'Zdd
d(d)ZdS )+UNIXSocketStreamNr  _receive_future_send_futureFr  
raw_socketc                 C  s&   || _ t | _td| _td| _d S )Nr  r  )_UNIXSocketStream__raw_socketrQ   r   r=   r  r  r   r  rK   rK   rL   r     s    
zUNIXSocketStream.__init__r^   c                 C  s   | j S rH   )r  r   rK   rK   rL   r    s    zUNIXSocketStream._raw_socketasyncio.AbstractEventLoopr   )r   rG   c                   sF   ddd fdd}t   }_jj|jd  || |S )Nr   r|   r+  c                   s   `  j d S rH   )r  remove_readerr  r,  r   r   rK   rL   callback  s    z7UNIXSocketStream._wait_until_readable.<locals>.callback)rd   r   r  r   
add_readerr  r   r  r   r   r  r,  rK   r  rL   _wait_until_readable  s
    
z%UNIXSocketStream._wait_until_readablec                   sF   ddd fdd}t   }_jj|jd  || |S )Nr   r|   r+  c                   s   `  j d S rH   )r  remove_writerr  r  r  rK   rL   r    s    z7UNIXSocketStream._wait_until_writable.<locals>.callback)rd   r   r  r   
add_writerr  r   r  r  rK   r  rL   _wait_until_writable  s
    
z%UNIXSocketStream._wait_until_writabler|   c              	     s$   | j  | jtj W 5 Q R X d S rH   )r  r  shutdownr  SHUT_WRr   rK   rK   rL   r    s    zUNIXSocketStream.send_eofrJ  r   rK  rL  c                   s   t  }t I d H  | j z| j|}W nX tk
rN   | |I d H  Y q tk
r } z| jrlt	d nt
|W 5 d }~X Y qX |st|W  5 Q R  S qW 5 Q R X d S rH   )rQ   r   r  r  recvBlockingIOErrorr  r  _closingr5   r3   r6   )r   rM  r   rO  r   rK   rK   rL   rP    s    zUNIXSocketStream.receiverU  c                   s   t  }t I d H  | j t|}|rz| j|}W nX tk
rZ   | |I d H  Y q" tk
r } z| j	rxt
d nt|W 5 d }~X Y q"X ||d  }q"W 5 Q R X d S rH   )rQ   r   r  
memoryviewr  rY  r  r  r  r  r5   r3   )r   r*  r   viewZ
bytes_sentr   rK   rK   rL   rY  -  s    zUNIXSocketStream.sendztuple[bytes, list[int]])msglenmaxfdsrG   c                   sd  t |tr|dk rtdt |tr,|dk r4tdt }td}t I d H  | j z&| j|t	
||j \}}}}W nX tk
r   | |I d H  Y qX tk
r }	 z| jrtd nt|	W 5 d }	~	X Y qXX |s|stqqXW 5 Q R X |D ]`\}
}}|
t	jks|t	jkr2td|d|
 d| ||d t|t||j    q|t|fS )	Nr   z%msglen must be a non-negative integerr   z!maxfds must be a positive integerr   z.Received unexpected ancillary data; message = z, cmsg_level = z, cmsg_type = )r   r   r/  rQ   arrayr   r  r  recvmsgr  CMSG_LENitemsizer  r  r  r  r5   r3   r6   
SOL_SOCKET
SCM_RIGHTSr   	frombytesr   list)r   r  r  r   fdsmessageZancdataflagsr  r   Z
cmsg_levelZ	cmsg_typeZ	cmsg_datarK   rK   rL   receive_fds?  s:    
 &zUNIXSocketStream.receive_fdszCollection[int | IOBase])r  r  rG   c                   s  |st d|st dt }g }|D ]2}t|tr@|| q&t|tr&||  q&td|}t I d H  | j	 z$| j
|gtjtj|fg W qW qz tk
r   | |I d H  Y qz tk
r } z| jrtd nt|W 5 d }~X Y qzX qzW 5 Q R X d S )Nzmessage must not be emptyzfds must not be emptyr   )r/  rQ   r   r   r   r   filenor  r   r  r  sendmsgr  r  r  r  r  r  r  r5   r3   )r   r  r  r   ZfilenosfdZfdarrayr   rK   rK   rL   send_fdsf  s4    

 zUNIXSocketStream.send_fdsc                   sL   | j sHd| _ | j dkr$| j  | jr6| jd  | jrH| jd  d S )NT)r  r  r  rZ  r  r   r  r   rK   rK   rL   rR    s    
zUNIXSocketStream.aclose)rJ  )r   r_   ro   r  rS  r  r  r   r   r  r  r  r  rP  rY  r  r  rR  rK   rK   rK   rL   r    s   


'!r  c                   @  sZ   e Zd ZU dZded< dZddddZedd	d
dZdd	ddZ	dd	ddZ
dS )TCPSocketListenerNr   _accept_scopeFr  r  c                 C  s$   || _ ttjt | _td| _d S )Naccepting connections from)_TCPSocketListener__raw_socketr(   rd   BaseEventLooprQ   r   r=   _accept_guardr  rK   rK   rL   r     s    zTCPSocketListener.__init__r^   c                 C  s   | j S rH   )r  r   rK   rK   rL   r    s    zTCPSocketListener._raw_socketabc.SocketStreamc                   s   | j r
t| j t I d H  t | _zrz| j| jI d H \}}W nP t	j
k
r   z| j| j W n ttfk
r   Y nX | j rtd  Y nX W 5 d | _X W 5 Q R X W 5 Q R X |tjtjd | jt|I d H \}}t||S )Nr   )r  r5   r  r   r>   r  r   sock_acceptr  rd   r   r  r/  rt  
setsockoptr  IPPROTO_TCPTCP_NODELAYconnect_accepted_socketrz  r  )r   client_sockZ_addrr  r  rK   rK   rL   accept  s,    
 zTCPSocketListener.acceptr|   c              	     sh   | j r
d S d| _ | jrZz| j| j W n ttfk
r@   Y nX | j  tdI d H  | j	  d S r  )
r  r  r   r  r  r/  rt  r   r   rZ  r   rK   rK   rL   rR    s    
zTCPSocketListener.aclose)r   r_   ro   r  rS  r  r   r   r  r  rR  rK   rK   rK   rL   r    s   
r  c                   @  sH   e Zd ZddddZddddZd	dd
dZeddddZdS )UNIXSocketListenerr  r  c                 C  s"   || _ t | _td| _d| _d S )Nr  F)_UNIXSocketListener__raw_socketrQ   r   r=   r  r  r  rK   rK   rL   r     s    
zUNIXSocketListener.__init__r  r^   c                   s   t  I d H   j z. j \}}|d t|W W  5 Q R  S  tk
r   t } j	
 j|jd  | fdd |I d H  Y q tk
r } z jrtd nt|W 5 d }~X Y qX qW 5 Q R X d S )NFc                   s    j  jS rH   )r   r  r  _r   rK   rL   <lambda>      z+UNIXSocketListener.accept.<locals>.<lambda>)r   r  r  r  setblockingr  r  rd   r   r   r  r   r  r  r  r5   r3   )r   r  r  r,  r   rK   r   rL   r    s"    

zUNIXSocketListener.acceptr|   c                   s   d| _ | j  d S r   )r  r  rZ  r   rK   rK   rL   rR    s    zUNIXSocketListener.aclosec                 C  s   | j S rH   )r  r   rK   rK   rL   r    s    zUNIXSocketListener._raw_socketN)r   r_   ro   r   r  rR  r   r  rK   rK   rK   rL   r    s
   r  c                   @  sZ   e Zd ZdddddZedddd	Zd
dddZddddZdd
dddZdS )	UDPSocketasyncio.DatagramTransportr  r  c                 C  s*   || _ || _td| _td| _d| _d S r  r  r  rK   rK   rL   r     s
    

zUDPSocket.__init__r  r^   c                 C  s   | j dS r  r  r   rK   rK   rL   r    s    zUDPSocket._raw_socketr|   c                   s   | j  sd| _| j   d S r   ru  r  r  rZ  r   rK   rK   rL   rR    s    
zUDPSocket.acloseztuple[bytes, IPSockAddrType]c              
     s   | j  t I d H  | jjsD| j sD| jj  | jj I d H  z| jj	 W W  5 Q R  S  t
k
r   | jr|td ntd Y nX W 5 Q R X d S rH   r  r   r  r{  ru  r  r}  r  r   r9  r  r  r5   r3   r   rK   rK   rL   rP    s    zUDPSocket.receiver@   rU  c              	     s\   | j L t I d H  | jj I d H  | jr2tn| j rBt	n| jj
|  W 5 Q R X d S rH   r  r   r  r~  r   r  r5   ru  r  r3   sendtorX  rK   rK   rL   rY    s    
zUDPSocket.sendN	r   r_   ro   r   r   r  rR  rP  rY  rK   rK   rK   rL   r    s   	r  c                   @  sZ   e Zd ZdddddZedddd	Zd
dddZddddZdd
dddZdS )ConnectedUDPSocketr  r  r  c                 C  s*   || _ || _td| _td| _d| _d S r  r  r  rK   rK   rL   r   %  s
    

zConnectedUDPSocket.__init__r  r^   c                 C  s   | j dS r  r  r   rK   rK   rL   r  .  s    zConnectedUDPSocket._raw_socketr|   c                   s   | j  sd| _| j   d S r   r  r   rK   rK   rL   rR  2  s    
zConnectedUDPSocket.acloserK  c              
     s   | j  t I d H  | jjsD| j sD| jj  | jj I d H  z| jj	 }W n( t
k
r|   | jrrtd ntd Y nX |d W  5 Q R  S Q R X d S r   r  )r   packetrK   rK   rL   rP  7  s    zConnectedUDPSocket.receiverU  c              	     s\   | j L t I d H  | jj I d H  | jr2tn| j rBt	n| j
| W 5 Q R X d S rH   r  rX  rK   rK   rL   rY  J  s    
zConnectedUDPSocket.sendNr  rK   rK   rK   rL   r  $  s   	r  r   ztuple[str, int] | None)hostport
local_addrrG   c                   s@   t ttjtf t jt| ||dI d H \}}|  t||S )N)r  )	r(   r%   rd   r  rz  rQ   create_connectionr  r  )r  r   r  r  r  rK   rK   rL   connect_tcpV  s       
r  )pathrG   c                   s   t  I d H  t  ttjd z|  W nf tk
r   t } 	|j
d  | fdd |I d H  Y q( tk
r      Y q(X tS q(d S )NFc                   s
     S rH   )r  r  r   r  rK   rL   r  n  r  zconnect_unix.<locals>.<lambda>)r   rQ   r  AF_UNIXr  connectr  rd   r   r  r   r  r   rZ  r  )r  r,  rK   r  rL   connect_unixc  s    
r  zsocket.AddressFamilyzIPSockAddrType | NonezUDPSocket | ConnectedUDPSocket)familylocal_addressremote_address
reuse_portrG   c                   s\   t  jt||| |dI d H }|d }|d }|jr@|  |j|sNt||S t||S d S )N)r  remote_addrr	  r  r   r   )rQ   create_datagram_endpointr  r  rZ  r  r  )r	  r
  r  r  r$  r  r  rK   rK   rL   create_udp_socketw  s    
r  r	  typeprotor  zbytes | strzstr | int | Nonezint | AddressFamilyzint | SocketKindr9   )r  r   r	  r  r  r  rG   c                  s(   t  j| |||||dI d H }tt|S )Nr  )rQ   getaddrinfor(   r9   )r  r   r	  r  r  r  r$  rK   rK   rL   r    s    
     r  r?   ztuple[str, str])sockaddrr  rG   c                   s   t  | |I d H S rH   )rQ   getnameinfo)r  r  rK   rK   rL   r    s    r  read_eventsz RunVar[dict[Any, asyncio.Event]]_read_eventswrite_events_write_eventsr  )sockrG   c              
     s   t  I d H  zt }W n" tk
r:   i }t| Y nX || rPtdd t }t  }|| < |	| |j z| I d H  W 5 |
| d d k	r||  d}nd}X |std S )Nr  TF)r   r  r`   r6  rc   r4   rQ   rd   r<   r  r8  r  r   r5   )r  r  r   eventreadablerK   rK   rL   wait_socket_readable  s&    


r  c              
     s   t  I d H  zt }W n" tk
r:   i }t| Y nX || rPtdd t }t  }|| < |	| 
 |j z| I d H  W 5 || d d k	r||  d}nd}X |std S )Nr  TF)r   r  r`   r6  rc   r4   rQ   rd   r<   r  r  r8  r  r   r5   )r  r  r   r  writablerK   rK   rL   wait_socket_writable  s&    


r  c                   @  s`   e Zd Zd dddZddddZdddd	Zd
dddZddddZddddZdS )r<   r^   c                 C  s
   t | S rH   r   rD  rK   rK   rL   r     s    zEvent.__new__r|   c                 C  s   t  | _d S rH   )rd   r<   _eventr   rK   rK   rL   r     s    zEvent.__init__r0   c                 C  s   | j   t| jS rH   )r   rc   r0   r   rK   rK   rL   rc     s    
z	Event.setrv   c                 C  s
   | j  S rH   )r   r  r   rK   rK   rL   r    s    zEvent.is_setc                   s    | j  I d H rt I d H  d S rH   )r   r   r   r   rK   rK   rL   r     s    z
Event.waitr,   c                 C  s   t t| jjS rH   )r,   r   r   _waitersr   rK   rK   rL   
statistics  s    zEvent.statisticsN)	r   r_   ro   r   r   rc   r  r   r"  rK   rK   rK   rL   r<     s   r<   c                   @  s  e Zd ZU dZded< dd dddZdddd	Zd
dddZdddd
dddZe	ddddZ
e
jdd
dddZ
e	ddddZe	ddddZddddZd dd!d"d#Zd
dd$d%Zd d
d!d&d'Zd
dd(d)Zd d
d!d*d+Zd,dd-d.Zd/S )0r;   r   r   _total_tokens)total_tokensrG   c                 C  s
   t | S rH   r   )r   r$  rK   rK   rL   r     s    zCapacityLimiter.__new__)r$  c                 C  s   t  | _t | _|| _d S rH   )rc   
_borrowersr   _wait_queuer$  )r   r$  rK   rK   rL   r     s    zCapacityLimiter.__init__r|   r^   c                   s   |   I d H  d S rH   )acquirer   rK   rK   rL   r     s    zCapacityLimiter.__aenter__r   r   r   r   c                   s   |    d S rH   )release)r   r   r   r   rK   rK   rL   r     s    zCapacityLimiter.__aexit__c                 C  s   | j S rH   )r#  r   rK   rK   rL   r$    s    zCapacityLimiter.total_tokensr   c                 C  s   t |tst|std|dk r,td| j}|| _g }| j D ]*}||krV qr|	 sF|
| |d7 }qF|D ]}|  qvd S )Nz'total_tokens must be an int or math.infr   ztotal_tokens must be >= 1)r   r   r   isinfr  r/  r#  r&  valuesr  r   rc   )r   r   	old_valueeventsr  rK   rK   rL   r$    s    

r   c                 C  s
   t | jS rH   )r   r%  r   rK   rK   rL   borrowed_tokens(  s    zCapacityLimiter.borrowed_tokensc                 C  s   | j t| j S rH   )r#  r   r%  r   rK   rK   rL   available_tokens,  s    z CapacityLimiter.available_tokensr0   c                 C  s   |  t  t| jS rH   )acquire_on_behalf_of_nowaitrP   r0   acquire_nowaitr   rK   rK   rL   r0  0  s    zCapacityLimiter.acquire_nowaitr   )borrowerrG   c                 C  sB   || j krtd| js(t| j | jkr,t| j | t| jS )NzEthis borrower is already holding one of this CapacityLimiter's tokens)	r%  r   r&  r   r#  r7   r   r0   r/  )r   r1  rK   rK   rL   r/  4  s    
z+CapacityLimiter.acquire_on_behalf_of_nowaitc                   s   |  t I d H S rH   )acquire_on_behalf_ofrP   r   rK   rK   rL   r'  A  s    zCapacityLimiter.acquirec                   s   t  I d H  z| | W nj tk
r   t }|| j|< z| I d H  W n$ tk
rr   | j|d   Y nX | j	
| Y n2X zt I d H  W n tk
r   |    Y nX d S rH   )r   r/  r7   rd   r<   r&  r   r   r8  r%  r   r   r(  r   r1  r  rK   rK   rL   r2  D  s"    
z$CapacityLimiter.acquire_on_behalf_ofc                 C  s   |  t  d S rH   )release_on_behalf_ofrP   r   rK   rK   rL   r(  Y  s    zCapacityLimiter.releasec                 C  sd   z| j | W n tk
r.   tdd Y nX | jr`t| j | jk r`| jjddd }|  d S )Nz@this borrower isn't holding any of this CapacityLimiter's tokensF)lastr   )	r%  r   r   r   r&  r   r#  popitemrc   r3  rK   rK   rL   r4  \  s    z$CapacityLimiter.release_on_behalf_ofr+   c                 C  s   t | j| jt| jt| jS rH   )r+   r-  r$  r
  r%  r   r&  r   rK   rK   rL   r"  i  s    zCapacityLimiter.statisticsN)r   r_   ro   r#  rS  r   r   r   r   r   r$  r   r-  r.  r0  r/  r'  r2  r(  r4  r"  rK   rK   rK   rL   r;     s(   
r;   _default_thread_limiterzRunVar[CapacityLimiter]c                  C  s:   z
t  W S  tk
r4   td} t |  |  Y S X d S )N(   )r7  r`   r6  r;   rc   )r5  rK   rK   rL   r7  u  s    

r7  c                   @  sh   e Zd ZddddZddddd	Zd d
ddZdddddddZd d
ddZdd
ddZdS )_SignalReceiverztuple[int, ...]signalsc                 C  s,   || _ t | _t | _t | _t | _	d S rH   )
_signalsrQ   r   r   _signal_queuerd   r   r   rc   _handled_signals)r   r;  rK   rK   rL   r     s
    
z_SignalReceiver.__init__r   r|   )signumrG   c                 C  s&   | j | | j s"| jd  d S rH   )r=  r   r   ra   r   )r   r?  rK   rK   rL   _deliver  s    
z_SignalReceiver._deliverr^   c                 C  s2   t | jD ]"}| j|| j| | j| q
| S rH   )rc   r<  r   add_signal_handlerr@  r>  r   )r   sigrK   rK   rL   r     s    z_SignalReceiver.__enter__r   r   r   r   r   c                 C  s   | j D ]}| j| qd S rH   )r>  r   remove_signal_handler)r   r   r   r   rB  rK   rK   rL   r     s    
z_SignalReceiver.__exit__c                 C  s   | S rH   rK   r   rK   rK   rL   	__aiter__  s    z_SignalReceiver.__aiter__c                   s2   t  I d H  | js(t | _| jI d H  | j S rH   )r   r=  rd   r   r   r9  r   rK   rK   rL   	__anext__  s
    
z_SignalReceiver.__anext__N)	r   r_   ro   r   r@  r   r   rD  rE  rK   rK   rK   rL   r9    s   
r9  )r;  rG   c                  G  s   t | S rH   )r9  r:  rK   rK   rL   open_signal_receiver  s    rF  r-   c                 C  sJ   t | }|d kr(tr|  nd }d }n|j}|j}tt| ||t| S rH   )	rf   r`   r   r\   r   r   r-   r  rI   )rF   r   r   r   rK   rK   rL   _create_task_info  s    
rG  c                   C  s
   t t S rH   )rG  rP   rK   rK   rK   rL   get_current_task  s    rH  zlist[TaskInfo]c                   C  s   dd t  D S )Nc                 S  s   g | ]}|  st|qS rK   )ra   rG  )rS   rF   rK   rK   rL   rV     s      z%get_running_tasks.<locals>.<listcomp>)rN   rK   rK   rK   rL   get_running_tasks  s    rI  c                    sX   t  I d H  t } t D ]4}|| kr&q|jd ks:|j rtdI d H   qqd S qd S )Ng?)r   rP   rN   _fut_waiterra   r   )Z	this_taskrF   rK   rK   rL   wait_all_tasks_blocked  s    
rK  c                   @  s   e Zd Zd"ddddddZdd	d
dZddddddZdd	ddZdd	ddZddddddZddddddZ	ddddd d!Z
dS )#
TestRunnerFNrv   r{   r   c                 C  sD   g | _ t|| t | _| j| | j| j t| j d S rH   )	r   r   rd   new_event_loopr   	set_debugset_exception_handler_exception_handlerset_event_loop)r   r   r~   r}   rK   rK   rL   r     s    

zTestRunner.__init__r|   r^   c                 C  sn   t | j}|sd S |D ]}|  q| jtj|ddi |D ](}| rNq@| d k	r@tt	| q@d S )Nreturn_exceptionsT)
rN   r   r   run_until_completerd   gatherr%  r  r(   r   )r   	to_cancelrF   rK   rK   rL   _cancel_all_tasks  s    

zTestRunner._cancel_all_tasksr  rE  )r   rU   rG   c                 C  s0   t |dtr"| j|d  n
|| d S )Nr  )r   r`   rx   r   r   default_exception_handler)r   r   rU   rK   rK   rL   rP    s    zTestRunner._exception_handlerc                 C  s:   | j r6| j g  }| _ t|dkr*|d n|r6t|d S r  )r   r   r8   r   rK   rK   rL   _raise_async_exceptions  s    
z"TestRunner._raise_async_exceptionsc              	   C  s:   z|   | j| j  W 5 t d  | j  X d S rH   )rd   rQ  r   rZ  rV  rS  shutdown_asyncgensr   rK   rK   rL   rZ  
  s
    
zTestRunner.closez,Callable[..., AsyncGenerator[T_Retval, Any]]zIterable[T_Retval])fixture_funcr  rG   c                 #  sp   dd fdd}j  t  j | }j   V     j |   d S )Nr|   r^   c               
     s   f } z|  d I d H }  W n2 tk
rX } z| W Y d S d }~X Y nX |   I d H  z|  d I d H  W n tk
r   Y nX |  I d H  tdd S )Nz$Async generator fixture did not stop)	asendrX  r   r  r   r   StopAsyncIterationrR  r   )agenretvalr   r  r,  rZ  r  r   rK   rL   fixture_runner  s    


z7TestRunner.run_asyncgen_fixture.<locals>.fixture_runner)	r   create_futurerd   r<   rO   rS  r$  rc   rX  )r   rZ  r  r`  Zfixture_taskrK   r_  rL   run_asyncgen_fixture  s    

zTestRunner.run_asyncgen_fixturez,Callable[..., Coroutine[Any, Any, T_Retval]]rY   c                 C  s   | j |f |}|   |S rH   )r   rS  rX  )r   rZ  r  r^  rK   rK   rL   run_fixture4  s    zTestRunner.run_fixturez'Callable[..., Coroutine[Any, Any, Any]])	test_funcr  rG   c              
   C  sR   z| j |f | W n. tk
rD } z| j| W 5 d }~X Y nX |   d S rH   )r   rS  rx   r   r   rX  )r   rd  r  r   rK   rK   rL   run_test=  s
    zTestRunner.run_test)FFN)r   r_   ro   r   rV  rP  rX  rZ  rb  rc  re  rK   rK   rK   rL   rL    s      	"	rL  )N)r   )
__future__r   r  rd   concurrent.futures
concurrentr   r  r   Zasyncio.base_eventsr   collectionsr   r   r   contextvarsr   r   dataclassesr	   	functoolsr
   r   inspectr   r   r   r   r   r   ior   osr   r!  r   r   r   	threadingr   typesr   typingr   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   weakrefr)   r;   r+   r,   r-   r.   Z_core._compatr/   r0   Z_core._eventloopr1   r2   Z_core._exceptionsr3   r4   r5   r6   r7   r8   ZBaseExceptionGroupZ_core._socketsr9   r:   Z_core._synchronizationr;   ZBaseCapacityLimiterr<   Z	BaseEventr=   Z_core._tasksr>   ZBaseCancelScoper?   r@   ZlowlevelrA   r   rI   rN   rO   rP   rQ   rR   r   rX   rY   rZ   r   re   r   r]   rS  rl   ru   Z	_run_varscurrent_tokenrz   r   r   r   r   r   r   r   r   r   rf   Z
TaskStatusr   r   r   Z_Retval_Queue_Typer  r2  r3  r=  r@  rB  rC  ZByteReceiveStreamrH  ZByteSendStreamrT  r[  rq  rw  rx  ry  Protocolrz  r  r  r  ZSocketListenerr  r  r  r  r  r  r  r  r  r  r  r  r  r7  r7  r9  rF  rG  rH  rI  rK  rL  rK   rK   rK   rL   <module>   s    H b	 HI1	 8"'$T "<%03  y*	