U
    gT                     @   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
k
rd   dZ	Y nX 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   s8   z|  |}W n tk
r$   Y dS X t|j|@ S d S NF)get_keyKeyErrorboolr   )selectorfdZeventkey r   -/usr/lib/python3.8/asyncio/selector_events.py_test_selector_event    s
    r   c                 C   s    t d k	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d5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIdJ Z'dKdL Z(dMdN Z)dOdP Z*dQdR Z+  Z,S )Wr   zJSelector event loop.

    See events.EventLoop for API specification.
    Nc                    sF   t    |d krt }td|jj || _| 	  t
 | _d S )NzUsing selector: %s)super__init__	selectorsZDefaultSelectorr   debug	__class____name__	_selector_make_self_pipeweakrefZ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)r2   r(   )r	   ZSSLProtocolr,   Z_app_transport)r&   Zrawsockr-   
sslcontextr.   r0   r1   r)   r*   r2   Zssl_protocolr   r   r   _make_ssl_transportE   s         z)BaseSelectorEventLoop._make_ssl_transportc                 C   s   t | |||||S r+   )_SelectorDatagramTransport)r&   r   r-   addressr.   r)   r   r   r   _make_datagram_transportR   s
      z.BaseSelectorEventLoop._make_datagram_transportc                    sL   |   rtd|  rd S |   t   | jd k	rH| j  d | _d S )Nz!Cannot close a running event loop)Z
is_runningRuntimeError	is_closed_close_self_piper   closer"   r&   r'   r   r   r;   W   s    


zBaseSelectorEventLoop.closec                 C   sB   |  | j  | j  d | _| j  d | _|  jd8  _d S )Nr   )_remove_reader_ssockfilenor;   _csock_internal_fdsr<   r   r   r   r:   b   s    

z&BaseSelectorEventLoop._close_self_pipec                 C   sN   t  \| _| _| jd | jd |  jd7  _| | j | j d S )NFr   )	socketZ
socketpairr>   r@   setblockingrA   _add_readerr?   _read_from_selfr<   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   sX   z"| j d}|sW qT| | W q  tk
r:   Y q Y q  tk
rP   Y qTY q X q d S )Ni   )r>   recvrH   InterruptedErrorBlockingIOErrorrF   r   r   r   rE   u   s    z%BaseSelectorEventLoop._read_from_selfc                 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 socketTexc_info)r@   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+   )rD   r?   _accept_connection)r&   protocol_factoryr   r3   r*   backlogr2   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k
rZ   Y  d S  t	k
r }
 zd|
j
t
jt
jt
jt
jfkr| d|
t|d | |  | tj| j|||||| n W 5 d }
~
X Y qX d|	i}| ||||||}| | qd S )Nz#%r got a new connection from %r: %rFz&socket.accept() out of system resource)message	exceptionrB   peername)rangeacceptrQ   r   r   rC   rK   rJ   ConnectionAbortedErrorrP   errnoZEMFILEZENFILEZENOBUFSZENOMEMcall_exception_handlerr   TransportSocketr=   r?   Z
call_laterr   ZACCEPT_RETRY_DELAYrW   _accept_connection2Zcreate_task)r&   rU   r   r3   r*   rV   r2   _connaddrexcr)   r\   r   r   r   rT      sV               z(BaseSelectorEventLoop._accept_connectionc              
      s   d }d }zt| }|   }	|r8| j||||	d|||d}n| j|||	||d}z|	I d H  W n tk
rx   |   Y nX W nt ttfk
r    Y n\ tk
r }
 z>| jrd|
d}|d k	r||d< |d k	r||d< | | W 5 d }
~
X Y nX d S )NT)r.   r0   r)   r*   r2   )r.   r)   r*   z3Error on transport creation for incoming connection)rX   rY   r-   	transport)	create_futurer4   r/   BaseExceptionr;   
SystemExitKeyboardInterruptrQ   r_   )r&   rU   rc   r)   r3   r*   r2   r-   rf   r.   re   contextr   r   r   ra      sP            z)BaseSelectorEventLoop._accept_connection2c              
   C   s   |}t |tsJzt| }W n* tttfk
