U
    e:                     @  sn  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mZm	Z	 d dl
mZ d dlmZ d dl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mZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$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/ d dl+m0Z0m1Z1m2Z2m3Z3 d dl4m5Z6 d dl7m8Z8 ddl9m:Z:m;Z;m<Z<m=Z= ddl>m?Z? ddl@mAZAmBZBmCZCmDZD ddlEmFZF ddlGmHZH ddlImJZK ddlImLZM ddlImNZN ddlOmPZQ ddl=mRZRmSZSmTZT ddlUmVZV ddlWmXZX ejYdkrd dlmZZZ nd dl[mZZZ ejYd kr6d d!lm\Z\m]Z] nd d"l^m_Z_ d d!l[m\Z\m]Z] e&d#Z`e&d$Zae&d%ebeRZce\d&ZdeZd'Zee*jfjgZgG d(d) d)eQZPG d*d+ d+e=jhZhG d,d- d-e=jiZied.d/G d0d1 d1e=jjZked.d/G d2d3 d3e=jlZmed.d/G d4d5 d5e=jnZnG d6d7 d7e*j=joZpegd8Zqd9erd8< d:d;d<d=d>ZsG d?d@ d@e"ec ZtG dAdB dBete=juZuG dCdD dDeue=jvZvG dEdF dFete=jwZxG dGdH dHete=jwZyG dIdJ dJeteR e=jzZzG dKdL dLeteR e=j{Z{G dMdN dNeteb e=j|Z|G dOdP dPeteb e=j}Z}G dQdR dReMZLG dSdT dTeKZJegdUZ~d9erdU< G dVdW dWZG dXdY dYe=jZG dZd[ d[eVZeZdS )\    )annotationsN)AsyncIteratorIterable)Future)	dataclass)partial)IOBase)PathLike)Signals)AddressFamily
SocketKind)TracebackType)IOAnyAsyncGenerator	AwaitableCallable
CollectionContextManager	CoroutineGenericMappingNoReturnSequenceTypeVarcastoverload)ErrorOutcomeValue)current_root_taskcurrent_taskwait_readablewait_writable)
SocketType)run_sync   )CapacityLimiterStatisticsEventStatisticsTaskInfoabc)claim_worker_thread)BrokenResourceErrorBusyResourceErrorClosedResourceErrorEndOfStream)convert_ipv6_sockaddr)create_memory_object_streamCapacityLimiterEvent)ResourceGuardCancelScope)IPSockAddrTypeUDPPacketTypeUNIXDatagramPacketType)AsyncBackend)MemoryObjectSendStream)   
   )	ParamSpec)r>      )TypeVarTupleUnpack)BaseExceptionGroupTT_Retval
T_SockAddrPosArgsTPc                   @  s   e Zd Zd$ddd dddZd%ddddd	d
Zd dddZddd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ddd!d"Zej
dddd#d"ZdS )&r8   Nztrio.CancelScope | Noneobject)originalkwargsreturnc                 K  s
   t | S NrJ   __new__)clsrK   rL    rR   9/tmp/pip-unpacked-wheel-7mhetrzx/anyio/_backends/_trio.pyrP   `   s    zCancelScope.__new__r   Nonec                 K  s   |pt jf || _d S rN   )trior8   _CancelScope__original)selfrK   rL   rR   rR   rS   __init__e   s    zCancelScope.__init__rM   c                 C  s   | j   | S rN   )rV   	__enter__rW   rR   rR   rS   rZ   h   s    
zCancelScope.__enter__type[BaseException] | NoneBaseException | NoneTracebackType | Nonebool | Noneexc_typeexc_valexc_tbrM   c                 C  s   | j |||S rN   )rV   __exit__rW   ra   rb   rc   rR   rR   rS   rd   l   s    zCancelScope.__exit__c                 C  s   | j   d S rN   )rV   cancelr[   rR   rR   rS   rf   u   s    zCancelScope.cancelfloatc                 C  s   | j jS rN   rV   deadliner[   rR   rR   rS   ri   x   s    zCancelScope.deadlinevaluerM   c                 C  s   || j _d S rN   rh   rW   rk   rR   rR   rS   ri   |   s    boolc                 C  s   | j jS rN   )rV   cancel_calledr[   rR   rR   rS   rn      s    zCancelScope.cancel_calledc                 C  s   | j jS rN   )rV   cancelled_caughtr[   rR   rR   rS   ro      s    zCancelScope.cancelled_caughtc                 C  s   | j jS rN   rV   shieldr[   rR   rR   rS   rq      s    zCancelScope.shieldc                 C  s   || j _d S rN   rp   rl   rR   rR   rS   rq      s    )N)N)__name__
__module____qualname__rP   rX   rZ   rd   rf   propertyri   setterrn   ro   rq   rR   rR   rR   rS   r8   _   s$    	r8   c                   @  sp   e Zd ZddddZd dddZ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 )	TaskGrouprT   rY   c                 C  s   d| _ tjdd| _d | _d S )NFT)Zstrict_exception_groups)_activerU   Zopen_nursery_nursery_managercancel_scoper[   rR   rR   rS   rX      s    zTaskGroup.__init__c                   s*   d| _ | j I d H | _t| jj| _| S )NT)rx   ry   
__aenter___nurseryr8   rz   r[   rR   rR   rS   r{      s    zTaskGroup.__aenter__r\   r]   r^   r_   r`   c              
     sx   zjz| j|||I d H W W NS  tk
