o
    ^h                     @   sX  d Z d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 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 dd ZG dd dejejZG dd deejZG dd deejZG dd deZG dd deejZG dd deeejZ G dd deeejZ!G dd de
j"Z#dS ) zEvent loop using a proactor and related classes.

A proactor is a "notify-on-completion" multiplexer.  Currently a
proactor is only implemented on Windows with IOCP.
)BaseProactorEventLoop    N   )base_events)	constants)futures)
exceptions)	protocols)sslproto)
transports)trsock)loggerc                 C   s   t || jd< z	| | jd< W n tjy(   | j r&tj	d|dd Y nw d| jvrIz
|
 | jd< W d S  tjyH   d | jd< Y d S w d S )NsocketZsocknamezgetsockname() failed on %rTexc_infopeername)r   TransportSocket_extragetsocknamer   error_loop	get_debugr   warninggetpeername)	transportsock r   )  /home/conda/feedstock_root/build_artifacts/python-split_1761171407825/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehol/lib/python3.10/asyncio/proactor_events.py_set_socket_extra   s"   

r   c                       s   e Zd ZdZ		d fdd	Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
ejfddZdddZdd Zdd Zdd Z  ZS )_ProactorBasePipeTransportz*Base class for pipe and socket transports.Nc                    s   t  || | | || _| | || _d | _d | _d | _d| _	d| _
d| _d| _d| _| jd ur9| j  | j| jj|  |d urQ| jtj|d  d S d S )Nr   F)super__init__
_set_extra_sockset_protocol_server_buffer	_read_fut
_write_fut_pending_write
_conn_lost_closing_called_connection_lost_eof_writtenZ_attachr   	call_soon	_protocolZconnection_mader   Z_set_result_unless_cancelledselfloopr   protocolwaiterextraserver	__class__r   r   r    2   s*   




z#_ProactorBasePipeTransport.__init__c                 C   s   | j jg}| jd u r|d n| jr|d | jd ur(|d| j   | jd ur6|d| j | jd urD|d| j | jrR|dt	| j  | j
rZ|d dd	|S )
Nclosedclosingzfd=zread=zwrite=zwrite_bufsize=zEOF writtenz<{}> )r7   __name__r"   appendr*   filenor&   r'   r%   lenr,   formatjoin)r0   infor   r   r   __repr__I   s    






z#_ProactorBasePipeTransport.__repr__c                 C   s   || j d< d S )Npipe)r   r0   r   r   r   r   r!   [      z%_ProactorBasePipeTransport._set_extrac                 C   s
   || _ d S Nr.   )r0   r2   r   r   r   r#   ^      