rH   td|d Y nX z| j| }W n tk
rl   Y nX | st	d|d|d S )NzInvalid file object: zFile descriptor z is used by transport )
r   intr?   AttributeErrorr   
ValueErrorr%   r   
is_closingr8   )r&   r   r?   rf   r   r   r   _ensure_fd_no_transport   s    
z-BaseSelectorEventLoop._ensure_fd_no_transportc           	   	   G   s   |    t||| d }z| j|}W n* tk
rR   | j|tj|d f Y n>X |j|j	 }\}}| j
||tjB ||f |d k	r|  d S r+   )_check_closedr   Handler"   r   r   registerr   
EVENT_READrG   modifycancel	r&   r   callbackargsZhandler   maskreaderwriterr   r   r   rD     s    
z!BaseSelectorEventLoop._add_readerc                 C   s   |   rdS z| j|}W n tk
r2   Y dS X |j|j }\}}|tj M }|sd| j| n| j	||d |f |d k	r|
  dS dS d S NFT)r9   r"   r   r   r   rG   r   rt   
unregisterru   rv   r&   r   r   rz   r{   r|   r   r   r   r=     s    z$BaseSelectorEventLoop._remove_readerc           	   	   G   s   |    t||| d }z| j|}W n* tk
rR   | j|tjd |f Y n>X |j|j	 }\}}| j
||tjB ||f |d k	r|  d S r+   )rq   r   rr   r"   r   r   rs   r   EVENT_WRITErG   ru   rv   rw   r   r   r   _add_writer%  s    
z!BaseSelectorEventLoop._add_writerc                 C   s   |   rdS z| j|}W n tk
r2   Y dS X |j|j }\}}|tj M }|sd| j| n| j	|||df |dk	r|
  dS dS dS )Remove a writer callback.FNT)r9   r"   r   r   r   rG   r   r   r~   ru   rv   r   r   r   r   _remove_writer4  s    z$BaseSelectorEventLoop._remove_writerc                 G   s   |  | | j||f| S )zAdd a reader callback.)rp   rD   r&   r   rx   ry   r   r   r   
add_readerK  s    
z BaseSelectorEventLoop.add_readerc                 C   s   |  | | |S )zRemove a reader callback.)rp   r=   r&   r   r   r   r   remove_readerP  s    
z#BaseSelectorEventLoop.remove_readerc                 G   s   |  | | j||f| S )zAdd a writer callback..)rp   r   r   r   r   r   
add_writerU  s    
z BaseSelectorEventLoop.add_writerc                 C   s   |  | | |S )r   )rp   r   r   r   r   r   remove_writerZ  s    
z#BaseSelectorEventLoop.remove_writerc              	      s   t | | jr"| dkr"tdz||W S  ttfk
rF   Y nX |  }| }| 	|| j
||| |t| j| |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-blockingN)r   rQ   
gettimeoutrn   rI   rK   rJ   rg   r?   r   
_sock_recvadd_done_callback	functoolspartial_sock_read_done)r&   r   nfutr   r   r   r   	sock_recv_  s    zBaseSelectorEventLoop.sock_recvc                 C   s   |  | d S r+   )r   r&   r   r   r   r   r   r   t  s    z%BaseSelectorEventLoop._sock_read_donec              
   C   s   |  rd S z||}W n\ ttfk
r4   Y d S  ttfk
rL    Y n6 tk
rv } z|| W 5 d }~X Y nX || d S r+   )	donerI   rK   rJ   ri   rj   rh   set_exception
set_result)r&   r   r   r   rG   re   r   r   r   r   w  s    z BaseSelectorEventLoop._sock_recvc              	      s   t | | jr"| dkr"tdz||W S  ttfk
rF   Y nX |  }| }| 	|| j
||| |t| j| |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   N)r   rQ   r   rn   	recv_intorK   rJ   rg   r?   r   _sock_recv_intor   r   r   r   )r&   r   bufr   r   r   r   r   sock_recv_into  s    z$BaseSelectorEventLoop.sock_recv_intoc              
   C   s   |  rd S z||}W n\ ttfk
r4   Y d S  ttfk
rL    Y n6 tk
rv } z|| W 5 d }~X Y nX || d S r+   )	r   r   rK   rJ   ri   rj   rh   r   r   )r&   r   r   r   nbytesre   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k
rL   d}Y nX |t|kr^dS |  }|	 }|
t| j| | || j||t||g |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   N)r   rQ   r   rn   rO   rK   rJ   lenrg   r?   r   r   r   _sock_write_doner   _sock_sendall
memoryview)r&   r   rG   r   r   r   r   r   r   sock_sendall  s&    	
 z"BaseSelectorEventLoop.sock_sendallc              
   C   s   |  rd S |d }z|||d  }W nb ttfk
