a
    ze}                     @   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yP   | j rLtj	d|dd Y n0 d| jvrz|
 | jd< W n tjy   d | jd< Y n0 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.9/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| _| jd url| j  | j| jj|  |d ur| jtj|d  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r0|d | jd urP|d| j   | jd url|d| j | jd ur|d| j | jr|dt	| j  | j
r|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   s    z%_ProactorBasePipeTransport._set_extrac                 C   s
   || _ d S Nr-   )r/   r1   r   r   r   r#   ]   s    z'_ProactorBasePipeTransport.set_protocolc                 C   s   | j S rD   rE   r/   r   r   r   get_protocol`   s    z'_ProactorBasePipeTransport.get_protocolc                 C   s   | j S rD   )r*   rF   r   r   r   
is_closingc   s    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rX| j  d | _d S )NTr   )	r*   r)   r%   r'   r   r,   _call_connection_lostr&   cancelrF   r   r   r   closef   s    

z _ProactorBasePipeTransport.closec                 C   s*   | j d ur&|d| t| d |   d S )Nzunclosed transport )source)r"   ResourceWarningrK   )r/   _warnr   r   r   __del__q   s    
z"_ProactorBasePipeTransport.__del__Fatal error on pipe transportc              	   C   s`   zNt |tr*| j rBtjd| |dd n| j||| | jd W | | n| | 0 d S )Nz%r: %sTr   )message	exceptionr   r1   )	
isinstanceOSErrorr   r   r   debugcall_exception_handlerr-   _force_close)r/   excrQ   r   r   r   _fatal_errorv   s    


z'_ProactorBasePipeTransport._fatal_errorc                 C   s   | j d ur6| j  s6|d u r*| j d  n| j | | jr@d S d| _|  jd7  _| jrj| j  d | _| jr| j  d | _d| _	d | _
| j| j| d S )NTr   r   )_empty_waiterdone
set_resultset_exceptionr*   r)   r'   rJ   r&   r(   r%   r   r,   rI   )r/   rX   r   r   r   rW      s"    

z'_ProactorBasePipeTransport._force_closec              	   C   s   zd| j | W t| jdr8| j dkr8| jtj | j  d | _| j	}|d ur|
  d | _	nVt| jdr| j dkr| jtj | j  d | _| j	}|d ur|
  d | _	0 d S )Nshutdown)r-   Zconnection_losthasattrr"   r<   r^   r   	SHUT_RDWRrK   r$   Z_detach)r/   rX   r4   r   r   r   rI      s$    

z0_ProactorBasePipeTransport._call_connection_lostc                 C   s"   | j }| jd ur|t| j7 }|S rD   )r(   r%   r=   )r/   sizer   r   r   get_write_buffer_size   s    
z0_ProactorBasePipeTransport.get_write_buffer_size)NNN)rP   )r:   
__module____qualname____doc__r    rA   r!   r#   rG   rH   rK   warningswarnrO   rY   rW   rI   rc   __classcell__r   r   r5   r   r   .   s     
r   c                       sT   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.Nc                    s:   d | _ d| _t |||||| | j| j d| _d S )NTF)_pending_data_pausedr   r    r   r,   _loop_readingr.   r5   r   r   r       s
    z#_ProactorReadPipeTransport.__init__c                 C   s   | j  o| j S rD   )rl   r*   rF   r   r   r   
is_reading   s    z%_ProactorReadPipeTransport.is_readingc                 C   s0   | j s| jrd S d| _| j r,td|  d S )NTz%r pauses reading)r*   rl   r   r   r   rU   rF   r   r   r   pause_reading   s
    
z(_ProactorReadPipeTransport.pause_readingc                 C   sn   | j s| jsd S d| _| jd u r0| j| jd  | j}d | _|d urT| j| j| | j rjt	
d|  d S )NFz%r resumes reading)r*   rl   r&   r   r,   rm   rk   _data_receivedr   r   rU   r/   datar   r   r   resume_reading   s    

