U
    g<}                     @   sT  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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 n0 tjk
rR   | j rNtj	d|dd Y nX d| jkrz|
 | jd< W n  tjk
r   d | jd< Y nX d S )NsocketZsocknamezgetsockname() failed on %rTexc_infopeername)r   TransportSocket_extraZgetsocknamer   error_loop	get_debugr   warningZgetpeername)	transportsock r   -/usr/lib/python3.8/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 k	rl| j  | j| jj|  |d k	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 kr |d n| jr0|d | jd k	rP|d| j   | jd k	rl|d| j | jd k	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<{}> )r4   __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-   r/   r   r   r   r!   ]   s    z'_ProactorBasePipeTransport.set_protocolc                 C   s   | j S rB   rC   r-   r   r   r   get_protocol`   s    z'_ProactorBasePipeTransport.get_protocolc                 C   s   | j S rB   )r(   rD   r   r   r   
is_closingc   s    z%_ProactorBasePipeTransport.is_closingc                 C   s\   | j r
d S d| _ |  jd7  _| js>| jd kr>| j| jd  | jd k	rX| j  d | _d S )NTr   )	r(   r'   r#   r%   r   r*   _call_connection_lostr$   cancelrD   r   r   r   closef   s    

z _ProactorBasePipeTransport.closec                 C   s*   | j d k	r&|d| t| d |   d S )Nzunclosed transport )source)r    ResourceWarningrI   )r-   Z_warnr   r   r   __del__q   s    
z"_ProactorBasePipeTransport.__del__Fatal error on pipe transportc              	   C   sV   zDt|tr*| j rBtjd| |dd n| j||| | jd W 5 |  | X d S )Nz%r: %sTr   )message	exceptionr   r/   )	_force_close
isinstanceOSErrorr   r   r   debugcall_exception_handlerr+   )r-   excrN   r   r   r   _fatal_errorv   s    

z'_ProactorBasePipeTransport._fatal_errorc                 C   s   | j d k	r6| j  s6|d k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_resultZset_exceptionr(   r'   r%   rH   r$   r&   r#   r   r*   rG   )r-   rU   r   r   r   rP      s"    

z'_ProactorBasePipeTransport._force_closec              	   C   s^   z| j	| W 5 t | jdr,| jtj | j  d | _| j}|d k	rX|  d | _X d S )Nshutdown)
hasattrr    rZ   r   Z	SHUT_RDWRrI   r"   Z_detachr+   Zconnection_lost)r-   rU   r2   r   r   r   rG      s    
z0_ProactorBasePipeTransport._call_connection_lostc                 C   s"   | j }| jd k	r|t| j7 }|S rB   )r&   r#   r;   )r-   sizer   r   r   get_write_buffer_size   s    
z0_ProactorBasePipeTransport.get_write_buffer_size)NNN)rM   )r8   
__module____qualname____doc__r   r?   r   r!   rE   rF   rI   warningswarnrL   rV   rP   rG   r]   __classcell__r   r   r3   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,   r3   r   r   r      s
    z#_ProactorReadPipeTransport.__init__c                 C   s   | j  o| j S rB   )rf   r(   rD   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(   rf   r   r   r   rS   rD   r   r   r   pause_reading   s
    
z(_ProactorReadPipeTransport.pause_readingc                 C   sn   | j s| jsd S d| _| jd kr0| j| jd  | j}d | _|d k	rT| j| j| | j rjt	
d|  d S )NFz%r resumes reading)r(   rf   r$   r   r*   rg   re   _data_receivedr   r   rS   r-   datar   r   r   resume_reading   s    

z)_ProactorReadPipeTransport.resume_readingc              
   C   s   | j  rtd|  z| j }W nL ttfk
r>    Y n4 tk
rp } z| 	|d W Y d S d }~X Y nX |s~| 
  d S )Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.)r   r   r   rS   r+   Zeof_received