z'_ProactorBasePipeTransport.set_protocolc                 C      | j S rF   rG   r0   r   r   r   get_protocola      z'_ProactorBasePipeTransport.get_protocolc                 C   rI   rF   )r*   rJ   r   r   r   
is_closingd   rL   z%_ProactorBasePipeTransport.is_closingc                 C   s`   | j rd S d| _ |  jd7  _| js| jd u r| j| jd  | jd ur.| j  d | _d S d S )NTr   )	r*   r)   r%   r'   r   r-   _call_connection_lostr&   cancelrJ   r   r   r   closeg   s   


z _ProactorBasePipeTransport.closec                 C   s0   | j d ur|d| t| d | j   d S d S )Nzunclosed transport )source)r"   ResourceWarningrP   )r0   _warnr   r   r   __del__r   s   
z"_ProactorBasePipeTransport.__del__Fatal error on pipe transportc              	   C   sn   z0t |tr| j rtjd| |dd n| j||| | jd W | | d S W | | d S | | w )Nz%r: %sTr   )message	exceptionr   r2   )	
isinstanceOSErrorr   r   r   debugcall_exception_handlerr.   _force_close)r0   excrV   r   r   r   _fatal_errorw   s   


 z'_ProactorBasePipeTransport._fatal_errorc                 C   s   | j d ur| j  s|d u r| j d  n| j | | jr#| jr#d S d| _|  jd7  _| jr8| j  d | _| j	rC| j	  d | _	d| _
d | _| j| j| d S )NTr   r   )_empty_waiterdone
set_resultset_exceptionr*   r+   r)   r'   rO   r&   r(   r%   r   r-   rN   )r0   r]   r   r   r   r\      s"   

z'_ProactorBasePipeTransport._force_closec              	   C   s   | j rd S z6| j| W t| jdr!| j dkr!| jtj | j	  d | _| j
}|d ur7|  d | _
d| _ d S t| jdrP| j dkrP| jtj | j	  d | _| j
}|d urf|  d | _
d| _ w )NshutdownT)r+   r.   Zconnection_losthasattrr"   r=   rc   r   	SHUT_RDWRrP   r$   Z_detach)r0   r]   r5   r   r   r   rN      s,   


z0_ProactorBasePipeTransport._call_connection_lostc                 C   s"   | j }| jd ur|t| j7 }|S rF   )r(   r%   r>   )r0   sizer   r   r   get_write_buffer_size   s   
z0_ProactorBasePipeTransport.get_write_buffer_sizeNNN)rU   )r;   
__module____qualname____doc__r    rB   r!   r#   rK   rM   rP   warningswarnrT   r^   r\   rN   rh   __classcell__r   r   r6   r   r   .   s     
r   c                       sX   e Zd ZdZ		d fdd	Zdd Zdd	 Zd
d Zdd Zdd Z	dddZ
  ZS )_ProactorReadPipeTransportzTransport for read pipes.N   c                    sD   d| _ d| _t |||||| t|| _| j| j d| _d S )Nrd   TF)	_pending_data_length_pausedr   r    	bytearray_datar   r-   _loop_reading)r0   r1   r   r2   r3   r4   r5   Zbuffer_sizer6   r   r   r       s   

z#_ProactorReadPipeTransport.__init__c                 C   s   | j  o| j S rF   )rs   r*   rJ   r   r   r   
is_reading   s   z%_ProactorReadPipeTransport.is_readingc                 C   s4   | j s| jrd S d| _| j rtd|  d S d S )NTz%r pauses reading)r*   rs   r   r   r   rZ   rJ   r   r   r   pause_reading   s   
z(_ProactorReadPipeTransport.pause_readingc                 C   s~   | j s| jsd S d| _| jd u r| j| jd  | j}d| _|dkr0| j| j| jd | | | j	 r=t
d|  d S d S )NFrd   z%r resumes reading)r*   rs   r&   r   r-   rv   rr   _data_receivedru   r   r   rZ   )r0   lengthr   r   r   resume_reading   s   

z)_ProactorReadPipeTransport.resume_readingc              
   C   s~   | j  rtd|  z| j }W n" ttfy     ty4 } z| 	|d W Y d }~d S d }~ww |s=| 
  d S d S )Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.)r   r   r   rZ   r.   Zeof_received
SystemExitKeyboardInterruptBaseExceptionr^   rP   )r0   Z	keep_openr]   r   r   r   _eof_received   s    
z(_ProactorReadPipeTransport._eof_receivedc              
   C   s   | j r| jdks
J || _d S |dkr|   d S t| jtjrMz
t| j| W d S  tt	fy4     t
yL } z| |d W Y d }~d S d }~ww | j| d S )Nrd   r   z3Fatal error: protocol.buffer_updated() call failed.)rs   rr   r   rX   r.   r   ZBufferedProtocolZ_feed_data_to_buffered_protor|   r}   r~   r^   Zdata_received)r0   datarz   r]   r   r   r   ry      s(   z)_ProactorReadPipeTransport._data_receivedc              
   C   s  d}d }zza|d urD| j |u s| j d u r| jsJ d | _ | r@| }|dkr8W W |dkr6| || d S d S | jd | }n|  | jrWW W |dkrU| || d S d S | jse| jj	
| j| j| _ W nb ty } z| jsx| |d n| j rtjddd W Y d }~nId }~w ty } z| | W Y d }~n3d }~w ty } z| |d W Y d }~nd }~w tjy   | jsƂ Y nw | js| j | j W |dkr| || d S d S |dkr| || w w )Nrd   r   z"Fatal read error on pipe transportz*Read error on pipe transport while closingTr   )r&   r*   r`   resultry   ru   rO   rs   r   	_proactor	recv_intor"   ConnectionAbortedErrorr^   r   r   rZ   ConnectionResetErrorr\   rY   r   CancelledErroradd_done_callbackrv   )r0   futrz   r   r]   r   r   r   rv     sh   "
z(_ProactorReadPipeTransport._loop_reading)NNNrq   rF   )r;   rj   rk   rl   r    rw   rx   r{   r   ry   rv   ro   r   r   r6   r   rp      s    
rp   c                       s^   e Zd ZdZdZ fddZdd Zddd	Zd
d Zdd Z	dd Z
dd Zdd Z  ZS )_ProactorBaseWritePipeTransportzTransport for write pipes.Tc                    s   t  j|i | d | _d S rF   )r   r    r_   r0   argskwr6   r   r   r    M  s   
z(_ProactorBaseWritePipeTransport.__init__c                 C   s   t |tttfstdt|j | jrtd| j	d ur"td|s&d S | j
r=| j
tjkr4td |  j
d7  _
d S | jd u rS| jd u sIJ | jt|d d S | jsat|| _|   d S | j| |   d S )Nz/data argument must be a bytes-like object, not zwrite_eof() already calledz(unable to write; sendfile is in progresszsocket.send() raised exception.r   )r   )rX   bytesrt   
memoryview	TypeErrortyper;   r,   RuntimeErrorr_   r)   r   !LOG_THRESHOLD_FOR_CONNLOST_WRITESr   r   r'   r%   _loop_writing_maybe_pause_protocolextend)r0   r   r   r   r   writeQ  s2   