rf } z*|tj\}}|sTtj }|| W 5 d }~X Y nX W 5 d| _ X d S NF)rx   ry   	__aexit__rD   splitrU   	Cancelled_create)rW   ra   rb   rc   exc_restZcancelled_excrR   rR   rS   r~      s    
zTaskGroup.__aexit__Nnamez,Callable[[Unpack[PosArgsT]], Awaitable[Any]]zUnpack[PosArgsT]rJ   )funcargsr   rM   c                G  s*   | j std| jj|f|d|i d S Nz;This task group is not active; no new tasks can be started.r   )rx   RuntimeErrorr|   
start_soonrW   r   r   r   rR   rR   rS   r      s
    zTaskGroup.start_soonzCallable[..., Awaitable[Any]]r   c                  s,   | j std| jj|f|d|iI d H S r   )rx   r   r|   startr   rR   rR   rS   r      s
    zTaskGroup.start)rr   rs   rt   rX   r{   r~   r   r   rR   rR   rR   rS   rw      s   rw   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 )BlockingPortalrY   c                 C  s
   t | S rN   rO   rQ   rR   rR   rS   rP      s    zBlockingPortal.__new__rT   c                   s   t    tj | _d S rN   )superrX   rU   lowlevelcurrent_trio_token_tokenr[   	__class__rR   rS   rX      s    
zBlockingPortal.__init__z<Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval]tuple[Unpack[PosArgsT]]dict[str, Any]rJ   zFuture[T_Retval])r   r   rL   r   futurerM   c              	   C  s.   t jjt| jj|d| j||||| jd d S )Nr   )Z
trio_token)rU   from_threadr%   r   Z_task_groupr   Z
_call_funcr   )rW   r   r   rL   r   r   rR   rR   rS   _spawn_task_from_thread   s    z&BlockingPortal._spawn_task_from_thread)rr   rs   rt   rP   rX   r   __classcell__rR   rR   r   rS   r      s   r   F)eqc                   @  s6   e Zd ZU ded< ddddddZd	d
ddZdS )ReceiveStreamWrapperztrio.abc.ReceiveStream_streamN
int | Nonebytes	max_bytesrM   c              
     s~   z| j |I d H }W nV tjk
rB } zt|jW 5 d }~X Y n, tjk
rl } zt|jW 5 d }~X Y nX |rv|S td S rN   )r   Zreceive_somerU   r.   	__cause__r,   r/   rW   r   datar   rR   rR   rS   receive   s    zReceiveStreamWrapper.receiverT   rY   c                   s   | j  I d H  d S rN   r   acloser[   rR   rR   rS   r     s    zReceiveStreamWrapper.aclose)N)rr   rs   rt   __annotations__r   r   rR   rR   rR   rS   r      s   
r   c                   @  s4   e Zd ZU ded< dddddZddd	d
ZdS )SendStreamWrapperztrio.abc.SendStreamr   r   rT   itemrM   c              
     sr   z| j |I d H  W nV tjk
rB } zt|jW 5 d }~X Y n, tjk
rl } zt|jW 5 d }~X Y nX d S rN   )r   Zsend_allrU   r.   r   r,   rW   r   r   rR   rR   rS   send
  s    zSendStreamWrapper.sendrY   c                   s   | j  I d H  d S rN   r   r[   rR   rR   rS   r     s    zSendStreamWrapper.acloseN)rr   rs   rt   r   r   r   rR   rR   rR   rS   r     s   
r   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trio.Process_processzabc.ByteSendStream | None_stdinzabc.ByteReceiveStream | None_stdout_stderrrT   rY   c                   s   t ddH | jr"| j I d H  | jr8| j I d H  | jrN| j I d H  W 5 Q R X z|  I d H  W nB tk
r   |   t dd |  I d H  W 5 Q R X  Y nX d S NT)rq   )r8   r   r   r   r   waitBaseExceptionkillr[   rR   rR   rS   r     s    zProcess.acloseintc                   s   | j  I d H S rN   )r   r   r[   rR   rR   rS   r   .  s    zProcess.waitc                 C  s   | j   d S rN   )r   	terminater[   rR   rR   rS   r   1  s    zProcess.terminatec                 C  s   | j   d S rN   )r   r   r[   rR   rR   rS   r   4  s    zProcess.killr
   )signalrM   c                 C  s   | j | d S rN   )r   send_signal)rW   r   rR   rR   rS   r   7  s    zProcess.send_signalc                 C  s   | j jS rN   )r   pidr[   rR   rR   rS   r   :  s    zProcess.pidr   c                 C  s   | j jS rN   )r   