rD   Y d S  ttfk
r\    Y n2 tk
r } z|| W Y d S d }~X Y nX ||7 }|t|kr|	d  n||d< d S )Nr   )
r   rO   rK   rJ   ri   rj   rh   r   r   r   )r&   r   r   Zviewposstartr   re   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   rQ   r   rn   hasattrrB   r   r   Z_ensure_resolvedr   rg   _sock_connect)r&   r   r6   Zresolvedrb   r   r   r   r   sock_connect  s       z"BaseSelectorEventLoop.sock_connectc              
   C   s   |  }z|| W n ttfk
rV   |t| j| | || j	||| Y nN t
tfk
rn    Y n6 tk
r } z|| W 5 d }~X Y nX |d  d S r+   )r?   ZconnectrK   rJ   r   r   r   r   r   _sock_connect_cbri   rj   rh   r   r   )r&   r   r   r6   r   re   r   r   r   r     s    z#BaseSelectorEventLoop._sock_connectc                 C   s   |  | d S 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 nZ ttfk
rP   Y nN tt	fk
rh    Y n6 t
k
r } z|| W 5 d }~X Y nX |d  d S )Nr   zConnect call failed )r   Z
getsockoptrB   Z
SOL_SOCKETZSO_ERRORrP   rK   rJ   ri   rj   rh   r   r   )r&   r   r   r6   errre   r   r   r   r     s    z&BaseSelectorEventLoop._sock_connect_cbc                    sB   t | | jr"| dkr"td|  }| |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   FN)r   rQ   r   rn   rg   _sock_accept)r&   r   r   r   r   r   sock_accept  s    z!BaseSelectorEventLoop.sock_acceptc              
   C   s   |  }|r| | | r"d S z| \}}|d W nn ttfk
rh   | || j|d| Y nR t	t
fk
r    Y n: tk
r } z|| W 5 d }~X Y nX |||f d S r}   )r?   r   r   r\   rC   rK   rJ   r   r   ri   rj   rh   r   r   )r&   r   Z
registeredr   r   rc   r6   re   r   r   r   r   *  s    
z"BaseSelectorEventLoop._sock_acceptc              	      sp   | j |j= | }|  | I d H  z | j|j|||ddI d H W S |  |r^|  || j |j< X d S )NF)Zfallback)	r%   _sock_fd
is_readingpause_reading_make_empty_waiter_reset_empty_waiterresume_readingZsock_sendfile_sock)r&   Ztranspfileoffsetcountr   r   r   r   _sendfile_native<  s    
z&BaseSelectorEventLoop._sendfile_nativec                 C   s   |D ]v\}}|j |j }\}}|tj@ rL|d k	rL|jrB| | n
| | |tj@ r|d k	r|jrp| | q| | qd S r+   )	fileobjrG   r   rt   Z
_cancelledr=   Z_add_callbackr   r   )r&   Z
event_listr   rz   r   r{   r|   r   r   r   _process_eventsJ  s    
z%BaseSelectorEventLoop._process_eventsc                 C   s   |  |  |  d S r+   )r=   r?   r;   )r&   r   r   r   r   _stop_servingX  s    z#BaseSelectorEventLoop._stop_serving)N)N)N)NNN)-r!   
__module____qualname____doc__r   r/   r   ZSSL_HANDSHAKE_TIMEOUTr4   r7   r;   r:   r#   rH   rE   rR   rW   rT   ra   rp   rD   r=   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   s~   
         
  
	  
