a
    ӗaN                     @   s,  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zddl	Z	W n e
yb   dZ	Y n0 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dd ZG dd dejZG dd dejejZG dd deZG dd deZdS )zEvent loop using a selector and related classes.

A selector is a "notify-when-ready" multiplexer.  For a subclass which
also includes support for signal handling, see the unix_events sub-module.
)BaseSelectorEventLoop    N   )base_events)	constants)events)futures)	protocols)sslproto)
transports)trsock)loggerc                 C   s6   z|  |}W n ty"   Y dS 0 t|j|@ S d S NF)get_keyKeyErrorboolr   )selectorfdeventkey r   :/home/manager/Python-3.9.10/Lib/asyncio/selector_events.py_test_selector_event    s
    r   c                 C   s    t d urt| t jrtdd S )Nz"Socket cannot be of type SSLSocket)ssl
isinstanceZ	SSLSocket	TypeError)sockr   r   r   _check_ssl_socket+   s    r   c                       s  e Zd ZdZdS fdd	ZdTdddddZdUddddejd	d
dZdVddZ	 fddZ
dd Zdd Zdd Zdd Zdd ZdddejfddZdddejfddZddej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/d0 Zd1d2 Zd3d4 ZdWd5d6Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dXdEdFZ%dGdH Z&dIdJ Z'dKdL Z(dMdN Z)dOdP Z*dQdR Z+  Z,S )Yr   zJSelector event loop.

    See events.EventLoop for API specification.
    Nc                    sF   t    |d u rt }td|jj || _| 	  t
 | _d S )NzUsing selector: %s)super__init__	selectorsDefaultSelectorr   debug	__class____name__	_selector_make_self_pipeweakrefWeakValueDictionary_transports)selfr   r"   r   r   r   6   s    
zBaseSelectorEventLoop.__init__extraserverc                C   s   t | |||||S N)_SelectorSocketTransport)r)   r   protocolwaiterr,   r-   r   r   r   _make_socket_transport@   s    
z,BaseSelectorEventLoop._make_socket_transportF)server_sideserver_hostnamer,   r-   ssl_handshake_timeoutc             	   C   s0   t j| ||||||	d}
t| ||
||d |
jS )N)r5   r+   )r	   SSLProtocolr/   _app_transport)r)   rawsockr0   
sslcontextr1   r3   r4   r,   r-   r5   ssl_protocolr   r   r   _make_ssl_transportE   s    z)BaseSelectorEventLoop._make_ssl_transportc                 C   s   t | |||||S r.   )_SelectorDatagramTransport)r)   r   r0   addressr1   r,   r   r   r   _make_datagram_transportR   s    z.BaseSelectorEventLoop._make_datagram_transportc                    sL   |   rtd|  rd S |   t   | jd urH| j  d | _d S )Nz!Cannot close a running event loop)
is_runningRuntimeError	is_closed_close_self_piper   closer$   r)   r*   r   r   rC   W   s    


zBaseSelectorEventLoop.closec                 C   sB   |  | j  | j  d | _| j  d | _|  jd8  _d S )Nr   )_remove_reader_ssockfilenorC   _csock_internal_fdsrD   r   r   r   rB   b   s    

z&BaseSelectorEventLoop._close_self_pipec                 C   sN   t  \| _| _| jd | jd |  jd7  _| | j | j d S )NFr   )	socket
socketpairrF   rH   setblockingrI   _add_readerrG   _read_from_selfrD   r   r   r   r%   j   s
    z%BaseSelectorEventLoop._make_self_pipec                 C   s   d S r.   r   r)   datar   r   r   _process_self_datar   s    z(BaseSelectorEventLoop._process_self_datac                 C   sT   z"| j d}|sW qP| | W q  ty8   Y q Y q  tyL   Y qPY q 0 q d S )Ni   )rF   recvrQ   InterruptedErrorBlockingIOErrorrO   r   r   r   rN   u   s    z%BaseSelectorEventLoop._read_from_selfc                 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 socketTexc_info)rH   sendOSError_debugr   r!   )r)   Zcsockr   r   r   _write_to_self   s    z$BaseSelectorEventLoop._write_to_selfd   c              
   C   s"   |  | | j|||||| d S r.   )rM   rG   _accept_connection)r)   protocol_factoryr   r9   r-   backlogr5   r   r   r   _start_serving   s    
z$BaseSelectorEventLoop._start_servingc                 C   s  t |D ]}z0| \}}	| jr0td||	| |d W n tttfyX   Y  d S  t	y }
 zl|