z)_ProactorReadPipeTransport.resume_readingc              
   C   s~   | j  rtd|  z| j }W nH ttfy<    Y n2 tyl } z| 	|d W Y d }~d S d }~0 0 |sz| 
  d S )Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.)r   r   r   rU   r-   Zeof_received
SystemExitKeyboardInterruptBaseExceptionrY   rK   )r/   Z	keep_openrX   r   r   r   _eof_received   s    
z(_ProactorReadPipeTransport._eof_receivedc              
   C   s   | j r|| _d S |s |   d S t| jtjrzt| j| W q tt	fyX    Y q t
y } z| |d W Y d }~d S d }~0 0 n| j| d S )Nz3Fatal error: protocol.buffer_updated() call failed.)rl   rk   rw   rS   r-   r   ZBufferedProtocolZ_feed_data_to_buffered_protort   ru   rv   rY   Zdata_received)r/   rr   rX   r   r   r   rp      s"    z)_ProactorReadPipeTransport._data_receivedc              
   C   s  d }zz|d ur2d | _ | r*| }n|  | jrVd }W W |d urR| | d S |dkrxW W |d urt| | d S | js| jj	| j
d| _ W n ty } z8| js| |d n| j rtjddd W Y d }~nd }~0  ty } z| | W Y d }~nnd }~0  tyB } z| |d W Y d }~n>d }~0  tjy`   | js\ Y n0 | jsx| j | j W |d ur| | n|d ur| | 0 d S )N    i   z"Fatal read error on pipe transportz*Read error on pipe transport while closingTr   )r&   r[   resultrJ   r*   rp   rl   r   	_proactorrecvr"   ConnectionAbortedErrorrY   r   r   rU   ConnectionResetErrorrW   rT   r   CancelledErroradd_done_callbackrm   )r/   futrr   rX   r   r   r   rm     sP    



 

z(_ProactorReadPipeTransport._loop_reading)NNN)N)r:   rd   re   rf   r    rn   ro   rs   rw   rp   rm   ri   r   r   r5   r   rj      s     	rj   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 rD   )r   r    rZ   r/   argskwr5   r   r   r    G  s    z(_ProactorBaseWritePipeTransport.__init__c                 C   s   t |tttfs$tdt|j | jr2td| j	d urDtd|sLd S | j
rz| j
tjkrhtd |  j
d7  _
d S | jd u r| jt|d n.| jst|| _|   n| 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   )rr   )rS   bytes	bytearray
memoryview	TypeErrortyper:   r+   RuntimeErrorrZ   r)   r   !LOG_THRESHOLD_FOR_CONNLOST_WRITESr   r   r'   _loop_writingr%   _maybe_pause_protocolextendrq   r   r   r   writeK  s0    




z%_ProactorBaseWritePipeTransport.writeNc              
   C   sZ  z|d ur | j d u r | jr W d S d | _ d| _|r8|  |d u rL| j}d | _|s| jrf| j| jd  | jrz| j	
tj |   nN| jj| j	|| _ | j  st|| _| j | j |   n| j | j | jd ur| j d u r| jd  W n` ty$ } z| | W Y d }~n:d }~0  tyT } z| |d W Y d }~n
d }~0 0 d S )Nr   z#Fatal write error on pipe transport)r'   r*   r(   ry   r%   r   r,   rI   r+   r"   r^   r   SHUT_WR_maybe_resume_protocolrz   sendr[   r=   r   r   r   rZ   r\   r}   rW   rT   rY   )r/   frr   rX   r   r   r   r   q  s8    



z-_ProactorBaseWritePipeTransport._loop_writingc                 C   s   dS NTr   rF   r   r   r   can_write_eof  s    z-_ProactorBaseWritePipeTransport.can_write_eofc                 C   s   |    d S rD   )rK   rF   r   r   r   	write_eof  s    z)_ProactorBaseWritePipeTransport.write_eofc                 C   s   |  d  d S rD   rW   rF   r   r   r   abort  s    z%_ProactorBaseWritePipeTransport.abortc                 C   s:   | j d urtd| j | _ | jd u r4| j d  | j S )NzEmpty waiter is already set)rZ   r   r   Zcreate_futurer'   r\   rF   r   r   r   _make_empty_waiter  s    

