o
     JAfc~                     @   sV  	 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 ))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   ./usr/lib/python3.10/asyncio/proactor_events.py_set_socket_extra   s"   

r   c                       s   e 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 )_ProactorBasePipeTransportNc                    s   t  || | | || _| | || _d | _d | _d | _d| _	d| _
d| _d| _| jd ur6| j  | j| jj|  |d urN| 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_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<{}> )r6   __name__r"   appendr*   filenor&   r'   r%   lenr+   formatjoin)r/   infor   r   r   __repr__H   s    






z#_ProactorBasePipeTransport.__repr__c                 C   s   || j d< d S )Npipe)r   r/   r   r   r   r   r!   Z      z%_ProactorBasePipeTransport._set_extrac                 C   s
   || _ d S Nr-   )r/   r1   r   r   r   r#   ]      
z'_ProactorBasePipeTransport.set_protocolc                 C      | j S rE   rF   r/   r   r   r   get_protocol`      z'_ProactorBasePipeTransport.get_protocolc                 C   rH   rE   )r*   rI   r   r   r   
is_closingc   rK   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&   cancelrI   r   r   r   closef   s   


z _ProactorBasePipeTransport.closec                 C   s0   | j d ur|d| t| d | j   d S d S )Nzunclosed transport )source)r"   ResourceWarningrO   )r/   _warnr   r   r   __del__q   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   r1   )	
isinstanceOSErrorr   r   r   debugcall_exception_handlerr-   _force_close)r/   excrU   r   r   r   _fatal_errorv   s   


 z'_ProactorBasePipeTransport._fatal_errorc                 C   s   | j d ur| j  s|d u r| j d  n| j | | jr d S d| _|  jd7  _| jr5| j  d | _| jr@| j  d | _d| _	d | _
| j| j| d S )NTr   r   )_empty_waiterdone
set_resultset_exceptionr*   r)   r'   rN   r&   r(   r%   r   r,   rM   )r/   r\   r   r   r   r[      s"   

z'_ProactorBasePipeTransport._force_closec              	   C   s   z5| j | W t| jdr| j dkr| jtj | j  d | _| j	}|d ur4|
  d | _	d S d S t| jdrJ| j dkrJ| jtj | j  d | _| j	}|d ur`|
  d | _	w )Nshutdown)r-   Zconnection_losthasattrr"   r<   rb   r   	SHUT_RDWRrO   r$   Z_detach)r/   r\   r4   r   r   r   rM      s&   


z0_ProactorBasePipeTransport._call_connection_lostc                 C   s"   | j }| jd ur|t| j7 }|S rE   )r(   r%   r=   )r/   sizer   r   r   get_write_buffer_size   s   
z0_ProactorBasePipeTransport.get_write_buffer_sizeNNN)rT   )r:   
__module____qualname__r    rA   r!   r#   rJ   rL   rO   warningswarnrS   r]   r[   rM   rg   __classcell__r   r   r5   r   r   .   s     
r   c                       sV   e 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 )_ProactorReadPipeTransportN   c                    sD   d| _ d| _t |||||| t|| _| j| j d| _d S )Nrc   TF)	_pending_data_length_pausedr   r    	bytearray_datar   r,   _loop_reading)r/   r0   r   r1   r2   r3   r4   Zbuffer_sizer5   r   r   r       s   

z#_ProactorReadPipeTransport.__init__c                 C   s   | j  o| j S rE   )rq   r*   rI   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*   rq   r   r   r   rY   rI   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 )NFrc   z%r resumes reading)r*   rq   r&   r   r,   rt   rp   _data_receivedrs   r   r   rY   )r/   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   rY   r-   Zeof_received
SystemExitKeyboardInterruptBaseExceptionr]   rO   )r/   Z	keep_openr\   r   r   r   _eof_received   s    
z(_ProactorReadPipeTransport._eof_receivedc              
   C   s   | j r|| _d S |dkr|   d S t| jtjrFz
t| j| W d S  tt	fy-     t
yE } z| |d W Y d }~d S d }~ww | j| d S )Nr   z3Fatal error: protocol.buffer_updated() call failed.)rq   rp   r}   rW   r-   r   ZBufferedProtocolZ_feed_data_to_buffered_protorz   r{   r|   r]   Zdata_received)r/   datarx   r\   r   r   r   rw      s&   z)_ProactorReadPipeTransport._data_receivedc              
   C   s  d}d }zzR|d ur5d | _ | r1| }|dkr)W W |dkr'| || d S d S | jd | }n|  | jrHW W |dkrF| || d S d S | jsV| jj	
| j| j| _ W nb ty } z| jsi| |d n| j rut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 )Nrc   r   z"Fatal read error on pipe transportz*Read error on pipe transport while closingTr   )r&   r_   resultrw   rs   rN   r*   rq   r   	_proactor	recv_intor"   ConnectionAbortedErrorr]   r   r   rY   ConnectionResetErrorr[   rX   r   CancelledErroradd_done_callbackrt   )r/   futrx   r~   r\   r   r   r   rt     sb   "
z(_ProactorReadPipeTransport._loop_reading)NNNro   rE   )r:   ri   rj   r    ru   rv   ry   r}   rw   rt   rm   r   r   r5   r   rn      s    
rn   c                       s\   e 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 )_ProactorBaseWritePipeTransportTc                    s   t  j|i | d | _d S rE   )r   r    r^   r/   argskwr5   r   r   r    I  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 rL| jt|d d S | jsZt|| _|   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~   )rW   bytesrr   
memoryview	TypeErrortyper:   r+   RuntimeErrorr^   r)   r   !LOG_THRESHOLD_FOR_CONNLOST_WRITESr   r   r'   _loop_writingr%   _maybe_pause_protocolextend)r/   r~   r   r   r   writeM  s0   



z%_ProactorBaseWritePipeTransport.writeNc              
   C   sd  z|d ur| j d u r| jrW d S d | _ d| _|r|  |d u r&| j}d | _|sB| jr3| j| jd  | jr=| j	
tj |   n'| jj| j	|| _ | j  sbt|| _| 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,   rM   r+   r"   rb   r   SHUT_WR_maybe_resume_protocolr   sendr_   r=   r   r   r   r^   r`   r   r[   rX   r]   )r/   fr~   r\   r   r   r   r   s  s@   