returncoder[   rR   rR   rS   r   >  s    zProcess.returncodec                 C  s   | j S rN   )r   r[   rR   rR   rS   stdinB  s    zProcess.stdinc                 C  s   | j S rN   )r   r[   rR   rR   rS   stdoutF  s    zProcess.stdoutc                 C  s   | j S rN   )r   r[   rR   rR   rS   stderrJ  s    zProcess.stderrN)rr   rs   rt   r   r   r   r   r   r   ru   r   r   r   r   r   rR   rR   rR   rS   r     s&   
r   c                      s"   e Zd Zdd fddZ  ZS )_ProcessPoolShutdownInstrumentrT   rY   c                   s   t    d S rN   )r   	after_runr[   r   rR   rS   r   P  s    z(_ProcessPoolShutdownInstrument.after_run)rr   rs   rt   r   r   rR   rR   r   rS   r   O  s   r   &current_default_worker_process_limiterztrio.lowlevel.RunVarset[abc.Process]rT   workersrM   c                   s|   zt tjI d H  W n` t jk
rv   | D ]}|jd kr,|  q,tdd | D ]}| I d H  qTW 5 Q R X Y nX d S r   )	rU   sleepmathinfr   r   r   r8   r   )r   processrR   rR   rS   _shutdown_process_poolY  s    

r   c                   @  sZ   e Zd ZdddddZddddZed	dd
dZddddZdddddZdS )_TrioSocketMixinTrioSocketTyperT   trio_socketrM   c                 C  s   || _ d| _d S r}   )_trio_socket_closedrW   r   rR   rR   rS   rX   l  s    z_TrioSocketMixin.__init__rY   c                 C  s    | j r
t| j dk rtd S Nr   )r   r.   r   filenor,   r[   rR   rR   rS   _check_closedp  s    z_TrioSocketMixin._check_closedsocket.socketc                 C  s   | j jS rN   )r   _sockr[   rR   rR   rS   _raw_socketv  s    z_TrioSocketMixin._raw_socketc                   s"   | j  dkrd| _| j   d S )Nr   T)r   r   r   closer[   rR   rR   rS   r   z  s    z_TrioSocketMixin.acloser   r   )r   rM   c                 C  sJ   t |tjrt|n2| j dk r0| jr0td nt |trBt|n|d S r   )
isinstancerU   r.   r   r   r   OSErrorr,   rW   r   rR   rR   rS   _convert_socket_error  s    
z&_TrioSocketMixin._convert_socket_errorN)	rr   rs   rt   rX   r   ru   r   r   r   rR   rR   rR   rS   r   k  s   r   c                      sT   e Zd Zddd fddZdddd	d
dZdddddZddddZ  ZS )SocketStreamr   rT   r   c                   s$   t  | td| _td| _d S Nreading from
writing tor   rX   r6   _receive_guard_send_guardr   r   rR   rS   rX     s    
zSocketStream.__init__   r   r   r   c                   sr   | j b z| j|I d H }W n, tk
rJ } z| | W 5 d }~X Y nX |r`|W  5 Q R  S tW 5 Q R X d S rN   )r   r   recvr   r   r/   r   rR   rR   rS   r     s    zSocketStream.receiver   c                   st   | j d t|}|rfz| j|I d H }W n, tk
rV } z| | W 5 d }~X Y nX ||d  }qW 5 Q R X d S rN   )r   
memoryviewr   r   r   r   )rW   r   viewZ
bytes_sentr   rR   rR   rS   r     s    zSocketStream.sendrY   c                   s   | j tj d S rN   )r   shutdownsocketSHUT_WRr[   rR   rR   rS   send_eof  s    zSocketStream.send_eof)r   )rr   rs   rt   rX   r   r   r   r   rR   rR   r   rS   r     s   r   c                   @  s0   e Zd ZddddddZdddd	d
dZdS )UNIXSocketStreamr   ztuple[bytes, list[int]])msglenmaxfdsrM   c                   s:  t |tr|dk rtdt |tr,|dk r4tdtd}tj I d H  | jp z,| j	|t
||j I d H \}}}}W n, tk
r } z| | W 5 d }~X Y qVX |s|stqqVW 5 Q R X |D ]^\}	}
}|	t
jks|
t
jkrtd|d|	 d|
 ||d t|t||j    q|t|fS )	Nr   z%msglen must be a non-negative integer   z!maxfds must be a positive integeriz.Received unexpected ancillary data; message = z, cmsg_level = z, cmsg_type = )r   r   
ValueErrorarrayrU   r   
checkpointr   r   recvmsgr   CMSG_LENitemsizer   r   r/   
SOL_SOCKET
SCM_RIGHTSr   Z	frombyteslenlist)rW   r   r   fdsmessageZancdataflagsaddrr   Z
cmsg_levelZ	cmsg_typeZ	cmsg_datarR   rR   rS   receive_fds  s0    
 &zUNIXSocketStream.receive_fdsr   zCollection[int | IOBase]rT   )r   r   rM   c                   s   |st d|st dg }|D ]2}t|tr:|| q t|tr ||  q td|}tj	 I d H  | j
` z*| j|gtjtj|fgI d H  W qW qx tk
r } z| | W 5 d }~X Y qxX qxW 5 Q R X d S )Nzmessage must not be emptyzfds must not be emptyr   )r   r   r   appendr   r   r   rU   r   r   r   r   sendmsgr   r   r   r   r   )rW   r   r   ZfilenosfdZfdarrayr   rR   rR   rS   send_fds  s2    