. 
)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k
rN   d | jd< Y nX d| jkrz| | jd< W n  tj	k
r   d | jd< Y nX || _
| | _d| _| | || _|  | _d| _d| _| jd k	r| j  | |j| j< d S )NrB   ZsocknamerZ   Fr   )r   r   r   r`   _extraZgetsocknamerP   ZgetpeernamerB   errorr   r?   r   _protocol_connectedset_protocol_server_buffer_factory_buffer
_conn_lost_closingZ_attachr%   )r&   r   r   r-   r)   r*   r'   r   r   r   i  s,    





z_SelectorTransport.__init__c                 C   s   | j jg}| jd kr |d n| jr0|d |d| j  | jd k	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pollingZidlezwrite=<z
, bufsize=>z<{}> )r    r!   r   appendr   r   _loopr9   r   r"   r   rt   r   get_write_buffer_sizeformatjoin)r&   infor   statebufsizer   r   r   __repr__  s0    


 
z_SelectorTransport.__repr__c                 C   s   |  d  d S r+   )_force_closer<   r   r   r   abort  s    z_SelectorTransport.abortc                 C   s   || _ d| _d S NT)	_protocolr   r&   r-   r   r   r   r     s    z_SelectorTransport.set_protocolc                 C   s   | j S r+   )r   r<   r   r   r   get_protocol  s    z_SelectorTransport.get_protocolc                 C   s   | j S r+   )r   r<   r   r   r   ro     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   r=   r   r   r   r   	call_soon_call_connection_lostr<   r   r   r   r;     s    z_SelectorTransport.closec                 C   s,   | j d k	r(|d| t| d | j   d S )Nzunclosed transport )source)r   ResourceWarningr;   )r&   Z_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: %sTrM   )rX   rY   rf   r-   )	r   rP   r   	get_debugr   r   r_   r   r   )r&   re   rX   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   r=   r   r   r&   re   r   r   r   r     s    
z_SelectorTransport._force_closec                 C   sV   z| jr| j| W 5 | j   d | _ d | _d | _| j}|d k	rP|  d | _X d S r+   )r   r;   r   r   r   Z_detachr   Zconnection_lost)r&   re   r*   r   r   r   r     s    
z(_SelectorTransport._call_connection_lostc                 C   s
   t | jS r+   )r   r   r<   r   r   r   r     s    z(_SelectorTransport.get_write_buffer_sizec                 G   s"   | j r
d S | jj||f|  d S r+   )r   r   rD   r   r   r   r   rD     s    z_SelectorTransport._add_reader)NN)r   )r!   r   r   max_size	bytearrayr   r   r   r   r   r   r   ro   r;   warningswarnr   r   r   r   r   rD   r   r   r   r'   r   r   ]  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 k	rz| j	
tj|d  d S r   )_read_ready_cbr   r   _eof_paused_empty_waiterr   Z_set_nodelayr   r   r   r   connection_maderD   r   _read_readyr   _set_result_unless_cancelled)r&   r   r   r-   r.   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   Z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   r<   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   r=   r   r   r   r   r<   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   rD   r   r   r   r   r   r   r<   r   r   r   r     s    
z'_SelectorSocketTransport.resume_readingc                 C   s   |    d S r+   )r   r<   r   r   r   r   $  s    z$_SelectorSocketTransport._read_readyc              
   C   s`  | j r
d S z | jd}t|s(tdW nL ttfk
rD    Y n4 tk
rv } z| |d W Y d S d }~X Y nX z| j	
|}W nd ttfk
r   Y d S  ttfk
r    Y n4 tk
r } z| |d W Y d S d }~X Y nX |s |   d S z| j| W nJ ttfk
r,    Y n0 tk
rZ } z| |d W 5 d }~X Y nX 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   Z
get_bufferr   r8   ri   rj   rh   r   r   r   rK   rJ   _read_ready__on_eofZbuffer_updated)r&   r   re   r   r   r   r   r   '  sF      z0_SelectorSocketTransport._read_ready__get_bufferc              
   C   s   | j r
d S z| j| j}W nd ttfk
r6   Y d S  ttfk
rN    Y n4 tk
r } z| 	|d W Y d S d }~X Y nX |s| 
  d S z| j| W nF ttfk
r    Y n. tk
r } z| 	|d W 5 d }~X Y nX d S )Nr   z2Fatal error: protocol.data_received() call failed.)r   r   rI   r   rK   rJ   ri   rj   rh   r   r   r   Zdata_received)r&   rG   re   r   r   r   r   L  s.     z3_SelectorSocketTransport._read_ready__data_receivedc              
   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 |r| j 
| j n|   d S )Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.)r   r   r   r   r   Zeof_receivedri   rj   rh   r   r=   r   r;   )r&   Z	keep_openre   r   r   r   r   e  s    
 z,_SelectorSocketTransport._read_ready__on_eofc              
   C   s6  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sz| j|}W nb ttfk