z-_ProactorBaseWritePipeTransport._loop_writingc                 C      dS NTr   rI   r   r   r   can_write_eof     z-_ProactorBaseWritePipeTransport.can_write_eofc                 C   s   |    d S rE   )rO   rI   r   r   r   	write_eof  s   z)_ProactorBaseWritePipeTransport.write_eofc                 C      |  d  d S rE   r[   rI   r   r   r   abort  rD   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'   r`   rI   r   r   r   _make_empty_waiter  s   

z2_ProactorBaseWritePipeTransport._make_empty_waiterc                 C   s
   d | _ d S rE   )r^   rI   r   r   r   _reset_empty_waiter  rG   z3_ProactorBaseWritePipeTransport._reset_empty_waiterNN)r:   ri   rj   Z_start_tls_compatibler    r   r   r   r   r   r   r   rm   r   r   r5   r   r   C  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   r5   r   r   r      s   z$_ProactorWritePipeTransport.__init__c                 C   sB   |  rd S | jrd S d | _| jd ur| t  d S |   d S rE   )	cancelledr*   r&   r'   r[   BrokenPipeErrorrO   )r/   r   r   r   r   r     s   
z(_ProactorWritePipeTransport._pipe_closed)r:   ri   rj   r    r   rm   r   r   r5   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)r2   r3   )
_addressr^   r   r    collectionsdequer%   r   r,   rt   )r/   r0   r   r1   addressr2   r3   r5   r   r   r      s
   
z#_ProactorDatagramTransport.__init__c                 C      t | | d S rE   r   rC   r   r   r   r!     rD   z%_ProactorDatagramTransport._set_extrac                 C   s   t dd | jD S )Nc                 s   s    | ]	\}}t |V  qd S rE   )r=   ).0r~   _r   r   r   	<genexpr>  s    zC_ProactorDatagramTransport.get_write_buffer_size.<locals>.<genexpr>)sumr%   rI   r   r   r   rg     s   z0_ProactorDatagramTransport.get_write_buffer_sizec                 C   r   rE   r   rI   r   r   r   r     rD   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   )rW   r   rr   r   r   r   r   
ValueErrorr)   r   r   r   r   r%   r;   r'   r   r   )r/   r~   addrr   r   r   sendto  s&   


z!_ProactorDatagramTransport.sendtoc              
   C   s  zK| j rW d S d | _|r|  | jr| j r'| jr'| jr$| j| jd  W d S | j	 \}}| jd ur>| jj
| j|| _n| jj
j| j||d| _W n1 tyd } 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,   rM   popleftr   r   r"   r   rX   r-   error_received	Exceptionr]   r   r   r   )r/   r   r~   r   r\   r   r   r   r     s:   
z(_ProactorDatagramTransport._loop_writingc              
   C   s~  d }zzq| j rW W |r| j|| d S d S d | _|d urE| }| jr5d }W W |r3| j|| d S d S | jd urA|| j}}n|\}}| j rWW W |rU| j|| d S d S | jd urh| 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 rE   )r)   r-   Zdatagram_receivedr&   r   r*   r   r   r   r   r"   max_sizerecvfromrX   r   r   r   r   rt   )r/   r   r~   r   resr\   r   r   r   rt     s`   $


z(_ProactorDatagramTransport._loop_readingrh   rE   )r:   ri   rj   r   r    r!   rg   r   r   r   rt   rm   r   r   r5   r   r     s    