zUNIXSocketStream.send_fdsN)rr   rs   rt   r   r  rR   rR   rR   rS   r     s   !r   c                      s0   e Zd Zdd fddZddddZ  ZS )	TCPSocketListenerr   
raw_socketc                   s"   t  tj| td| _d S Nzaccepting connections fromr   rX   rU   r   from_stdlib_socketr6   _accept_guardrW   r  r   rR   rS   rX     s    zTCPSocketListener.__init__r   rY   c                   sr   | j L z| j I d H \}}W n, tk
rL } z| | W 5 d }~X Y nX W 5 Q R X |tjtjd t	|S Nr   )
r  r   acceptr   r   
setsockoptr   IPPROTO_TCPTCP_NODELAYr   rW   r   Z_addrr   rR   rR   rS   r    s    &zTCPSocketListener.acceptrr   rs   rt   rX   r  r   rR   rR   r   rS   r    s   r  c                      s0   e Zd Zdd fddZddddZ  ZS )	UNIXSocketListenerr   r  c                   s"   t  tj| td| _d S r  r	  r  r   rR   rS   rX     s    zUNIXSocketListener.__init__r   rY   c                   s`   | j L z| j I d H \}}W n, tk
rL } z| | W 5 d }~X Y nX W 5 Q R X t|S rN   )r  r   r  r   r   r   r  rR   rR   rS   r    s    &zUNIXSocketListener.acceptr  rR   rR   r   rS   r    s   r  c                      sB   e Zd Zddd fddZdddd	Zd
ddddZ  ZS )	UDPSocketr   rT   r   c                   s$   t  | td| _td| _d S r   r   r   r   rR   rS   rX     s    
zUDPSocket.__init__ztuple[bytes, IPSockAddrType]rY   c                   st   | j d z0| jdI d H \}}|t|fW W  5 Q R  S  tk
rd } z| | W 5 d }~X Y nX W 5 Q R X d S Nr   )r   r   recvfromr0   r   r   rW   r   r   r   rR   rR   rS   r     s    zUDPSocket.receiver:   r   c                   sZ   | j J z| jj| I d H  W n, tk
rJ } z| | W 5 d }~X Y nX W 5 Q R X d S rN   r   r   sendtor   r   r   rR   rR   rS   r     s
    zUDPSocket.sendrr   rs   rt   rX   r   r   r   rR   rR   r   rS   r    s   r  c                      sB   e Zd Zddd fddZdddd	Zddd
ddZ  ZS )ConnectedUDPSocketr   rT   r   c                   s$   t  | td| _td| _d S r   r   r   r   rR   rS   rX   $  s    
zConnectedUDPSocket.__init__r   rY   c                   sd   | j T z | jdI d H W W  5 Q R  S  tk
rT } z| | W 5 d }~X Y nX W 5 Q R X d S r  r   r   r   r   r   r   rR   rR   rS   r   )  s
     zConnectedUDPSocket.receiver   c                   sZ   | j J z| j|I d H  W n, tk
rJ } z| | W 5 d }~X Y nX W 5 Q R X d S rN   r   r   r   r   r   r   rR   rR   rS   r   0  s
    zConnectedUDPSocket.sendr  rR   rR   r   rS   r  #  s   r  c                      sB   e Zd Zddd fddZdddd	Zddd
ddZ  ZS )UNIXDatagramSocketr   rT   r   c                   s$   t  | td| _td| _d S r   r   r   r   rR   rS   rX   9  s    
zUNIXDatagramSocket.__init__r;   rY   c                   sp   | j ` z,| jdI d H \}}||fW W  5 Q R  S  tk
r` } z| | W 5 d }~X Y nX W 5 Q R X d S r  )r   r   r  r   r   r  rR   rR   rS   r   >  s    zUNIXDatagramSocket.receiver   c                   sZ   | j J z| jj| I d H  W n, tk
rJ } z| | W 5 d }~X Y nX W 5 Q R X d S rN   r  r   rR   rR   rS   r   F  s
    zUNIXDatagramSocket.sendr  rR   rR   r   rS   r  8  s   r  c                      sB   e Zd Zddd fddZdddd	Zddd
ddZ  ZS )ConnectedUNIXDatagramSocketr   rT   r   c                   s$   t  | td| _td| _d S r   r   r   r   rR   rS   rX   Q  s    
z$ConnectedUNIXDatagramSocket.__init__r   rY   c                   sd   | j T z | jdI d H W W  5 Q R  S  tk
rT } z| | W 5 d }~X Y nX W 5 Q R X d S r  r  r   rR   rR   rS   r   V  s
     z#ConnectedUNIXDatagramSocket.receiver   c                   sZ   | j J z| j|I d H  W n, tk