z2_ProactorBaseWritePipeTransport._make_empty_waiterc                 C   s
   d | _ d S rD   )rZ   rF   r   r   r   _reset_empty_waiter  s    z3_ProactorBaseWritePipeTransport._reset_empty_waiter)NN)r:   rd   re   rf   Z_start_tls_compatibler    r   r   r   r   r   r   r   ri   r   r   r5   r   r   A  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   rz   r{   r"   r&   r   _pipe_closedr   r5   r   r   r      s    z$_ProactorWritePipeTransport.__init__c                 C   s@   |  rd S | jrd S d | _| jd ur4| t  n|   d S rD   )	cancelledr*   r&   r'   rW   BrokenPipeErrorrK   )r/   r   r   r   r   r     s    
z(_ProactorWritePipeTransport._pipe_closed)r:   rd   re   r    r   ri   r   r   r5   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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   )
_addressrZ   r   r    collectionsdequer%   r   r,   rm   )r/   r0   r   r1   addressr2   r3   r5   r   r   r      s
    
z#_ProactorDatagramTransport.__init__c                 C   s   t | | d S rD   r   rC   r   r   r   r!     s    z%_ProactorDatagramTransport._set_extrac                 C   s   t dd | jD S )Nc                 s   s   | ]\}}t |V  qd S rD   )r=   ).0rr   _r   r   r   	<genexpr>  rx   zC_ProactorDatagramTransport.get_write_buffer_size.<locals>.<genexpr>)sumr%   rF   r   r   r   rc     s    z0_ProactorDatagramTransport.get_write_buffer_sizec                 C   s   |  d  d S rD   r   rF   r   r   r   r     s    z _ProactorDatagramTransport.abortc                 C   s   t |tttfstdt||s&d S | jd urN|d | jfvrNtd| j | jr| jr| jt	j
krptd |  jd7  _d S | jt||f | jd u r|   |   d S )Nz,data argument must be bytes-like object (%r)z!Invalid address: must be None or z!socket.sendto() raised exception.r   )rS   r   r   r   r   r   r   
ValueErrorr)   r   r   r   r   r%   r;   r'   r   r   )r/   rr   addrr   r   r   sendto  s&    


z!_ProactorDatagramTransport.sendtoc              
   C   s  z| j rW d S d | _|r |  | jr2| j rN| jrN| jrH| j| jd  W d S | j	 \}}| jd ur|| jj