!r   c                   @   s   e Zd Z	 dd Zdd ZdS )_ProactorDuplexPipeTransportc                 C   r   )NFr   rI   r   r   r   r   M  r   z*_ProactorDuplexPipeTransport.can_write_eofc                 C   s   t rE   )NotImplementedErrorrI   r   r   r   r   P  r   z&_ProactorDuplexPipeTransport.write_eofN)r:   ri   rj   r   r   r   r   r   r   r   H  s    r   c                       sD   e Zd Z	 ejjZ		d
 fdd	Zdd Zdd Z	dd	 Z
  ZS )_ProactorSocketTransportNc                    s$   t  |||||| t| d S rE   )r   r    r   Z_set_nodelayr.   r5   r   r   r    [  s   z!_ProactorSocketTransport.__init__c                 C   r   rE   r   rC   r   r   r   r!   `  rD   z#_ProactorSocketTransport._set_extrac                 C   r   r   r   rI   r   r   r   r   c  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"   rb   r   r   rI   r   r   r   r   f  s   
z"_ProactorSocketTransport.write_eofrh   )r:   ri   rj   r   Z_SendfileModeZ
TRY_NATIVEZ_sendfile_compatibler    r!   r   r   rm   r   r   r5   r   r   T  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   rY   r6   r:   r   	_selector_self_reading_future_accept_futuresZset_loop_make_self_pipe	threadingcurrent_threadmain_threadsignalset_wakeup_fd_csockr<   )r/   Zproactorr5   r   r   r    p  s   

zBaseProactorEventLoop.__init__Nc                 C      t | |||||S rE   )r   )r/   r   r1   r2   r3   r4   r   r   r   _make_socket_transport}     
z,BaseProactorEventLoop._make_socket_transportF)server_sideserver_hostnamer3   r4   ssl_handshake_timeoutc             	   C   s0   t j| ||||||	d}
t| ||
||d |
jS )N)r   r3   r4   )r	   ZSSLProtocolr   Z_app_transport)r/   Zrawsockr1   
sslcontextr2   r   r   r3   r4   r   Zssl_protocolr   r   r   _make_ssl_transport  s   z)BaseProactorEventLoop._make_ssl_transportc                 C   r   rE   )r   )r/   r   r1   r   r2   r3   r   r   r   _make_datagram_transport  r   z.BaseProactorEventLoop._make_datagram_transportc                 C      t | ||||S rE   )r   r/   r   r1   r2   r3   r   r   r   _make_duplex_pipe_transport  s   z1BaseProactorEventLoop._make_duplex_pipe_transportc                 C   r   rE   )rn   r   r   r   r   _make_read_pipe_transport  s   z/BaseProactorEventLoop._make_read_pipe_transportc                 C   r   rE   )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 looprc   )Z
is_runningr   	is_closedr   r   r   r   r   _stop_accept_futures_close_self_piper   rO   r   r   rI   r5   r   r   rO     s   

zBaseProactorEventLoop.closec                       | j ||I d H S rE   )r   r   )r/   r   nr   r   r   	sock_recv     zBaseProactorEventLoop.sock_recvc                    r   rE   )r   r   )r/   r   bufr   r   r   sock_recv_into  r   z$BaseProactorEventLoop.sock_recv_intoc                    r   rE   )r   r   )r/   r   r~   r   r   r   sock_sendall  r   z"BaseProactorEventLoop.sock_sendallc                    r   rE   )r   connect)r/   r   r   r   r   r   sock_connect  r   z"BaseProactorEventLoop.sock_connectc                    s   | j |I d H S rE   )r   acceptrC   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_sizerX   minseekr   sendfile)r/   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)ru   rv   r   Zsock_sendfiler"   r   ry   )r/   Ztranspr   r   r   ry   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   rN   _ssockrO   r   _internal_fdsrI   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   rI   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)rU   rV   r0   )r   r   r   r   r   r   r   rz   r{   r|   rZ   r   _loop_self_reading)r/   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   rX   _debugr   rY   )r/   Z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   r3   r4   r   r   rc   zAccept failed on a socket)rU   rV   r   zAccept failed on socket %rr   )r   r  r   rY   r   r   r   r   r   rX   r<   rZ   r   r   rO   r   r   r   r   )r   connr   r1   r\   r0   protocol_factoryr/   r4   r   r   r   r   r   r0   2  sR   
z2BaseProactorEventLoop._start_serving.<locals>.looprE   )r,   )r/   r  r   r   r4   backlogr   r   r  r   _start_serving.  s   %z$BaseProactorEventLoop._start_servingc                 C   s   d S rE   r   )r/   Z
event_listr   r   r   _process_eventsY  s   z%BaseProactorEventLoop._process_eventsc                 C   s&   | j  D ]}|  q| j   d S rE   )r   valuesrN   clear)r/   futurer   r   r   r   ]  s   
z*BaseProactorEventLoop._stop_accept_futuresc                 C   s6   | j | d }|r|  | j| |  d S rE   )r   popr<   rN   r   _stop_servingrO   )r/   r   r  r   r   r   r  b  s
   z#BaseProactorEventLoop._stop_servingrh   rE   r   )NNr  N)r:   ri   rj   r    r   r   r   r   r   r   rO   r   r   r   r   r   r   r   r   r   r   r  r  r	  r   r  rm   r   r   r5   r   r   n  sP    






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