z%_ProactorBaseWritePipeTransport.writeNc              
   C   s  z|d ur| j d u r| jrW d S || j u sJ d | _ d| _|r#|  |d u r-| j}d | _|sI| jr:| j| jd  | jrD| j	
tj |   n.| jj| j	|| _ | j  sp| jdks_J t|| _| j | j |   n| j | j | jd ur| j d u r| jd  W d S W d S W d S  ty } z| | W Y d }~d S d }~w ty } z| |d W Y d }~d S d }~ww )Nr   z#Fatal write error on pipe transport)r'   r*   r(   r   r%   r   r-   rN   r,   r"   rc   r   SHUT_WR_maybe_resume_protocolr   sendr`   r>   r   r   r   r_   ra   r   r\   rY   r^   )r0   fr   r]   r   r   r   r   w  sD   



z-_ProactorBaseWritePipeTransport._loop_writingc                 C      dS NTr   rJ   r   r   r   can_write_eof     z-_ProactorBaseWritePipeTransport.can_write_eofc                 C   s   |    d S rF   )rP   rJ   r   r   r   	write_eof  s   z)_ProactorBaseWritePipeTransport.write_eofc                 C      |  d  d S rF   r\   rJ   r   r   r   abort  rE   z%_ProactorBaseWritePipeTransport.abortc                 C   s:   | j d ur	td| j | _ | jd u r| j d  | j S )NzEmpty waiter is already set)r_   r   r   Zcreate_futurer'   ra   rJ   r   r   r   _make_empty_waiter  s   

z2_ProactorBaseWritePipeTransport._make_empty_waiterc                 C   s
   d | _ d S rF   )r_   rJ   r   r   r   _reset_empty_waiter  rH   z3_ProactorBaseWritePipeTransport._reset_empty_waiterNN)r;   rj   rk   rl   Z_start_tls_compatibler    r   r   r   r   r   r   r   ro   r   r   r6   r   r   G  s    
&)r   c                       s$   e Zd Z fddZdd Z  ZS )_ProactorWritePipeTransportc                    s8   t  j|i | | jj| jd| _| j| j d S )N   )	r   r    r   r   recvr"   r&   r   _pipe_closedr   r6   r   r   r      s   z$_ProactorWritePipeTransport.__init__c                 C   sx   |  rd S | dksJ | jr| jd u sJ d S || ju s&J || jfd | _| jd ur6| t  d S |   d S )N    )	cancelledr   r*   r&   r'   r\   BrokenPipeErrorrP   )r0   r   r   r   r   r     s   
z(_ProactorWritePipeTransport._pipe_closed)r;   rj   rk   r    r   ro   r   r   r6   r   r     s    r   c                       s\   e Zd ZdZ		d fdd	Zdd Zdd Zd	d
 ZdddZdddZ	dddZ
  ZS )_ProactorDatagramTransporti   Nc                    s>   || _ d | _t j|||||d t | _| j| j	 d S )N)r3   r4   )