| j|| _n| jj
j| j||d| _W n^ ty } z| j| W Y d }~nNd }~0  ty } z| |d W Y d }~n d }~0 0 | j| j |   d S )N)r   z'Fatal write error on datagram transport)r)   r'   ry   r%   r   r*   r   r,   rI   popleftrz   r   r"   r   rT   r-   error_received	ExceptionrY   r   r   r   )r/   r   rr   r   rX   r   r   r   r     s2    
 "z(_ProactorDatagramTransport._loop_writingc              
   C   s|  d }zZz| j r*W W |r&| j|| d S d | _|d ur| }| jrdd }W W |r`| j|| d S | jd ur||| j }}n|\}}| j rW W |r| j|| d S | jd ur| jj	| j
| j| _n| jj| j
| j| _W nP ty } z| j| W Y d }~nBd }~0  tjy.   | js* Y n0 | jd urJ| j| j W |rx| j|| n|rv| j|| 0 d S rD   )r)   r-   Zdatagram_receivedr&   ry   r*   r   r   rz   r{   r"   max_sizerecvfromrT   r   r   r~   r   rm   )r/   r   rr   r   resrX   r   r   r   rm     sT    $


 z(_ProactorDatagramTransport._loop_reading)NNN)N)N)N)r:   rd   re   r   r    r!   rc   r   r   r   rm   ri   r   r   r5   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   s   dS )NFr   rF   r   r   r   r   K  s    z*_ProactorDuplexPipeTransport.can_write_eofc                 C   s   t d S rD   )NotImplementedErrorrF   r   r   r   r   N  s    z&_ProactorDuplexPipeTransport.write_eofN)r:   rd   re   rf   r   r   r   r   r   r   r   F  s   r   c                       sB   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 rD   )r   r    r   Z_set_nodelayr.   r5   r   r   r    Y  s    z!_ProactorSocketTransport.__init__c                 C   s   t | | d S rD   r   rC   r   r   r   r!   ^  s    z#_ProactorSocketTransport._set_extrac                 C   s   dS r   r   rF   r   r   r   r   a  s    z&_ProactorSocketTransport.can_write_eofc                 C   s2   | j s| jrd S d| _| jd u r.| jtj d S r   )r*   r+   r'   r"   r^   r   r   rF   r   r   r   r   d  s
    
z"_ProactorSocketTransport.write_eof)NNN)r:   rd   re   rf   r   Z_SendfileModeZ
TRY_NATIVEZ_sendfile_compatibler    r!   r   r   ri   r   r   r5   r   r   R  s     r   c                       s   e Zd Z fddZd3ddZd4dddddddd	Zd5d
dZd6ddZd7ddZd8d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d9d&d'Zd(d) Zd:d+d,Zd-d. Zd/d0 Zd1d2 Z  ZS );r   c                    sh   t    td|jj || _|| _d | _i | _	|
|  |   t t u rdt| j  d S )NzUsing proactor: %s)r   r    r   rU   r6   r:   rz   	_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    n  s    

zBaseProactorEventLoop.__init__Nc                 C   s   t | |||||S rD   )r   )r/   r   r1   r2   r3   r4   r   r   r   _make_socket_transport{  s    
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   s   t | |||||S rD   )r   )r/   r   r1   r   r2   r3   r   r   r   _make_datagram_transport  s    
z.BaseProactorEventLoop._make_datagram_transportc                 C   s   t | ||||S rD   )r   r/   r   r1   r2   r3   r   r   r   _make_duplex_pipe_transport  s    z1BaseProactorEventLoop._make_duplex_pipe_transportc                 C   s   t | ||||S rD   )rj   r   r   r   r   _make_read_pipe_transport  s    z/BaseProactorEventLoop._make_read_pipe_transportc                 C   s   t | ||||S rD   )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 r6td |   | 	  | j
  d | _
d | _t   d S )Nz!Cannot close a running event loopr_   )Z
is_runningr   	is_closedr   r   r   r   r   _stop_accept_futures_close_self_piperz   rK   r   r   rF   r5   r   r   rK     s    

zBaseProactorEventLoop.closec                    s   | j ||I d H S rD   )rz   r{   )r/   r   nr   r   r   	sock_recv  s    zBaseProactorEventLoop.sock_recvc                    s   | j ||I d H S rD   )rz   	recv_into)r/   r   bufr   r   r   sock_recv_into  s    z$BaseProactorEventLoop.sock_recv_intoc                    s   | j ||I d H S rD   )rz   r   )r/   r   rr   r   r   r   sock_sendall  s    z"BaseProactorEventLoop.sock_sendallc                    s   | j ||I d H S rD   )rz   connect)r/   r   r   r   r   r   sock_connect  s    z"BaseProactorEventLoop.sock_connectc                    s   | j |I d H S rD   )rz   acceptrC   r   r   r   sock_accept  s    z!BaseProactorEventLoop.sock_acceptc              
      s>  z|  }W n4 ttjfy@ } ztdW Y d }~n
d }~0 0 zt|j}W n t	yn   tdY n0 |rx|n|}|sdS t
|d}|rt
|| |n|}	t
||}d}
zpt
|	| |}|dkr|
W |
dkr|| S | j||||I d H  ||7 }|
|7 }
qW |
dkr:|| n|
dkr8|| 0 d S )Nznot a regular filer   l    )r<   AttributeErrorioUnsupportedOperationr   ZSendfileNotAvailableErrorosfstatst_sizerT   minseekrz   sendfile)r/   r   fileoffsetcountr<   errfsize	blocksizeZend_pos
total_sentr   r   r   _sock_sendfile_native  s:     




z+BaseProactorEventLoop._sock_sendfile_nativec                    sn   |  }|  | I d H  z4| j|j|||ddI d H W |  |rP|  S n|  |rh|  0 d S )NF)fallback)rn   ro   r   Zsock_sendfiler"   r   rs   )r/   Ztranspr   r   r   rs   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   rJ   _ssockrK   r   _internal_fdsrF   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   rF   r   r   r   r     s    z%BaseProactorEventLoop._make_self_pipec              
   C   s   z4|d ur|   | j|ur"W d S | j| jd}W n` tjyJ   Y d S  ttfy`    Y nH t	y } z| 
d|| d W Y d }~nd }~0 0 || _|| j d S )Ni   z.Error on reading from the event loop self pipe)rQ   rR   r0   )ry   r   rz   r{   r   r   r~   rt   ru   rv   rV   r   _loop_self_reading)r/   r   rX   r   r   r   r     s$    
z(BaseProactorEventLoop._loop_self_readingc                 C   sL   | j }|d u rd S z|d W n& tyF   | jrBtjddd Y n0 d S )N    z3Fail to write a null byte into the self-pipe socketTr   )r   r   rT   _debugr   rU   )r/   Zcsockr   r   r   _write_to_self  s    z$BaseProactorEventLoop._write_to_selfd   c                    s(   d fdd	    d S )Nc              
      s,  z| d urn|   \}}jr,td||  }d urXj||dd|id nj||d|id  r|W d S j} W n t	y } zP
 dkrȈd|td   njrtjd	dd
 W Y d }~n>d }~0  tjy     Y n0 | j
 < |   d S )Nz#%r got a new connection from %r: %rTr   )r   r3   r4   r   r   r_   zAccept failed on a socket)rQ   rR   r   zAccept failed on socket %rr   )ry   r   r   rU   r   r   r   rz   r   rT   r<   rV   r   r   rK   r   r~   r   r   )r   connr   r1   rX   r0   protocol_factoryr/   r4   r   r   r   r   r   r0   0  sJ    
z2BaseProactorEventLoop._start_serving.<locals>.loop)N)r,   )r/   r   r   r   r4   backlogr   r   r   r   _start_serving,  s    %z$BaseProactorEventLoop._start_servingc                 C   s   d S rD   r   )r/   Z
event_listr   r   r   _process_eventsW  s    z%BaseProactorEventLoop._process_eventsc                 C   s&   | j  D ]}|  q
| j   d S rD   )r   valuesrJ   clear)r/   futurer   r   r   r   [  s    
z*BaseProactorEventLoop._stop_accept_futuresc                 C   s6   | j | d }|r|  | j| |  d S rD   )r   popr<   rJ   rz   _stop_servingrK   )r/   r   r   r   r   r   r   `  s
    z#BaseProactorEventLoop._stop_serving)NNN)N)NNN)NN)NN)NN)N)NNr   N)r:   rd   re   r    r   r   r   r   r   r   rK   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ri   r   r   r5   r   r   l  sN     
  
  
  
  


  
+r   )$rf   __all__r   r   r   rg   r   r   r    r   r   r   r   r   r	   r
   r   logr   r   Z_FlowControlMixinZBaseTransportr   ZReadTransportrj   ZWriteTransportr   r   ZDatagramTransportr   Z	Transportr   r   ZBaseEventLoopr   r   r   r   r   <module>   sV     n 