SystemExitKeyboardInterruptBaseExceptionrV   rI   )r-   Z	keep_openrU   r   r   r   _eof_received   s    
 z(_ProactorReadPipeTransport._eof_receivedc              
   C   s   | j r| jd kst|| _d S |s.|   d S t| jtjrzt| j| W q t	t
fk
rh    Y q tk
r } z| |d W Y d S d }~X Y qX n| j| d S )Nz3Fatal error: protocol.buffer_updated() call failed.)rf   re   AssertionErrorrq   rQ   r+   r   ZBufferedProtocolZ_feed_data_to_buffered_protorn   ro   rp   rV   Zdata_received)r-   rl   rU   r   r   r   rj      s$    z)_ProactorReadPipeTransport._data_receivedc              
   C   s  d }zrz|d k	rP| j|ks0| jd kr,| js0td | _| rH| }n|  | jrfd }W W d S |dkrzW W d S | js| jj	
| jd| _W n tk
r } z0| js| |d n| j rtjddd W 5 d }~X Y n tk
r } z| | W 5 d }~X Y nf tk
r> } z| |d W 5 d }~X Y n8 tjk
r^   | jsZ Y nX | jsv| j| j W 5 |d k	r|  | X d S )N    i   z"Fatal read error on pipe transportz*Read error on pipe transport while closingTr   )rj   r$   r(   rr   rX   resultrH   rf   r   	_proactorrecvr    ConnectionAbortedErrorrV   r   r   rS   ConnectionResetErrorrP   rR   r   CancelledErroradd_done_callbackrg   )r-   futrl   rU   r   r   r   rg     sF    


z(_ProactorReadPipeTransport._loop_reading)NNN)N)r8   r^   r_   r`   r   rh   ri   rm   rq   rj   rg   rc   r   r   r3   r   rd      s       	rd   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|| d | _d S rB   )r   r   rW   r-   argskwr3   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 k	rDtd|sLd S | j
rz| j
tjkrhtd |  j
d7  _
d S | jd kr| jd kst| 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   )rl   )rQ   bytes	bytearray
memoryview	TypeErrortyper8   r)   RuntimeErrorrW   r'   r   !LOG_THRESHOLD_FOR_CONNLOST_WRITESr   r   r%   r#   rr   _loop_writing_maybe_pause_protocolextendrk   r   r   r   writeK  s.    




z%_ProactorBaseWritePipeTransport.writeNc              
   C   sx  z|d k	r"| j d kr"| jr"W d S || j ks0td | _ d| _|rH|  |d kr\| j}d | _|s| jrv| j| jd  | j	r| j
tj |   n\| jj| j
|| _ | j  s| jdkstt|| _| j | j |   n| j | j | jd k	r| j d kr| jd  W n\ tk
rD } z| | W 5 d }~X Y n0 tk
rr } z| |d W 5 d }~X Y nX d S )Nr   z#Fatal write error on pipe transport)r%   r(   rr   r&   rt   r#   r   r*   rG   r)   r    rZ   r   SHUT_WR_maybe_resume_protocolru   sendrX   r;   rz   r   r   rW   rY   rx   rP   rR   rV   )r-   frl   rU   r   r   r   r   q  s<    



z-_ProactorBaseWritePipeTransport._loop_writingc                 C   s   dS NTr   rD   r   r   r   can_write_eof  s    z-_ProactorBaseWritePipeTransport.can_write_eofc                 C   s   |    d S rB   )rI   rD   r   r   r   	write_eof  s    z)_ProactorBaseWritePipeTransport.write_eofc                 C   s   |  d  d S rB   rP   rD   r   r   r   abort  s    z%_ProactorBaseWritePipeTransport.abortc                 C   s:   | j d k	rtd| j | _ | jd kr4| j d  | j S )NzEmpty waiter is already set)rW   r   r   Zcreate_futurer%   rY   rD   r   r   r   _make_empty_waiter  s    

z2_ProactorBaseWritePipeTransport._make_empty_waiterc                 C   s
   d | _ d S rB   )rW   rD   r   r   r   _reset_empty_waiter  s    z3_ProactorBaseWritePipeTransport._reset_empty_waiter)NN)r8   r^   r_   r`   Z_start_tls_compatibler   r   r   r   r   r   r   r   rc   r   r   r3   r   r|   A  s   &
)r|   c                       s$   e Zd Z fddZdd Z  ZS )_ProactorWritePipeTransportc                    s4   t  j|| | jj| jd| _| j| j d S )N   )	r   r   r   ru   rv   r    r$   rz   _pipe_closedr}   r3   r   r   r     s    z$_ProactorWritePipeTransport.__init__c                 C   sv   |  rd S | dkst| jr4| jd ks0td S || jksLt|| jfd | _| jd k	rj| t  n|   d S )Nrs   )	Z	cancelledrt   rr   r(   r$   r%   rP   BrokenPipeErrorrI   )r-   r{   r   r   r   r     s    
z(_ProactorWritePipeTransport._pipe_closed)r8   r^   r_   r   r   rc   r   r   r3   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)r0   r1   )
_addressrW   r   r   collectionsdequer#   r   r*   rg   )r-   r.   r   r/   addressr0   r1   r3   r   r   r     s
    