_addressr_   r   r    collectionsdequer%   r   r-   rv   )r0   r1   r   r2   addressr3   r4   r6   r   r   r      s
   
z#_ProactorDatagramTransport.__init__c                 C      t | | d S rF   r   rD   r   r   r   r!     rE   z%_ProactorDatagramTransport._set_extrac                 C   s   t dd | jD S )Nc                 s   s    | ]	\}}t |V  qd S rF   )r>   ).0r   _r   r   r   	<genexpr>  s    zC_ProactorDatagramTransport.get_write_buffer_size.<locals>.<genexpr>)sumr%   rJ   r   r   r   rh     s   z0_ProactorDatagramTransport.get_write_buffer_sizec                 C   r   rF   r   rJ   r   r   r   r     rE   z _ProactorDatagramTransport.abortc                 C   s   t |tttfstdt||sd S | jd ur'|d | jfvr'td| j | jrA| jrA| jt	j
kr8td |  jd7  _d S | jt||f | jd u rT|   |   d S )Nz,data argument must be bytes-like object (%r)z!Invalid address: must be None or z!socket.sendto() raised exception.r   )rX   r   rt   r   r   r   r   
ValueErrorr)   r   r   r   r   r%   r<   r'   r   r   )r0   r   addrr   r   r   sendto  s&   


z!_ProactorDatagramTransport.sendtoc              
   C   s"  zR| j rW d S || ju sJ d | _|r|  | jr | j r.| jr.| jr+| j| jd  W d S | j	 \}}| jd urE| jj
| j|| _n| jj
j| j||d| _W n1 tyk } z| j| W Y d }~d S d }~w ty } z| |d W Y d }~d S d }~ww | j| j |   d S )N)r   z'Fatal write error on datagram transport)r)   r'   r   r%   r   r*   r   r-   rN   popleftr   r   r"   r   rY   r.   error_received	Exceptionr^   r   r   r   )r0   r   r   r   r]   r   r   r   r     s<   
z(_ProactorDatagramTransport._loop_writingc              
   C   s  d }zz| j rW W |r| j|| d S d S | j|u s%| jd u r#| js%J d | _|d urT| }| jrDd }W W |rB| j|| d S d S | jd urP|| j}}n|\}}| j rfW W |rd| j|| d S d S | jd urw| jj	| j
| j| _n| jj| j
| j| _W n% ty } z| j| W Y d }~nd }~w tjy   | js Y nw | jd ur| j| j W |r| j|| d S d S |r| j|| w w rF   )r)   r.   Zdatagram_receivedr&   r*   r   r   r   r   r   r"   max_sizerecvfromrY   r   r   r   r   rv   )r0   r   r   r   resr]   r   r   r   rv      sf   $


z(_ProactorDatagramTransport._loop_readingri   rF   )r;   rj   rk   r   r    r!   rh   r   r   r   rv   ro   r   r   r6   r   r     s    

!r   c                   @   s    e Zd ZdZdd Zdd ZdS )_ProactorDuplexPipeTransportzTransport for duplex pipes.c                 C   r   )NFr   rJ   r   r   r   r   Q  r   z*_ProactorDuplexPipeTransport.can_write_eofc                 C   s   t rF   )NotImplementedErrorrJ   r   r   r   r   T  r   z&_ProactorDuplexPipeTransport.write_eofN)r;   rj   rk   rl   r   r   r   r   r   r   r   L  s    r   c                       sF   e Zd ZdZejjZ		d fdd	Zdd Z	dd Z
d	d
 Z  ZS )_ProactorSocketTransportz Transport for connected sockets.Nc                    s$   t  |||||| t| d S rF   )r   r    r   Z_set_nodelayr/   r6   r   r   r    _  s   z!_ProactorSocketTransport.__init__c                 C   r   rF   r   rD   r   r   r   r!   d  rE   z#_ProactorSocketTransport._set_extrac                 C   r   r   r   rJ   r   r   r   r   g  r   z&_ProactorSocketTransport.can_write_eofc                 C   s6   | j s| jrd S d| _| jd u r| jtj d S d S r   )r*   r,   r'   r"   rc   r   r   rJ   r   r   r   r   j  s   