r   Y nb ttfk
r    Y nJ tk
r } z| |d W Y d S d }~X Y nX ||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   r8   r   r   r   !LOG_THRESHOLD_FOR_CONNLOST_WRITESr   warningr   r   rO   rK   rJ   ri   rj   rh   r   r   r   r   _write_readyextend_maybe_pause_protocol)r&   rG   r   re   r   r   r   writez  s:    

z_SelectorSocketTransport.writec              
   C   s(  | j std| jrd S z| j| j }W n ttfk
rB   Y n ttfk
rZ    Y n t	k
r } z>| j
| j | j   | |d | jd k	r| j| W 5 d }~X Y npX |r| j d |= |   | j s$| j
| j | jd k	r| jd  | jr| d  n| jr$| jtj d S )NzData should not be emptyr   )r   AssertionErrorr   r   rO   rK   rJ   ri   rj   rh   r   r   r   r   r   r   r   _maybe_resume_protocolr   r   r   r   shutdownrB   SHUT_WR)r&   r   re   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   r  rB   r  r<   r   r   r   	write_eof  s
    z"_SelectorSocketTransport.write_eofc                 C   s   dS r   r   r<   r   r   r   can_write_eof  s    z&_SelectorSocketTransport.can_write_eofc                    s*   t  | | jd k	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 k	rtd| j | _ | js0| j d  | j S )NzEmpty waiter is already set)r   r8   r   rg   r   r   r<   r   r   r   r     s    
z+_SelectorSocketTransport._make_empty_waiterc                 C   s
   d | _ d S r+   )r   r<   r   r   r   r     s    z,_SelectorSocketTransport._reset_empty_waiter)NNN)r!   r   r   Z_start_tls_compatibler   Z_SendfileModeZ
TRY_NATIVEZ_sendfile_compatibler   r   r   r   r   r   r   r   r   r  r  r	  r
  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 )r5   Nc                    s^   t  |||| || _| j| jj|  | j| j| j| j	 |d k	rZ| jt
j|d  d S r+   )r   r   _addressr   r   r   r   rD   r   r   r   r   )r&   r   r   r-   r6   r.   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   ).0rG   rb   r   r   r   	<genexpr>  s     zC_SelectorDatagramTransport.get_write_buffer_size.<locals>.<genexpr>)sumr   r<   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k
r8   Y n tk
rd } z| j| W 5 d }~X Y nT t	t
fk
r|    Y n< tk
r } z| |d W 5 d }~X Y nX | j|| d S )Nz&Fatal read error on datagram transport)r   r   Zrecvfromr   rK   rJ   rP   r   error_receivedri   rj   rh   r   Zdatagram_receivedr&   rG   rd   re   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krPtd| j | j}| j	r| jr| j	t
jkrxtd |  j	d7  _	d S | jslz,| jd r| j| n| j|| W d S  ttfk
r   | j| j| j Y n tk
r } z| j| W Y d S d }~X Y nP ttfk
r6    Y n6 tk
rj } z| |d W Y d S d }~X Y nX | j t||f | !  d S )Nr   z!Invalid address: must be None or r   r   rZ   'Fatal write error on datagram transport)"r   r   r   r   r   r   r!   r  rn   r   r   r   r   r   r   r   r   rO   sendtorK   rJ   r   r   r   _sendto_readyrP   r   r  ri   rj   rh   r   r   r  r  r   r   r   r    sH    


 z!_SelectorDatagramTransport.sendtoc              
   C   s  | j r| j  \}}z*| jd r.| j| n| j|| W q  ttfk
rj   | j ||f Y qY q  t	k
r } z| j
| W Y d S d }~X Y q  ttfk
r    Y q  tk
r } z| |d W Y d S d }~X Y q X q |   | j s| j| j | jr| d  d S )NrZ   r  )r   popleftr   r   rO   r  rK   rJ   
appendleftrP   r   r  ri   rj   rh   r   r  r   r   r   r   r   r  r   r   r   r  *  s2    
 z(_SelectorDatagramTransport._sendto_ready)NNN)N)r!   r   r   collectionsdequer   r   r   r   r  r  r   r   r   r'   r   r5     s       
+r5   )r   __all__r  r^   r   r   rB   r   r$   r   ImportError r   r   r   r   r   r	   r
   r   logr   r   r   ZBaseEventLoopr   Z_FlowControlMixinZ	Transportr   r,   r5   r   r   r   r   <module>   sF   
    1  o