z#_ProactorDatagramTransport.__init__c                 C   s   t | | d S rB   r   rA   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 rB   )r;   ).0rl   _r   r   r   	<genexpr>  s     zC_ProactorDatagramTransport.get_write_buffer_size.<locals>.<genexpr>)sumr#   rD   r   r   r   r]     s    z0_ProactorDatagramTransport.get_write_buffer_sizec                 C   s   |  d  d S rB   r   rD   r   r   r   r     s    z _ProactorDatagramTransport.abortc                 C   s   t |tttfstdt||s&d S | jd k	rN|d | jfkrNtd| j | jr| jr| jt	j
krptd |  jd7  _d S | jt||f | jd k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   )rQ   r   r   r   r   r   r   
ValueErrorr'   r   r   r   r   r#   r9   r%   r   r   )r-   rl   addrr   r   r   sendto  s&    


z!_ProactorDatagramTransport.sendtoc              
   C   s  z| j rW d S || jkstd | _|r.|  | jr@| j r\| jr\| jrV| j| j	d  W d S | j
 \}}| jd k	r| jj| j|| _n| jjj| j||d| _W nZ tk
r } z| j| W 5 d }~X Y nD tk
r } z| |d W 5 d }~X Y nX | j| j |   d S )N)r   z'Fatal write error on datagram transport)r'   r%   rr   rt   r#   r   r(   r   r*   rG   popleftru   r   r    r   rR   r+   error_received	ExceptionrV   rz   r   r   )r-   r{   rl   r   rU   r   r   r   r     s4    
z(_ProactorDatagramTransport._loop_writingc              
   C   sV  d }z4z| jrW W $d S | j|ks:| jd kr6| js:td | _|d k	r| }| jrdd }W W d S | jd k	r||| j }}n|\}}| jrW W d S | jd k	r| jj	
| j| j| _n| jj	| j| j| _W nN tk
r } z| j | W 5 d }~X Y n< tjk
r   | js Y nX | jd k	r8| j| j W 5 |rP| j || X d S rB   )r+   Zdatagram_receivedr'   r$   r(   rr   rt   r   r   ru   rv   r    max_sizeZrecvfromrR   r   r   ry   rz   rg   )r-   r{   rl   r   resrU   r   r   r   rg     sD    




z(_ProactorDatagramTransport._loop_reading)NNN)N)N)N)r8   r^   r_   r   r   r   r]   r   r   r   rg   rc   r   r   r3   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   rD   r   r   r   r   J  s    z*_ProactorDuplexPipeTransport.can_write_eofc                 C   s   t d S rB   )NotImplementedErrorrD   r   r   r   r   M  s    z&_ProactorDuplexPipeTransport.write_eofN)r8   r^   r_   r`   r   r   r   r   r   r   r   E  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 rB   )r   r   r   Z_set_nodelayr,   r3   r   r   r   X  s    z!_ProactorSocketTransport.__init__c                 C   s   t | | d S rB   r   rA   r   r   r   r   ]  s    z#_ProactorSocketTransport._set_extrac                 C   s   dS r   r   rD   r   r   r   r   `  s    z&_ProactorSocketTransport.can_write_eofc                 C   s2   | j s| jrd S d| _| jd kr.| jtj d S r   )r(   r)   r%   r    rZ   r   r   rD   r   r   r   r   c  s
    