z"_ProactorSocketTransport.write_eofri   )r;   rj   rk   rl   r   Z_SendfileModeZ
TRY_NATIVEZ_sendfile_compatibler    r!   r   r   ro   r   r   r6   r   r   X  s    r   c                       s  e Zd Z fddZ		d3ddZ	d4dddddddd	Z	d3d
dZ		d5ddZ		d5ddZ		d5ddZ	 fddZ
dd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd4d&d'Zd(d) Z	*	d6d+d,Zd-d. Zd/d0 Zd1d2 Z  ZS )7r   c                    sl   t    td|jj || _|| _d | _i | _	|
|  |   t t u r4t| j  d S d S )NzUsing proactor: %s)r   r    r   rZ   r7   r;   r   	_selector_self_reading_future_accept_futuresZset_loop_make_self_pipe	threadingcurrent_threadmain_threadsignalset_wakeup_fd_csockr=   )r0   Zproactorr6   r   r   r    t  s   

zBaseProactorEventLoop.__init__Nc                 C      t | |||||S rF   )r   )r0   r   r2   r3   r4   r5   r   r   r   _make_socket_transport     
z,BaseProactorEventLoop._make_socket_transportF)server_sideserver_hostnamer4   r5   ssl_handshake_timeoutc             	   C   s0   t j| ||||||	d}
t| ||
||d |
jS )N)r   r4   r5   )r	   ZSSLProtocolr   Z_app_transport)r0   Zrawsockr2   
sslcontextr3   r   r   r4   r5   r   Zssl_protocolr   r   r   _make_ssl_transport  s   z)BaseProactorEventLoop._make_ssl_transportc                 C   r   rF   )r   )r0   r   r2   r   r3   r4   r   r   r   _make_datagram_transport  r   z.BaseProactorEventLoop._make_datagram_transportc                 C      t | ||||S rF   )r   r0   r   r2   r3   r4   r   r   r   _make_duplex_pipe_transport  s   z1BaseProactorEventLoop._make_duplex_pipe_transportc                 C   r   rF   )rp   r   r   r   r   _make_read_pipe_transport  s   z/BaseProactorEventLoop._make_read_pipe_transportc                 C   r   rF   )r   r   r   r   r   _make_write_pipe_transport  s   z0BaseProactorEventLoop._make_write_pipe_transportc                    sj   |   rtd|  rd S t t u rtd |   | 	  | j
  d | _
d | _t   d S )Nz!Cannot close a running event looprd   )Z
is_runningr   	is_closedr   r   r   r   r   _stop_accept_futures_close_self_piper   rP   r   r   rJ   r6   r   r   rP     s   

zBaseProactorEventLoop.closec                       | j ||I d H S rF   )r   r   )r0   r   nr   r   r   	sock_recv     zBaseProactorEventLoop.sock_recvc                    r   rF   )r   r   )r0   r   bufr   r   r   sock_recv_into  r   z$BaseProactorEventLoop.sock_recv_intoc                    r   rF   )r   r   )r0   r   r   r   r   r   sock_sendall  r   z"BaseProactorEventLoop.sock_sendallc                    r   rF   )r   connect)r0   r   r   r   r   r   sock_connect  r   z"BaseProactorEventLoop.sock_connectc                    s   | j |I d H S rF   )r   acceptrD   r   r   r   sock_accept  s   z!BaseProactorEventLoop.sock_acceptc              
      s  z|  }W n ttjfy } ztdd }~ww zt|j}W n t	y0   tdw |r5|n|}|s;dS t