j
t
jt
jt
jt
jfv r| d|
t|d | |  | tj| j|||||| n W Y d }
~
qd }
~
0 0 d|	i}| ||||||}| | qd S )Nz#%r got a new connection from %r: %rFz&socket.accept() out of system resource)message	exceptionrJ   peername)rangeacceptrZ   r   r!   rL   rT   rS   ConnectionAbortedErrorrY   errnoZEMFILEZENFILEZENOBUFSZENOMEMcall_exception_handlerr   TransportSocketrE   rG   
call_laterr   ACCEPT_RETRY_DELAYr`   _accept_connection2create_task)r)   r^   r   r9   r-   r_   r5   _connaddrexcr,   re   r   r   r   r]      s@    
z(BaseSelectorEventLoop._accept_connectionc              
      s   d }d }zr| }|   }	|r8| j||||	d|||d}n| j|||	||d}z|	I d H  W n tyv   |   Y n0 W nt ttfy    Y n^ ty }
 zF| jrd|
d}|d ur||d< |d ur||d< | | W Y d }
~
n
d }
~
0 0 d S )NT)r1   r3   r,   r-   r5   )r1   r,   r-   z3Error on transport creation for incoming connection)ra   rb   r0   	transport)	create_futurer;   r2   BaseExceptionrC   
SystemExitKeyboardInterruptrZ   rh   )r)   r^   ro   r,   r9   r-   r5   r0   rr   r1   rq   contextr   r   r   rl      s@    z)BaseSelectorEventLoop._accept_connection2c              
   C   s   |}t |tsHzt| }W n( tttfyF   td|d Y n0 z| j| }W n tyh   Y n0 | st	d|d|d S )NzInvalid file object: zFile descriptor z is used by transport )
r   intrG   AttributeErrorr   
ValueErrorr(   r   
is_closingr@   )r)   r   rG   rr   r   r   r   _ensure_fd_no_transport   s     
z-BaseSelectorEventLoop._ensure_fd_no_transportc           	   	   G   s   |    t||| d }z| j|}W n( tyP   | j|tj|d f Y n>0 |j|j	 }\}}| j
||tjB ||f |d ur|  |S r.   )_check_closedr   Handler$   r   r   registerr   
EVENT_READrP   modifycancel	r)   r   callbackargshandler   maskreaderwriterr   r   r   rM     s    
z!BaseSelectorEventLoop._add_readerc                 C   s   |   rdS z| j|}W n ty0   Y dS 0 |j|j }\}}|tj M }|sb| j| n| j	||d |f |d ur|
  dS dS d S )NFT)rA   r$   r   r   r   rP   r   r   
unregisterr   r   r)   r   r   r   r   r   r   r   r   rE     s    z$BaseSelectorEventLoop._remove_readerc           	   	   G   s   |    t||| d }z| j|}W n( tyP   | j|tjd |f Y n>0 |j|j	 }\}}| j
||tjB ||f |d ur|  |S r.   )r}   r   r~   r$   r   r   r   r   EVENT_WRITErP   r   r   r   r   r   r   _add_writer&  s    
z!BaseSelectorEventLoop._add_writerc                 C   s   |   rdS z| j|}W n ty0   Y dS 0 |j|j }\}}|tj M }|sb| j| n| j	|||df |dur|
  dS dS dS )Remove a writer callback.FNT)rA   r$   r   r   r   rP   r   r   r   r   r   r   r   r   r   _remove_writer6  s    z$BaseSelectorEventLoop._remove_writerc                 G   s"   |  | | j||g|R   dS )zAdd a reader callback.N)r|   rM   r)   r   r   r   r   r   r   
add_readerM  s    
z BaseSelectorEventLoop.add_readerc                 C   s   |  | | |S )zRemove a reader callback.)r|   rE   r)   r   r   r   r   remove_readerR  s    
z#BaseSelectorEventLoop.remove_readerc                 G   s"   |  | | j||g|R   dS )zAdd a writer callback..N)r|   r   r   r   r   r   
add_writerW  s    
z BaseSelectorEventLoop.add_writerc                 C   s   |  | | |S )r   )r|   r   r   r   r   r   remove_writer\  s    
z#BaseSelectorEventLoop.remove_writerc              	      s   t | | jr"| dkr"tdz||W S  ttfyD   Y n0 |  }| }| 	| | 
|| j|||}|tj| j||d |I dH S )zReceive data from the socket.

        The return value is a bytes object representing the data received.
        The maximum amount of data to be received at once is specified by
        nbytes.
        r   the socket must be non-blockingr   N)r   rZ   
gettimeoutrz   rR   rT   rS   rs   rG   r|   rM   
_sock_recvadd_done_callback	functoolspartial_sock_read_done)r)   r   nfutr   r   r   r   r   	sock_recva  s    
zBaseSelectorEventLoop.sock_recvc                 C   s   |d u s|  s| | d S r.   )	cancelledr   r)   r   r   r   r   r   r   r   w  s    z%BaseSelectorEventLoop._sock_read_donec              
   C   s   |  rd S z||}W nZ ttfy2   Y d S  ttfyH    Y n8 tyt } z|| W Y d }~nd }~0 0 || d S r.   )	donerR   rT   rS   ru   rv   rt   set_exception
set_result)r)   r   r   r   rP   rq   r   r   r   r   {  s     z BaseSelectorEventLoop._sock_recvc              	      s   t | | jr"| dkr"tdz||W S  ttfyD   Y n0 |  }| }| 	| | 
|| j|||}|tj| j||d |I dH S )zReceive data from the socket.

        The received data is written into *buf* (a writable buffer).
        The return value is the number of bytes written.
        r   r   r   N)r   rZ   r   rz   	recv_intorT   rS   rs   rG   r|   rM   _sock_recv_intor   r   r   r   )r)   r   bufr   r   r   r   r   r   sock_recv_into  s    
z$BaseSelectorEventLoop.sock_recv_intoc              
   C   s   |  rd S z||}W nZ ttfy2   Y d S  ttfyH    Y n8 tyt } z|| W Y d }~nd }~0 0 || d S r.   )	r   r   rT   rS   ru   rv   rt   r   r   )r)   r   r   r   nbytesrq   r   r   r   r     s     z%BaseSelectorEventLoop._sock_recv_intoc              	      s   t | | jr"| dkr"tdz||}W n ttfyJ   d}Y n0 |t|kr\dS |  }|	 }| 
| | || j||t||g}|tj| j||d |I dH S )a  Send data to the socket.

        The socket must be connected to a remote socket. This method continues
        to send data from data until either all data has been sent or an
        error occurs. None is returned on success. On error, an exception is
        raised, and there is no way to determine how much data, if any, was
        successfully processed by the receiving end of the connection.
        r   r   Nr   )r   rZ   r   rz   rX   rT   rS   lenrs   rG   r|   r   _sock_sendall
memoryviewr   r   r   _sock_write_done)r)   r   rP   r   r   r   r   r   r   r   sock_sendall  s&    	


z"BaseSelectorEventLoop.sock_sendallc              
   C   s   |  rd S |d }z|||d  }W n\ ttfyB   Y d S  ttfyX    Y n0 ty } z|| W Y d }~d S d }~0 0 ||7 }|t|kr|	d  n||d< d S )Nr   )
r   rX   rT   rS   ru   rv   rt   r   r   r   )r)   r   r   viewposstartr   rq   r   r   r   r     s     
z#BaseSelectorEventLoop._sock_sendallc                    s   t | | jr"| dkr"tdttdr8|jtjkrf| j||j|j	| dI dH }|d \}}}}}| 
 }| ||| |I dH S )zTConnect to a remote socket at address.

        This method is a coroutine.
        r   r   AF_UNIX)familyprotoloopN)r   rZ   r   rz   hasattrrJ   r   r   _ensure_resolvedr   rs   _sock_connect)r)   r   r=   resolvedrn   r   r   r   r   sock_connect  s    z"BaseSelectorEventLoop.sock_connectc              
   C   s   |  }z|| W n ttfyb   | | | || j|||}|tj	| j
||d Y nN ttfyx    Y n8 ty } z|| W Y d }~nd }~0 0 |d  d S )Nr   )rG   connectrT   rS   r|   r   _sock_connect_cbr   r   r   r   ru   rv   rt   r   r   )r)   r   r   r=   r   r   rq   r   r   r   r     s     
 z#BaseSelectorEventLoop._sock_connectc                 C   s   |d u s|  s| | d S r.   )r   r   r   r   r   r   r     s    z&BaseSelectorEventLoop._sock_write_donec              
   C   s   |  rd S z,|tjtj}|dkr6t|d| W nX ttfyN   Y nN tt	fyd    Y n8 t
y } z|| W Y d }~nd }~0 0 |d  d S )Nr   zConnect call failed )r   
getsockoptrJ   
SOL_SOCKETSO_ERRORrY   rT   rS   ru   rv   rt   r   r   )r)   r   r   r=   errrq   r   r   r   r     s     z&BaseSelectorEventLoop._sock_connect_cbc                    s@   t | | jr"| dkr"td|  }| || |I dH S )aW  Accept a connection.

        The socket must be bound to an address and listening for connections.
        The return value is a pair (conn, address) where conn is a new socket
        object usable to send and receive data on the connection, and address
        is the address bound to the socket on the other end of the connection.
        r   r   N)r   rZ   r   rz   rs   _sock_accept)r)   r   r   r   r   r   sock_accept$  s    z!BaseSelectorEventLoop.sock_acceptc              
   C   s   |  }z| \}}|d W n ttfyl   | | | || j||}|t	j
| j||d Y nR ttfy    Y n< ty } z|| W Y d }~nd }~0 0 |||f d S )NFr   )rG   re   rL   rT   rS   r|   rM   r   r   r   r   r   ru   rv   rt   r   r   )r)   r   r   r   ro   r=   r   rq   r   r   r   r   3  s    
 z"BaseSelectorEventLoop._sock_acceptc              	      s   | j |j= | }|  | I d H  zL| j|j|||ddI d H W |  |rZ|  || j |j< S || j |j< n"|  |r|  || j |j< 0 d S )NF)fallback)	r(   _sock_fd
is_readingpause_reading_make_empty_waitersock_sendfile_sock_reset_empty_waiterresume_reading)r)   transpfileoffsetcountr   r   r   r   _sendfile_nativeD  s*    
   z&BaseSelectorEventLoop._sendfile_nativec                 C   s   |D ]v\}}|j |j }\}}|tj@ rL|d urL|jrB| | n
| | |tj@ r|d ur|jrp| | q| | qd S r.   )	fileobjrP   r   r   
_cancelledrE   _add_callbackr   r   )r)   
event_listr   r   r   r   r   r   r   r   _process_eventsR  s    
z%BaseSelectorEventLoop._process_eventsc                 C   s   |  |  |  d S r.   )rE   rG   rC   )r)   r   r   r   r   _stop_serving`  s    z#BaseSelectorEventLoop._stop_serving)N)N)N)NNN)N)N)-r#   
__module____qualname____doc__r   r2   r   SSL_HANDSHAKE_TIMEOUTr;   r>   rC   rB   r%   rQ   rN   r[   r`   r]   rl   r|   rM   rE   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   r*   r   r   0   sj   
  

	
.
)

r   c                       s   e Zd ZdZ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dd Z  ZS ) _SelectorTransporti   Nc                    s   t  || t|| jd< z| | jd< W n tyL   d | jd< Y n0 d| jvrz| | jd< W n tj	y   d | jd< Y n0 || _
| | _d| _| | || _|  | _d| _d| _| jd ur| j  | |j| j< d S )NrJ   Zsocknamerc   Fr   )r   r   r   ri   _extragetsocknamerY   getpeernamerJ   errorr   rG   r   _protocol_connectedset_protocol_server_buffer_factory_buffer
_conn_lost_closing_attachr(   )r)   r   r   r0   r,   r-   r*   r   r   r   q  s,    





z_SelectorTransport.__init__c                 C   s   | j jg}| jd u r |d n| jr0|d |d| j  | jd ur| j st| jj	| jt
j}|rz|d n
|d t| jj	| jt
j}|rd}nd}|  }|d| d	| d
 dd|S )Nclosedclosingzfd=zread=pollingz	read=idlepollingidlezwrite=<z
, bufsize=>z<{}> )r"   r#   r   appendr   r   _looprA   r   r$   r   r   r   get_write_buffer_sizeformatjoin)r)   infor   statebufsizer   r   r   __repr__  s.    



z_SelectorTransport.__repr__c                 C   s   |  d  d S r.   )_force_closerD   r   r   r   abort  s    z_SelectorTransport.abortc                 C   s   || _ d| _d S NT)	_protocolr   r)   r0   r   r   r   r     s    z_SelectorTransport.set_protocolc                 C   s   | j S r.   )r   rD   r   r   r   get_protocol  s    z_SelectorTransport.get_protocolc                 C   s   | j S r.   )r   rD   r   r   r   r{     s    z_SelectorTransport.is_closingc                 C   sT   | j r
d S d| _ | j| j | jsP|  jd7  _| j| j | j| jd  d S NTr   )	r   r   rE   r   r   r   r   	call_soon_call_connection_lostrD   r   r   r   rC     s    z_SelectorTransport.closec                 C   s,   | j d ur(|d| t| d | j   d S )Nzunclosed transport )source)r   ResourceWarningrC   )r)   _warnr   r   r   __del__  s    
z_SelectorTransport.__del__Fatal error on transportc                 C   sN   t |tr(| j r@tjd| |dd n| j||| | jd | | d S )Nz%r: %sTrV   )ra   rb   rr   r0   )	r   rY   r   	get_debugr   r!   rh   r   r   )r)   rq   ra   r   r   r   _fatal_error  s    

z_SelectorTransport._fatal_errorc                 C   sd   | j r
d S | jr(| j  | j| j | jsBd| _| j| j |  j d7  _ | j| j	| d S r   )
r   r   clearr   r   r   r   rE   r   r  r)   rq   r   r   r   r     s    
z_SelectorTransport._force_closec                 C   s   zN| j r| j| W | j  d | _d | _d | _| j}|d ur|  d | _n:| j  d | _d | _d | _| j}|d ur|  d | _0 d S r.   )r   r   connection_lostr   rC   r   r   _detach)r)   rq   r-   r   r   r   r    s&    

z(_SelectorTransport._call_connection_lostc                 C   s
   t | jS r.   )r   r   rD   r   r   r   r     s    z(_SelectorTransport.get_write_buffer_sizec                 G   s$   | j r
d S | jj||g|R   d S r.   )r   r   rM   r   r   r   r   rM     s    z_SelectorTransport._add_reader)NN)r  )r#   r   r   max_size	bytearrayr   r   r   r   r   r   r   r{   rC   warningswarnr  r  r   r  r   rM   r   r   r   r*   r   r   e  s    

r   c                       s   e Zd ZdZejjZd# fd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dd Zdd Z fddZdd  Zd!d" Z  ZS )$r/   TNc                    s~   d | _ t ||||| d| _d| _d | _t| j | j	
| jj|  | j	
| j| j| j |d urz| j	
tj|d  d S r   )_read_ready_cbr   r   _eof_paused_empty_waiterr   _set_nodelayr   r   r   r   connection_maderM   r   _read_readyr   _set_result_unless_cancelled)r)   r   r   r0   r1   r,   r-   r*   r   r   r     s    

z!_SelectorSocketTransport.__init__c                    s.   t |tjr| j| _n| j| _t | d S r.   )r   r   BufferedProtocol_read_ready__get_bufferr  _read_ready__data_receivedr   r   r   r*   r   r   r     s    
z%_SelectorSocketTransport.set_protocolc                 C   s   | j  o| j S r.   )r  r   rD   r   r   r   r     s    z#_SelectorSocketTransport.is_readingc                 C   s>   | j s| jrd S d| _| j| j | j r:td|  d S )NTz%r pauses reading)r   r  r   rE   r   r  r   r!   rD   r   r   r   r     s    
z&_SelectorSocketTransport.pause_readingc                 C   s@   | j s| jsd S d| _| | j| j | j r<td|  d S )NFz%r resumes reading)	r   r  rM   r   r  r   r  r   r!   rD   r   r   r   r   $  s    
z'_SelectorSocketTransport.resume_readingc                 C   s   |    d S r.   )r  rD   r   r   r   r  ,  s    z$_SelectorSocketTransport._read_readyc              
   C   sV  | j r
d S z | jd}t|s(tdW nH ttfyB    Y n2 tyr } z| |d W Y d }~d S d }~0 0 z| j	
|}W n^ ttfy   Y d S  ttfy    Y n2 ty } z| |d W Y d }~d S d }~0 0 | s|   d S z| j| W nJ ttfy     Y n2 tyP } z| |d W Y d }~n
d }~0 0 d S )Nz%get_buffer() returned an empty bufferz/Fatal error: protocol.get_buffer() call failed.$Fatal read error on socket transportz3Fatal error: protocol.buffer_updated() call failed.)r   r   
get_bufferr   r@   ru   rv   rt   r  r   r   rT   rS   _read_ready__on_eofbuffer_updated)r)   r   rq   r   r   r   r   r  /  sB    z0_SelectorSocketTransport._read_ready__get_bufferc              
   C   s   | j r
d S z| j| j}W n^ ttfy4   Y d S  ttfyJ    Y n2 tyz } z| 	|d W Y d }~d S d }~0 0 |s| 
  d S z| j| W nF ttfy    Y n0 ty } z| 	|d W Y d }~n
d }~0 0 d S )Nr  z2Fatal error: protocol.data_received() call failed.)r   r   rR   r  rT   rS   ru   rv   rt   r  r  r   data_received)r)   rP   rq   r   r   r   r  T  s,    z3_SelectorSocketTransport._read_ready__data_receivedc              
   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 |r| j 
| j n|   d S )Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.)r   r  r   r!   r   eof_receivedru   rv   rt   r  rE   r   rC   )r)   	keep_openrq   r   r   r   r  m  s    
z,_SelectorSocketTransport._read_ready__on_eofc              
   C   s0  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sz| j|}W n\ ttfy   Y n^ ttfy    Y nH ty } z| |d W Y d }~d S d }~0 0 ||d  }|sd S | j| j| j | j| |   d S )N/data argument must be a bytes-like object, not z%Cannot call write() after write_eof()z(unable to write; sendfile is in progresssocket.send() raised exception.r   %Fatal write error on socket transport)r   bytesr  r   r   typer#   r  r@   r  r   r   !LOG_THRESHOLD_FOR_CONNLOST_WRITESr   warningr   r   rX   rT   rS   ru   rv   rt   r  r   r   r   _write_readyextend_maybe_pause_protocol)r)   rP   r   rq   r   r   r   write  s>    

z_SelectorSocketTransport.writec              
   C   s&  | j sJ d| jrd S z| j| j }W n ttfy@   Y n ttfyV    Y n ty } zF| j	
| j | j   | |d | jd ur| j| W Y d }~nxd }~0 0 |r| j d |= |   | j s"| j	
| j | jd ur| jd  | jr| d  n| jr"| jtj d S )NzData should not be emptyr&  )r   r   r   rX   rT   rS   ru   rv   rt   r   r   r   r	  r  r  r   _maybe_resume_protocolr   r   r  r  shutdownrJ   SHUT_WR)r)   r   rq   r   r   r   r+    s4    

"
z%_SelectorSocketTransport._write_readyc                 C   s.   | j s| jrd S d| _| js*| jtj d S r   )r   r  r   r   r0  rJ   r1  rD   r   r   r   	write_eof  s
    z"_SelectorSocketTransport.write_eofc                 C   s   dS r   r   rD   r   r   r   can_write_eof  s    z&_SelectorSocketTransport.can_write_eofc                    s*   t  | | jd ur&| jtd d S )NzConnection is closed by peer)r   r  r  r   ConnectionErrorr
  r*   r   r   r    s
    
z._SelectorSocketTransport._call_connection_lostc                 C   s6   | j d urtd| j | _ | js0| j d  | j S )NzEmpty waiter is already set)r  r@   r   rs   r   r   rD   r   r   r   r     s    
z+_SelectorSocketTransport._make_empty_waiterc                 C   s
   d | _ d S r.   )r  rD   r   r   r   r     s    z,_SelectorSocketTransport._reset_empty_waiter)NNN)r#   r   r   _start_tls_compatibler   _SendfileMode
TRY_NATIVE_sendfile_compatibler   r   r   r   r   r  r  r  r  r.  r+  r2  r3  r  r   r   r   r   r   r*   r   r/     s(     %'r/   c                       sF   e Zd ZejZd fdd	Zdd Zdd Zddd	Z	d
d Z
  ZS )r<   Nc                    s^   t  |||| || _| j| jj|  | j| j| j| j	 |d urZ| jt
j|d  d S r.   )r   r   _addressr   r   r   r  rM   r   r  r   r  )r)   r   r   r0   r=   r1   r,   r*   r   r   r     s    

z#_SelectorDatagramTransport.__init__c                 C   s   t dd | jD S )Nc                 s   s   | ]\}}t |V  qd S r.   )r   ).0rP   rn   r   r   r   	<genexpr>      zC_SelectorDatagramTransport.get_write_buffer_size.<locals>.<genexpr>)sumr   rD   r   r   r   r     s    z0_SelectorDatagramTransport.get_write_buffer_sizec              
   C   s   | j r
d S z| j| j\}}W n ttfy6   Y n tyd } z| j| W Y d }~n\d }~0  t	t
fyz    Y n> ty } z| |d W Y d }~nd }~0 0 | j|| d S )Nz&Fatal read error on datagram transport)r   r   recvfromr  rT   rS   rY   r   error_receivedru   rv   rt   r  datagram_receivedr)   rP   rp   rq   r   r   r   r    s     "z&_SelectorDatagramTransport._read_readyc              
   C   s  t |tttfs$tdt|j|s,d S | jrV|d | jfvrPtd| j | j}| j	r| jr| j	t
jkrxtd |  j	d7  _	d S | jsdz,| jd r| j| n| j|| W d S  ttfy   | j| j| j Y n~ ty } z| j| W Y d }~d S d }~0  ttfy0    Y n4 tyb } z| |d W Y d }~d S d }~0 0 | j t||f | !  d S )Nr$  z!Invalid address: must be None or r%  r   rc   'Fatal write error on datagram transport)"r   r'  r  r   r   r(  r#   r9  rz   r   r   r)  r   r*  r   r   r   rX   sendtorT   rS   r   r   r   _sendto_readyrY   r   r?  ru   rv   rt   r  r   r-  rA  r   r   r   rC    sJ    


z!_SelectorDatagramTransport.sendtoc              
   C   s  | j r| j  \}}z*| jd r.| j| n| j|| W q  ttfyh   | j ||f Y qY q  t	y } z| j
| W Y d }~d S d }~0  ttfy    Y q  ty } z| |d W Y d }~d S d }~0 0 q |   | j s| j| j | jr| d  d S )Nrc   rB  )r   popleftr   r   rX   rC  rT   rS   
appendleftrY   r   r?  ru   rv   rt   r  r/  r   r   r   r   r  rA  r   r   r   rD  2  s0    
z(_SelectorDatagramTransport._sendto_ready)NNN)N)r#   r   r   collectionsdequer   r   r   r  rC  rD  r   r   r   r*   r   r<     s     
+r<   )r   __all__rG  rg   r   r   rJ   r  r&   r   ImportError r   r   r   r   r   r	   r
   r   logr   r   r   BaseEventLoopr   _FlowControlMixin	Transportr   r/   r<   r   r   r   r   <module>   sF   
    9  o