rJ } z| | W 5 d }~X Y nX W 5 Q R X d S rN   r  r   rR   rR   rS   r   ]  s
    z ConnectedUNIXDatagramSocket.sendr  rR   rR   r   rS   r   N  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 )r5   rY   c                 C  s
   t | S rN   rO   r   rR   rR   rS   rP   k  s    zEvent.__new__rT   c                 C  s   t  | _d S rN   )rU   r5   _Event__originalr[   rR   rR   rS   rX   n  s    zEvent.__init__rm   c                 C  s
   | j  S rN   )r!  is_setr[   rR   rR   rS   r"  q  s    zEvent.is_setc                   s   | j  I d H S rN   )r!  r   r[   rR   rR   rS   r   t  s    z
Event.waitr(   c                 C  s   | j  }t|jdS )N)tasks_waiting)r!  
statisticsr(   r#  )rW   Zorig_statisticsrR   rR   rS   r$  w  s    
zEvent.statisticsc                 C  s   | j   d S rN   )r!  setr[   rR   rR   rS   r%  {  s    z	Event.setN)	rr   rs   rt   rP   rX   r"  r   r$  r%  rR   rR   rR   rS   r5   j  s   r5   c                   @  s  e Zd Zd/ddddd dddZd0dddd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 )1r3   NrK   zfloat | Noneztrio.CapacityLimiter | None)total_tokensrK   rM   c                C  s
   t | S rN   rO   )rQ   r'  rK   rR   rR   rS   rP     s    zCapacityLimiter.__new__rT   c                C  s,   |d k	r|| _ n|d k	stt|| _ d S rN   )_CapacityLimiter__originalAssertionErrorrU   r3   )rW   r'  rK   rR   rR   rS   rX     s    zCapacityLimiter.__init__rY   c                   s   | j  I d H S rN   )r(  r{   r[   rR   rR   rS   r{     s    zCapacityLimiter.__aenter__r\   r]   r^   r`   c                   s   | j |||I d H  d S rN   )r(  r~   re   rR   rR   rS   r~     s    zCapacityLimiter.__aexit__rg   c                 C  s   | j jS rN   r(  r'  r[   rR   rR   rS   r'    s    zCapacityLimiter.total_tokensrj   c                 C  s   || j _d S rN   r*  rl   rR   rR   rS   r'    s    r   c                 C  s   | j jS rN   )r(  borrowed_tokensr[   rR   rR   rS   r+    s    zCapacityLimiter.borrowed_tokensc                 C  s   | j jS rN   )r(  available_tokensr[   rR   rR   rS   r,    s    z CapacityLimiter.available_tokensc                 C  s   | j   d S rN   )r(  acquire_nowaitr[   rR   rR   rS   r-    s    zCapacityLimiter.acquire_nowaitrJ   )borrowerrM   c                 C  s   | j | d S rN   )r(  acquire_on_behalf_of_nowaitrW   r.  rR   rR   rS   r/    s    z+CapacityLimiter.acquire_on_behalf_of_nowaitc                   s   | j  I d H  d S rN   )r(  acquirer[   rR   rR   rS   r1    s    zCapacityLimiter.acquirec                   s   | j |I d H  d S rN   )r(  acquire_on_behalf_ofr0  rR   rR   rS   r2    s    z$CapacityLimiter.acquire_on_behalf_ofc                 C  s
   | j  S rN   )r(  releaser[   rR   rR   rS   r3    s    zCapacityLimiter.releasec                 C  s   | j |S rN   )r(  release_on_behalf_ofr0  rR   rR   rS   r4    s    z$CapacityLimiter.release_on_behalf_ofr'   c                 C  s&   | j  }t|j|jt|j|jdS )N)r+  r'  	borrowersr#  )r(  r$  r'   r+  r'  tupler5  r#  )rW   origrR   rR   rS   r$    s    
zCapacityLimiter.statistics)N)N)rr   rs   rt   rP   rX   r{   r~   ru   r'  rv   r+  r,  r-  r/  r1  r2  r3  r4  r$  rR   rR   rR   rS   r3     s2    
 r3   _capacity_limiter_wrapperc                   @  sb   e Zd ZU de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AsyncIterator[int]	_iteratorztuple[Signals, ...])signalsc                 C  s
   || _ d S rN   )_signals)rW   r;  rR   rR   rS   rX     s    z_SignalReceiver.__init__rY   c                 C  s   t j| j | _| j | _| S rN   )rU   open_signal_receiverr<  _cmrZ   r:  r[   rR   rR   rS   rZ     s    z_SignalReceiver.__enter__r\   r]   r^   r_   r`   c                 C  s   | j |||S rN   )r>  rd   re   rR   rR   rS   rd     s    z_SignalReceiver.__exit__c                 C  s   | S rN   rR   r[   rR   rR   rS   	__aiter__  s    z_SignalReceiver.__aiter__r
   c                   s   | j  I d H }t|S rN   )r:  	__anext__r
   )rW   signumrR   rR   rS   r@    s    z_SignalReceiver.__anext__N)	rr   rs   rt   r   rX   rZ   rd   r?  r@  rR   rR   rR   rS   r9    s   