z"_ProactorSocketTransport.write_eof)NNN)r8   r^   r_   r`   r   Z_SendfileModeZ
TRY_NATIVEZ_sendfile_compatibler   r   r   r   rc   r   r   r3   r   r   Q  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 krdt| j  d S )NzUsing proactor: %s)r   r   r   rS   r4   r8   ru   	_selector_self_reading_future_accept_futuresZset_loop_make_self_pipe	threadingcurrent_threadmain_threadsignalset_wakeup_fd_csockr:   )r-   Zproactorr3   r   r   r   m  s    

zBaseProactorEventLoop.__init__Nc                 C   s   t | |||||S rB   )r   )r-   r   r/   r0   r1   r2   r   r   r   _make_socket_transportz  s    
 z,BaseProactorEventLoop._make_socket_transportF)server_sideserver_hostnamer1   r2   ssl_handshake_timeoutc             	   C   s0   t j| ||||||	d}
t| ||
||d |
jS )N)r   r1   r2   )r	   ZSSLProtocolr   Z_app_transport)r-   Zrawsockr/   
sslcontextr0   r   r   r1   r2   r   Zssl_protocolr   r   r   _make_ssl_transport  s         z)BaseProactorEventLoop._make_ssl_transportc                 C   s   t | |||||S rB   )r   )r-   r   r/   r   r0   r1   r   r   r   _make_datagram_transport  s    
 z.BaseProactorEventLoop._make_datagram_transportc                 C   s   t | ||||S rB   )r   r-   r   r/   r0   r1   r   r   r   _make_duplex_pipe_transport  s       z1BaseProactorEventLoop._make_duplex_pipe_transportc                 C   s   t | ||||S rB   )rd   r   r   r   r   _make_read_pipe_transport  s    z/BaseProactorEventLoop._make_read_pipe_transportc                 C   s   t | ||||S rB   )r   r   r   r   r   _make_write_pipe_transport  s       z0BaseProactorEventLoop._make_write_pipe_transportc                    sj   |   rtd|  rd S t t kr6td |   | 	  | j
  d | _
d | _t   d S )Nz!Cannot close a running event loop)Z
is_runningr   	is_closedr   r   r   r   r   _stop_accept_futures_close_self_piperu   rI   r   r   rD   r3   r   r   rI     s    

zBaseProactorEventLoop.closec                    s   | j ||I d H S rB   )ru   rv   )r-   r   nr   r   r   	sock_recv  s    zBaseProactorEventLoop.sock_recvc                    s   | j ||I d H S rB   )ru   Z	recv_into)r-   r   Zbufr   r   r   sock_recv_into  s    z$BaseProactorEventLoop.sock_recv_intoc                    s   | j ||I d H S rB   )ru   r   )r-   r   rl   r   r   r   sock_sendall  s    z"BaseProactorEventLoop.sock_sendallc                    s   | j ||I d H S rB   )ru   Zconnect)r-   r   r   r   r   r   sock_connect  s    z"BaseProactorEventLoop.sock_connectc                    s   | j |I d H S rB   )ru   acceptrA   r   r   r   sock_accept  s    z!BaseProactorEventLoop.sock_acceptc              
      s(  z|  }W n2 ttjfk