|d}|rIt
|| |n|}	t
||}d}
z.	 t
|	| |}|dkrl|
W |
dkrk|| S S | j||||I d H  ||7 }|
|7 }
qT|
dkr|| w w )Nznot a regular filer   l    )r=   AttributeErrorioUnsupportedOperationr   ZSendfileNotAvailableErrorosfstatst_sizerY   minseekr   sendfile)r0   r   fileoffsetcountr=   errfsize	blocksizeZend_pos
total_sentr   r   r   _sock_sendfile_native  sD   



z+BaseProactorEventLoop._sock_sendfile_nativec                    sn   |  }|  | I d H  z| j|j|||ddI d H W |  |r*|  S S |  |r6|  w w )NF)fallback)rw   rx   r   Zsock_sendfiler"   r   r{   )r0   Ztranspr   r   r   r{   r   r   r   _sendfile_native  s    

z&BaseProactorEventLoop._sendfile_nativec                 C   sL   | j d ur| j   d | _ | j  d | _| j  d | _|  jd8  _d S )Nr   )r   rO   _ssockrP   r   _internal_fdsrJ   r   r   r   r     s   



z&BaseProactorEventLoop._close_self_pipec                 C   s:   t  \| _| _| jd | jd |  jd7  _d S )NFr   )r   
socketpairr   r   setblockingr   rJ   r   r   r   r     s   z%BaseProactorEventLoop._make_self_pipec              
   C   s   z|d ur	|   | j|urW d S | j| jd}W n/ tjy%   Y d S  ttfy.     t	yI } z| 
d|| d W Y d }~d S d }~ww || _|| j d S )Ni   z.Error on reading from the event loop self pipe)rV   rW   r1   )r   r   r   r   r   r   r   r|   r}   r~   r[   r   _loop_self_reading)r0   r   r]   r   r   r   r    s(   
z(BaseProactorEventLoop._loop_self_readingc                 C   sR   | j }|d u r	d S z|d W d S  ty(   | jr%tjddd Y d S Y d S w )N    z3Fail to write a null byte into the self-pipe socketTr   )r   r   rY   _debugr   rZ   )r0   csockr   r   r   _write_to_self   s   z$BaseProactorEventLoop._write_to_selfd   c                    s(   d fdd	    d S )Nc              
      sJ  zE| d ur7|   \}}jrtd||  }d ur,j||dd|id nj||d|id  r>W d S j} W nQ t	y } z7
 dkrdd|td   njrvtjd	dd
 W Y d }~d S W Y d }~d S W Y d }~d S d }~w tjy     Y d S w | j
 < |   d S )Nz#%r got a new connection from %r: %rTr   )r   r4   r5   r   r   rd   zAccept failed on a socket)rV   rW   r   zAccept failed on socket %rr   )r   r  r   rZ   r   r   r   r   r   rY   r=   r[   r   r   rP   r   r   r   r   )r   connr   r2   r]   r1   protocol_factoryr0   r5   r   r   r   r   r   r1   6  sR   
z2BaseProactorEventLoop._start_serving.<locals>.looprF   )r-   )r0   r
  r   r   r5   backlogr   r   r	  r   _start_serving2  s   %z$BaseProactorEventLoop._start_servingc                 C   s   d S rF   r   )r0   Z
event_listr   r   r   _process_events]  s   z%BaseProactorEventLoop._process_eventsc                 C   s&   | j  D ]}|  q| j   d S rF   )r   valuesrO   clear)r0   futurer   r   r   r   a  s   
z*BaseProactorEventLoop._stop_accept_futuresc                 C   s6   | j | d }|r|  | j| |  d S rF   )r   popr=   rO   r   _stop_servingrP   )r0   r   r  r   r   r   r  f  s
   z#BaseProactorEventLoop._stop_servingri   rF   r   )NNr  N)r;   rj   rk   r    r   r   r   r   r   r   rP   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r  ro   r   r   r6   r   r   r  sP    







+r   )$rl   __all__r   r   r   rm   r   r   r    r   r   r   r   r   r	   r
   r   logr   r   Z_FlowControlMixinZBaseTransportr   ZReadTransportrp   ZWriteTransportr   r   ZDatagramTransportr   Z	Transportr   r   ZBaseEventLoopr   r   r   r   r   <module>   sX      n 