r9  c                   @  s   e Zd ZdddddZddddd	d
dZddddZdddddZddd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 )(
TestRunnerr   rT   optionsrM   c                 K  s$   ddl m} | | _d | _|| _d S )Nr   )Queue)queuerE  _call_queue_send_stream_options)rW   rD  rE  rR   rR   rS   rX     s    zTestRunner.__init__r\   r]   ztypes.TracebackType | Noner`   c                 C  s,   | j r(| j   | j d k	r(| j   qd S rN   )rH  r   rG  getre   rR   rR   rS   rd     s    

zTestRunner.__exit__rY   c                   s   t d\| _}|l |2 z^3 d H W \}}z|I d H }W n0 tk
rf } z|t| W 5 d }~X Y qX |t| q6 W 5 Q R X d S r  )r1   rH  r   r  r   r   )rW   Zreceive_streamcorooutcome_holderretvalr   rR   rR   rS   _run_tests_and_fixtures  s     z"TestRunner._run_tests_and_fixturesrJ   )outcomerM   c                 C  s
   d | _ d S rN   )rH  )rW   rO  rR   rR   rS   _main_task_finished  s    zTestRunner._main_task_finishedz Callable[P, Awaitable[T_Retval]]zP.argszP.kwargsrF   )r   r   rL   rM   c                 O  s~   | j d krFtjj| jf| jj| jd| j | j d krF| j	   q.g }| j 
||||f |sr| j	   q`|d  S )N)Zrun_sync_soon_threadsafeZdone_callbackr   )rH  rU   r   Zstart_guest_runrN  rG  putrP  rI  rJ  Zsend_nowaitunwrap)rW   r   r   rL   rL  rR   rR   rS   _call_in_runner_task  s     

