o
    f                     @   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socketsocknamezgetsockname() failed on %rTexc_infopeername)r   TransportSocket_extragetsocknamer   error_loop	get_debugr   warninggetpeername)	transportsock r   ./usr/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_written_attachr   	call_soon	_protocolconnection_mader   _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<{}> )r;   __name__r#   appendr+   filenor'   r(   r&   lenr-   formatjoin)r4   infor   r   r   __repr__I   s    






z#_ProactorBasePipeTransport.__repr__c                 C   s   || j d< d S )Npipe)r   r4   r   r   r   r   r"   [      z%_ProactorBasePipeTransport._set_extrac                 C   s
   || _ d S Nr0   )r4   r6   r   r   r   r$   ^      
z'_ProactorBasePipeTransport.set_protocolc                 C      | j S rJ   rK   r4   r   r   r   get_protocola      z'_ProactorBasePipeTransport.get_protocolc                 C   rM   rJ   )r+   rN   r   r   r   
is_closingd   rP   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'   cancelrN   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#   ResourceWarningrT   )r4   _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   r6   )	
isinstanceOSErrorr   r   r   debugcall_exception_handlerr0   _force_close)r4   excrZ   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(   rS   r'   r)   r&   r   r/   rR   )r4   ra   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,   r0   connection_losthasattrr#   rA   rg   r   	SHUT_RDWRrT   r%   _detach)r4   ra   r9   r   r   r   rR      s,   


z0_ProactorBasePipeTransport._call_connection_lostc                 C   s"   | j }| jd ur|t| j7 }|S rJ   )r)   r&   rB   )r4   sizer   r   r   get_write_buffer_size   s   
z0_ProactorBasePipeTransport.get_write_buffer_sizeNNN)rY   )r?   
__module____qualname____doc__r!   rF   r"   r$   rO   rQ   rT   warningswarnrX   rb   r`   rR   rn   __classcell__r   r   r:   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 )Nrh   TF)	_pending_data_length_pausedr    r!   	bytearray_datar   r/   _loop_reading)r4   r5   r   r6   r7   r8   r9   buffer_sizer:   r   r   r!      s   

z#_ProactorReadPipeTransport.__init__c                 C   s   | j  o| j S rJ   )ry   r+   rN   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+   ry   r   r   r   r^   rN   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 )NFrh   z%r resumes reading)r+   ry   r'   r   r/   r|   rx   _data_receivedr{   r   r   r^   )r4   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   r^   r0   eof_received
SystemExitKeyboardInterruptBaseExceptionrb   rT   )r4   	keep_openra   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 )Nrh   r   z3Fatal error: protocol.buffer_updated() call failed.)ry   rx   r   r\   r0   r   BufferedProtocol_feed_data_to_buffered_protor   r   r   rb   data_received)r4   datar   ra   r   r   r   r      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 )Nrh   r   z"Fatal read error on pipe transportz*Read error on pipe transport while closingTr   )r'   r+   rd   resultr   r{   rS   ry   r   	_proactor	recv_intor#   ConnectionAbortedErrorrb   r   r   r^   ConnectionResetErrorr`   r]   r   CancelledErroradd_done_callbackr|   )r4   futr   r   ra   r   r   r   r|     sh   "
z(_ProactorReadPipeTransport._loop_reading)NNNrw   rJ   )r?   rp   rq   rr   r!   r~   r   r   r   r   r|   ru   r   r   r:   r   rv      s    
rv   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 rJ   )r    r!   rc   r4   argskwr:   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   )r\   bytesrz   
memoryview	TypeErrortyper?   r-   RuntimeErrorrc   r*   r   !LOG_THRESHOLD_FOR_CONNLOST_WRITESr   r   r(   r&   _loop_writing_maybe_pause_protocolextend)r4   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/   rR   r-   r#   rg   r   SHUT_WR_maybe_resume_protocolr   sendrd   rB   r   r   r   rc   re   r   r`   r]   rb   )r4   fr   ra   r   r   r   r   w  sD   