r> } ztdW 5 d }~X Y nX zt|j}W n, t	k
r| } ztdW 5 d }~X Y nX |r|n|}|sdS t
|d}|rt
|| |n|}	t
||}d}
zLt
|	| |}|dkr|
W 0S | j||||I d H  ||7 }|
|7 }
qW 5 |
dkr"|| X d S )Nznot a regular filer   l    )r:   AttributeErrorioUnsupportedOperationr   ZSendfileNotAvailableErrorosfstatst_sizerR   minseekru   sendfile)r-   r   fileoffsetcountr:   errZfsizeZ	blocksizeZend_posZ
total_sentr   r   r   _sock_sendfile_native  s0    


z+BaseProactorEventLoop._sock_sendfile_nativec                    sZ   |  }|  | I d H  z | j|j|||ddI d H W S |  |rT|  X d S )NF)Zfallback)rh   ri   r   r   rm   Zsock_sendfiler    )r-   Ztranspr   r   r   rm   r   r   r   _sendfile_native  s    z&BaseProactorEventLoop._sendfile_nativec                 C   sL   | j d k	r| j   d | _ | j  d | _| j  d | _|  jd8  _d S )Nr   )r   rH   _ssockrI   r   _internal_fdsrD   r   r   r   r     s    



z&BaseProactorEventLoop._close_self_pipec                 C   s:   t  \| _| _| jd | jd |  jd7  _d S )NFr   )r   Z
socketpairr   r   Zsetblockingr   rD   r   r   r   r     s    z%BaseProactorEventLoop._make_self_pipec              
   C   s   z4|d k	r|   | j|k	r"W d S | j| jd}W nb tjk
rL   Y d S  ttfk
rd    Y nF t	k
r } z| 
d|| d W 5 d }~X Y nX || _|| j d S )Ni   z.Error on reading from the event loop self pipe)rN   rO   r.   )rt   r   ru   rv   r   r   ry   rn   ro   rp   rT   rz   _loop_self_reading)r-   r   rU   r   r   r   r     s$    
z(BaseProactorEventLoop._loop_self_readingc                 C   sN   | j }|d krd S z|d W n( tk
rH   | jrDtjddd Y nX d S )N    z3Fail to write a null byte into the self-pipe socketTr   )r   r   rR   _debugr   rS   )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 k	rn|   \}}jr,td||  }d k	rXj||dd|id nj||d|id  r|W d S j} W n t	k
r } zH
 dkrʈd|td   njrtjd	dd
 W 5 d }~X Y n8 tjk
r     Y nX | j
 < |   d S )Nz#%r got a new connection from %r: %rTr   )r   r1   r2   r   r   r   zAccept failed on a socket)rN   rO   r   zAccept failed on socket %rr   )rt   r   r   rS   r   r   r   ru   r   rR   r:   rT   r   r   rI   r   ry   r   rz   )r   Zconnr   r/   rU   r.   protocol_factoryr-   r2   r   r   r   r   r   r.   /  s\            
 z2BaseProactorEventLoop._start_serving.<locals>.loop)N)r*   )r-   r   r   r   r2   Zbacklogr   r   r   r   _start_serving+  s    %z$BaseProactorEventLoop._start_servingc                 C   s   d S rB   r   )r-   Z
event_listr   r   r   _process_eventsV  s    z%BaseProactorEventLoop._process_eventsc                 C   s&   | j  D ]}|  q
| j   d S rB   )r   valuesrH   clear)r-   futurer   r   r   r   Z  s    
z*BaseProactorEventLoop._stop_accept_futuresc                 C   s6   | j | d }|r|  | j| |  d S rB   )r   popr:   rH   ru   _stop_servingrI   )r-   r   r   r   r   r   r   _  s
    z#BaseProactorEventLoop._stop_serving)NNN)N)NNN)NN)NN)NN)N)NNr   N)r8   r^   r_   r   r   r   r   r   r   r   rI   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rc   r   r   r3   r   r   k  s\       
        
  
  
  


      
+r   )#r`   __all__r   r   r   ra   r   r   r    r   r   r   r   r   r	   r
   r   logr   r   Z_FlowControlMixinZBaseTransportr   ZReadTransportrd   ZWriteTransportr|   r   r   Z	Transportr   r   ZBaseEventLoopr   r   r   r   r   <module>   sR     n 