zTestRunner._call_in_runner_taskz,Callable[..., AsyncGenerator[T_Retval, Any]]r   zIterable[T_Retval])fixture_funcrL   rM   c                 c  s^   |f |}|  |jd }|V  z|  |jd  W n tk
rD   Y nX |  |j tdd S )Nz$Async generator fixture did not stop)rS  asendStopAsyncIterationr   r   )rW   rT  rL   ZasyncgenZfixturevaluerR   rR   rS   run_asyncgen_fixture+  s    
zTestRunner.run_asyncgen_fixturez,Callable[..., Coroutine[Any, Any, T_Retval]]c                 C  s   | j |f|S rN   rS  )rW   rT  rL   rR   rR   rS   run_fixture=  s    zTestRunner.run_fixturez'Callable[..., Coroutine[Any, Any, Any]])	test_funcrL   rM   c                 C  s   | j |f| d S rN   rX  )rW   rZ  rL   rR   rR   rS   run_testD  s    zTestRunner.run_testN)rr   rs   rt   rX   rd   rN  rP  rS  rW  rY  r[  rR   rR   rR   rS   rB    s   rB  c                   @  sT  e Zd Zeddd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	edd	ddZ
edddddZeejddd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-d.Zedd0ddd1dd2d3d4Zedd	d5d6Zeddddd7d8d9Zed0dddd7d:d;Zed<d	d=d>Zed/d/dd?d@ddAdAdAdBdCddDdE	dFdGZedHddIdJdKZeddLdMdNdOdPdQdRZedSdTdUdVdWZedXdYdZd[d\ZedXdYdZd]d^Zed_dNdNdd`dadbdcZeedXddddedfdgZ eedXdSdhdedidgZ edXdjdkdedldgZ edmdmdmdmdndodpdqdrdMdMdsdtdudvZ!eddwdMdxdydzd{Z"edXddZd|d}Z#edXddZd~dZ$ed+d	ddZ%edddddZ&edd	ddZ'edd	ddZ(edd	ddZ)edddddZ*d/S )TrioBackendz1Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]]r   r   rF   )r   r   rL   rD  rM   c                 C  s   t j|f| S rN   )rU   run)rQ   r   r   rL   rD  rR   rR   rS   r]  K  s    zTrioBackend.runrJ   rY   c                 C  s
   t j S rN   )rU   r   r   r   rR   rR   rS   current_tokenU  s    zTrioBackend.current_tokenrg   c                 C  s   t  S rN   )rU   current_timer   rR   rR   rS   r_  Y  s    zTrioBackend.current_timeztype[BaseException]c                 C  s   t jS rN   )rU   r   r   rR   rR   rS   cancelled_exception_class]  s    z%TrioBackend.cancelled_exception_classrT   c                   s   t j I d H  d S rN   )rU   r   r   r   rR   rR   rS   r   a  s    zTrioBackend.checkpointc                   s   t j I d H  d S rN   )rU   r   checkpoint_if_cancelledr   rR   rR   rS   ra  e  s    z#TrioBackend.checkpoint_if_cancelledc                   s   t j I d H  d S rN   )rU   r   cancel_shielded_checkpointr   rR   rR   rS   rb  i  s    z&TrioBackend.cancel_shielded_checkpoint)delayrM   c                   s   t |I d H  d S rN   )rU   r   )rQ   rc  rR   rR   rS   r   m  s    zTrioBackend.sleepFri   rq   rm   zabc.CancelScope)ri   rq   rM   c                C  s   t ||dS )Nrd  r7   )rQ   ri   rq   rR   rR   rS   create_cancel_scopeq  s    zTrioBackend.create_cancel_scopec                 C  s   t  S rN   )rU   current_effective_deadliner   rR   rR   rS   rf  w  s    z&TrioBackend.current_effective_deadlinezabc.TaskGroupc                 C  s   t  S rN   )rw   r   rR   rR   rS   create_task_group{  s    zTrioBackend.create_task_groupz	abc.Eventc                 C  s   t  S rN   r4   r   rR   rR   rS   create_event  s    zTrioBackend.create_eventr3   )r'  rM   c                 C  s   t |S rN   r2   )rQ   r'  rR   rR   rS   create_capacity_limiter  s    z#TrioBackend.create_capacity_limiterNz&Callable[[Unpack[PosArgsT]], T_Retval]zabc.CapacityLimiter | None)r   r   abandon_on_cancellimiterrM   c                   s:   dd fdd}t  t||ttj|dI d H S )NrF   rY   c                
     s*   t t   W  5 Q R  S Q R X d S rN   )r+   r\  rR   r   r   tokenrR   rS   wrapper  s    z6TrioBackend.run_sync_in_worker_thread.<locals>.wrapper)rj  rk  )r\  r^  r%   r   rU   r3   )rQ   r   r   rj  rk  rn  rR   rl  rS   run_sync_in_worker_thread  s    
z%TrioBackend.run_sync_in_worker_threadc                 C  s   t j  d S rN   )rU   r   check_cancelledr   rR   rR   rS   rp    s    zTrioBackend.check_cancelled)r   r   rm  rM   c                 C  s   t jj|f| S rN   )rU   r   r]  rQ   r   r   rm  rR   rR   rS   run_async_from_thread  s    z!TrioBackend.run_async_from_threadc                 C  s   t jj|f| S rN   )rU   r   r%   rq  rR   rR   rS   run_sync_from_thread  s    z TrioBackend.run_sync_from_threadzabc.BlockingPortalc                 C  s   t  S rN   )r   r   rR   rR   rS   create_blocking_portal  s    z"TrioBackend.create_blocking_portal)cwdenvstart_new_sessionz#str | bytes | Sequence[str | bytes]zint | IO[Any] | Nonezstr | bytes | PathLike | NonezMapping[str, str] | Noner   )	commandshellr   r   r   ru  rv  rw  rM   c             
     sl   t jj||||||||dI d H }	|	jr2t|	jnd }
|	jrFt|	jnd }|	jrZt|	jnd }t|	|
||S )N)r   r   r   ry  ru  rv  rw  )	rU   r   open_processr   r   r   r   r   r   )rQ   rx  ry  r   r   r   ru  rv  rw  r   Zstdin_streamZstdout_streamZstderr_streamrR   rR   rS   rz    s    
zTrioBackend.open_processr   r   c                 C  s   t jt| d S rN   )rU   r   Zspawn_system_taskr   )rQ   r   rR   rR   rS   #setup_process_pool_exit_at_shutdown  s    z/TrioBackend.setup_process_pool_exit_at_shutdownstrr   zIPSockAddrType | Noner   )hostportlocal_addressrM   c                   s   d|krt jnt j}tj  |}|t jt jd |rF||I d H  z|||fI d H  W n t	k
r|   |
   Y nX t|S )N:r   )r   AF_INET6AF_INETrU   r  r  r  bindconnectr   r   r   )rQ   r}  r~  r  familyr   rR   rR   rS   connect_tcp  s    zTrioBackend.connect_tcpzstr | byteszabc.UNIXSocketStream)pathrM   c                   sJ   t jtj}z||I d H  W n tk
r@   |   Y nX t|S rN   )rU   r   AF_UNIXr  r   r   r   )rQ   r  r   rR   rR   rS   connect_unix  s    zTrioBackend.connect_unixr   zabc.SocketListener)sockrM   c                 C  s   t |S rN   )r  rQ   r  rR   rR   rS   create_tcp_listener  s    zTrioBackend.create_tcp_listenerc                 C  s   t |S rN   )r  r  rR   rR   rS   create_unix_listener  s    z TrioBackend.create_unix_listenerzsocket.AddressFamilyzUDPSocket | ConnectedUDPSocket)r  r  remote_address
reuse_portrM   c                   sd   t jj|tjd}|r(|tjtjd |r<||I d H  |rX||I d H  t|S t	|S d S )N)r  typer   )
rU   r   
SOCK_DGRAMr  r   SO_REUSEPORTr  r  r  r  )rQ   r  r  r  r  r   rR   rR   rS   create_udp_socket  s    zTrioBackend.create_udp_socketzabc.UNIXDatagramSocket)r  remote_pathrM   c                   s   d S rN   rR   rQ   r  r  rR   rR   rS   create_unix_datagram_socket  s    z'TrioBackend.create_unix_datagram_socketzabc.ConnectedUNIXDatagramSocketc                   s   d S rN   rR   r  rR   rR   rS   r    s    zstr | bytes | Nonez8abc.UNIXDatagramSocket | abc.ConnectedUNIXDatagramSocketc                   s4   t j|}|r(||I d H  t|S t|S d S rN   )rU   r   r
  r  r   r  )rQ   r  r  r   rR   rR   rS   r    s
    r   )r  r  protor   zbytes | str | Nonezstr | int | Nonezint | AddressFamilyzint | SocketKindz]list[tuple[AddressFamily, SocketKind, int, str, tuple[str, int] | tuple[str, int, int, int]]])r}  r~  r  r  r  r   rM   c                  s   t j||||||I d H S rN   )rU   r   getaddrinfo)rQ   r}  r~  r  r  r  r   rR   rR   rS   r  )  s    zTrioBackend.getaddrinfor9   ztuple[str, str])sockaddrr   rM   c                   s   t j||I d H S rN   )rU   r   getnameinfo)rQ   r  r   rR   rR   rS   r  >  s    zTrioBackend.getnameinfoc              
     sj   zt |I d H  W nR tjk
rF } zt |jd W 5 d }~X Y n  tjk
rd   tdd Y nX d S )Nr   )r"   rU   r.   with_traceback__traceback__r-   rQ   r  r   rR   rR   rS   wait_socket_readableD  s     z TrioBackend.wait_socket_readablec              
     sj   zt |I d H  W nR tjk
rF } zt |jd W 5 d }~X Y n  tjk
rd   tdd Y nX d S )Nr   )r#   rU   r.   r  r  r-   r  rR   rR   rS   wait_socket_writableM  s     z TrioBackend.wait_socket_writablec                 C  sB   z
t  W S  tk
r<   ttj d}t | | Y S X d S )Nr&  )r8  rJ  LookupErrorr3   rU   Z	to_threadcurrent_default_thread_limiterr%  )rQ   rk  rR   rR   rS   r  V  s    

z*TrioBackend.current_default_thread_limiterr
   z&ContextManager[AsyncIterator[Signals]])r;  rM   c                 G  s   t |S rN   )r9  )rQ   r;  rR   rR   rS   r=  a  s    z TrioBackend.open_signal_receiverr)   c                 C  s:   t  }d }|jr$|jjr$t|jj}tt|||j|jS rN   )r!   Zparent_nurseryparent_taskidr)   r   rK  )rQ   taskZ	parent_idrR   rR   rS   get_current_taskg  s
    zTrioBackend.get_current_taskzlist[TaskInfo]c              	   C  s   t  }|sttt|d |j|jg}|j}|r~g }|D ]>}|jD ]2}|tt|t|j	|j|j |
|j qBq8|}q,|S rN   )r    r)  r)   r  r   rK  Zchild_nurseriesZchild_tasksr  r  extend)rQ   Z	root_taskZ
task_infosZ	nurseriesZnew_nurseriesZnurseryr  rR   rR   rS   get_running_tasksq  s&    
   zTrioBackend.get_running_tasksc                   s   ddl m} | I d H  d S )Nr   )wait_all_tasks_blocked)Ztrio.testingr  )rQ   r  rR   rR   rS   r    s    z"TrioBackend.wait_all_tasks_blockedrB  rC  c                 C  s
   t f |S rN   )rB  )rQ   rD  rR   rR   rS   create_test_runner  s    zTrioBackend.create_test_runner)FN)N)r   )+rr   rs   rt   classmethodr]  r^  r_  r`  r   ra  rb  r   r   r   re  rf  rg  rh  ri  ro  rp  rr  rs  rt  rz  r{  r  r  r  r  r  r   r  r  r  r  r  r  r=  r  r  r  r  rR   rR   rR   rS   r\  J  s   	   	$ 
  
	r\  )
__future__r   r   r   r   systypescollections.abcr   r   concurrent.futuresr   Zdataclassesr   	functoolsr   ior   osr	   r   r
   r   r   r   typingr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ztrio.from_threadrU   Ztrio.lowlevelrO  r   r   r   r    r!   r"   r#   Ztrio.socketr$   r   Ztrio.to_threadr%    r'   r(   r)   r*   Z_core._eventloopr+   Z_core._exceptionsr,   r-   r.   r/   Z_core._socketsr0   Z_core._streamsr1   Z_core._synchronizationr3   ZBaseCapacityLimiterr5   Z	BaseEventr6   Z_core._tasksr8   ZBaseCancelScoper9   r:   r;   Zabc._eventloopr<   Zstreams.memoryr=   version_infor@   Ztyping_extensionsrB   rC   ZexceptiongrouprD   rE   rF   r|  rG   rH   rI   r   ZRunVarrw   r   ZByteReceiveStreamr   ZByteSendStreamr   r   Z
Instrumentr   r   r   r   r   r   r   ZSocketListenerr  r  r  r  r  r   r8  r9  rB  r\  Zbackend_classrR   rR   rR   rS   <module>   s    D7; 8!C
 L W  I