z-_ProactorBaseWritePipeTransport._loop_writingc                 C      dS NTr   rN   r   r   r   can_write_eof     z-_ProactorBaseWritePipeTransport.can_write_eofc                 C   s   |    d S rJ   )rT   rN   r   r   r   	write_eof  s   z)_ProactorBaseWritePipeTransport.write_eofc                 C      |  d  d S rJ   r`   rN   r   r   r   abort  rI   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)rc   r   r   create_futurer(   re   rN   r   r   r   _make_empty_waiter  s   

z2_ProactorBaseWritePipeTransport._make_empty_waiterc                 C   s
   d | _ d S rJ   )rc   rN   r   r   r   _reset_empty_waiter  rL   z3_ProactorBaseWritePipeTransport._reset_empty_waiterNN)r?   rp   rq   rr   _start_tls_compatibler!   r   r   r   r   r   r   r   ru   r   r   r:   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   r:   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`   BrokenPipeErrorrT   )r4   r   r   r   r   r     s   
z(_ProactorWritePipeTransport._pipe_closed)r?   rp   rq   r!   r   ru   r   r   r:   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)r7   r8   )
_addressrc   r    r!   collectionsdequer&   r   r/   r|   )r4   r5   r   r6   addressr7   r8   r:   r   r   r!     s
   
z#_ProactorDatagramTransport.__init__c                 C      t | | d S rJ   r   rH   r   r   r   r"     rI   z%_ProactorDatagramTransport._set_extrac                 C   s   t dd | jD S )Nc                 s   s    | ]	\}}t |V  qd S rJ   )rB   ).0r   _r   r   r   	<genexpr>  s    zC_ProactorDatagramTransport.get_write_buffer_size.<locals>.<genexpr>)sumr&   rN   r   r   r   rn     s   z0_ProactorDatagramTransport.get_write_buffer_sizec                 C   r   rJ   r   rN   r   r   r   r     rI   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   )r\   r   rz   r   r   r   r   
ValueErrorr*   r   r   r   r   r&   r@   r(   r   r   )r4   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/   rR   popleftr   r   r#   r   r]   r0   error_received	Exceptionrb   r   r   r   )r4   r   r   r   ra   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 rJ   )r*   r0   datagram_receivedr'   r+   r   r   r   r   r   r#   max_sizerecvfromr]   r   r   r   r   r|   )r4   r   r   r   resra   r   r   r   r|      sf   $


z(_ProactorDatagramTransport._loop_readingro   rJ   )r?   rp   rq   r   r!   r"   rn   r   r   r   r|   ru   r   r   r:   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   rN   r   r   r   r   Q  r   z*_ProactorDuplexPipeTransport.can_write_eofc                 C   s   t rJ   )NotImplementedErrorrN   r   r   r   r   T  r   z&_ProactorDuplexPipeTransport.write_eofN)r?   rp   rq   rr   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 rJ   )r    r!   r   _set_nodelayr3   r:   r   r   r!   _  s   z!_ProactorSocketTransport.__init__c                 C   r   rJ   r   rH   r   r   r   r"   d  rI   z#_ProactorSocketTransport._set_extrac                 C   r   r   r   rN   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#   rg   r   r   rN   r   r   r   r   j  s   
z"_ProactorSocketTransport.write_eofro   )r?   rp   rq   rr   r   _SendfileMode
TRY_NATIVE_sendfile_compatibler!   r"   r   r   ru   r   r   r:   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   r^   r;   r?   r   	_selector_self_reading_future_accept_futuresset_loop_make_self_pipe	threadingcurrent_threadmain_threadsignalset_wakeup_fd_csockrA   )r4   proactorr:   r   r   r!   t  s   

zBaseProactorEventLoop.__init__Nc                 C      t | |||||S rJ   )r   )r4   r   r6   r7   r8   r9   r   r   r   _make_socket_transport     
z,BaseProactorEventLoop._make_socket_transportF)server_sideserver_hostnamer8   r9   ssl_handshake_timeoutc             	   C   s0   t j| ||||||	d}
t| ||
||d |
jS )N)r   r8   r9   )r	   SSLProtocolr   _app_transport)r4   rawsockr6   
sslcontextr7   r   r   r8   r9   r   ssl_protocolr   r   r   _make_ssl_transport  s   z)BaseProactorEventLoop._make_ssl_transportc                 C   r   rJ   )r   )r4   r   r6   r   r7   r8   r   r   r   _make_datagram_transport  r   z.BaseProactorEventLoop._make_datagram_transportc                 C      t | ||||S rJ   )r   r4   r   r6   r7   r8   r   r   r   _make_duplex_pipe_transport  s   z1BaseProactorEventLoop._make_duplex_pipe_transportc                 C   r   rJ   )rv   r   r   r   r   _make_read_pipe_transport  s   z/BaseProactorEventLoop._make_read_pipe_transportc                 C   r   rJ   )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 looprh   )
is_runningr   	is_closedr   r   r   r   r   _stop_accept_futures_close_self_piper   rT   r   r    rN   r:   r   r   rT     s   

zBaseProactorEventLoop.closec                       | j ||I d H S rJ   )r   r   )r4   r   nr   r   r   	sock_recv     zBaseProactorEventLoop.sock_recvc                    r   rJ   )r   r   )r4   r   bufr   r   r   sock_recv_into  r   z$BaseProactorEventLoop.sock_recv_intoc                    r   rJ   )r   r   )r4   r   r   r   r   r   sock_sendall  r   z"BaseProactorEventLoop.sock_sendallc                    r   rJ   )r   connect)r4   r   r   r   r   r   sock_connect  r   z"BaseProactorEventLoop.sock_connectc                    s   | j |I d H S rJ   )r   acceptrH   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    )rA   AttributeErrorioUnsupportedOperationr   SendfileNotAvailableErrorosfstatst_sizer]   minseekr   sendfile)r4   r   fileoffsetcountrA   errfsize	blocksize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)r~   r   r   sock_sendfiler#   r   r   )r4   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   rS   _ssockrT   r   _internal_fdsrN   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  rN   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)rZ   r[   r5   )r   r   r   r   r  r   r   r   r   r   r_   r   _loop_self_reading)r4   r   ra   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   r]   _debugr   r^   )r4   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   r8   r9   r   r   rh   zAccept failed on a socket)rZ   r[   r   zAccept failed on socket %rr   )r   r"  r   r^   r   r   r   r   r  r]   rA   r_   r   r   rT   r   r   r   r   )r   connr   r6   ra   r5   protocol_factoryr4   r9   r   r   r   r   r   r5   6  sR   
z2BaseProactorEventLoop._start_serving.<locals>.looprJ   )r/   )r4   r(  r   r   r9   backlogr   r   r'  r   _start_serving2  s   %z$BaseProactorEventLoop._start_servingc                 C   s   d S rJ   r   )r4   
event_listr   r   r   _process_events]  s   z%BaseProactorEventLoop._process_eventsc                 C   s&   | j  D ]}|  q| j   d S rJ   )r   valuesrS   clear)r4   futurer   r   r   r   a  s   
z*BaseProactorEventLoop._stop_accept_futuresc                 C   s6   | j | d }|r|  | j| |  d S rJ   )r   poprA   rS   r   _stop_servingrT   )r4   r   r/  r   r   r   r1  f  s
   z#BaseProactorEventLoop._stop_servingro   rJ   r   )NNr%  N)r?   rp   rq   r!   r   r   r   r   r   r   rT   r   r   r   r  r  r  r  r   r   r   r$  r*  r,  r   r1  ru   r   r   r:   r   r   r  sP    







+r   )$rr   __all__r  r	  r   rs   r   r   r    r   r   r   r   r   r	   r
   r   logr   r   _FlowControlMixinBaseTransportr   ReadTransportrv   WriteTransportr   r   DatagramTransportr   	Transportr   r   BaseEventLoopr   r   r   r   r   <module>   sX      n 