B
    Å S]ë‘  ã               @   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y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„ 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 )zÄEvent 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)Úloggerc             C   s6   y|   |¡}W n tk
r"   dS X t|j|@ ƒS d S )NF)Úget_keyÚKeyErrorÚboolr   )ÚselectorÚfdZeventÚkey© r   ú(lib/python3.7/asyncio/selector_events.pyÚ_test_selector_event   s
    r   c                   s†  e Zd ZdZdQ‡ fdd„	ZdRdddœdd„ZdSddddejd	œd
d„ZdTd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*‡  Z+S )Ur   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ÚweakrefÚWeakValueDictionaryÚ_transports)Úselfr   )r   r   r   r   0   s    
zBaseSelectorEventLoop.__init__)ÚextraÚserverc            C   s   t | |||||ƒS )N)Ú_SelectorSocketTransport)r    ÚsockÚ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)r*   )r!   r"   )r	   ZSSLProtocolr#   Z_app_transport)r    Zrawsockr%   Ú
sslcontextr&   r(   r)   r!   r"   r*   Zssl_protocolr   r   r   Ú_make_ssl_transport?   s    
z)BaseSelectorEventLoop._make_ssl_transportc             C   s   t | |||||ƒS )N)Ú_SelectorDatagramTransport)r    r$   r%   Úaddressr&   r!   r   r   r   Ú_make_datagram_transportL   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   r3   Q   s    


zBaseSelectorEventLoop.closec             C   sB   |   | j ¡ ¡ | j ¡  d | _| j ¡  d | _|  jd8  _d S )Nr   )Ú_remove_readerÚ_ssockÚfilenor3   Ú_csockÚ_internal_fds)r    r   r   r   r2   \   s    

z&BaseSelectorEventLoop._close_self_pipec             C   sN   t  ¡ \| _| _| j d¡ | j d¡ |  jd7  _|  | j ¡ | j¡ d S )NFr   )	ÚsocketZ
socketpairr5   r7   Úsetblockingr8   Ú_add_readerr6   Ú_read_from_self)r    r   r   r   r   d   s
    z%BaseSelectorEventLoop._make_self_pipec             C   s   d S )Nr   )r    Údatar   r   r   Ú_process_self_datal   s    z(BaseSelectorEventLoop._process_self_datac             C   sV   xPy | j  d¡}|sP |  |¡ W q tk
r8   wY q tk
rL   P Y qX qW d S )Ni   )r5   Úrecvr>   ÚInterruptedErrorÚBlockingIOError)r    r=   r   r   r   r<   o   s    z%BaseSelectorEventLoop._read_from_selfc             C   sJ   | j }|d k	rFy| d¡ W n( tk
rD   | jr@tjddd Y nX d S )Nó    z3Fail to write a null byte into the self-pipe socketT)Úexc_info)r7   ÚsendÚOSErrorÚ_debugr   r   )r    Zcsockr   r   r   Ú_write_to_self{   s    z$BaseSelectorEventLoop._write_to_selféd   c          
   C   s"   |   | ¡ | j||||||¡ d S )N)r;   r6   Ú_accept_connection)r    Úprotocol_factoryr$   r+   r"   Úbacklogr*   r   r   r   Ú_start_serving‹   s    
z$BaseSelectorEventLoop._start_servingc             C   s   xüt |ƒD ]ð}y0| ¡ \}}	| jr4t d||	|¡ | d¡ W n” tttfk
rZ   d S  t	k
rÔ }
 z^|
j
t
jt
jt
jt
jfkrÂ|  d|
|dœ¡ |  | ¡ ¡ |  tj| j||||||¡ n‚ W d d }
~
X Y qX d|	i}|  ||||||¡}|  |¡ qW d S )Nz#%r got a new connection from %r: %rFz&socket.accept() out of system resource)ÚmessageÚ	exceptionr9   Úpeername)ÚrangeÚacceptrF   r   r   r:   rA   r@   ÚConnectionAbortedErrorrE   ÚerrnoZEMFILEZENFILEZENOBUFSZENOMEMÚcall_exception_handlerr4   r6   Z
call_laterr   ZACCEPT_RETRY_DELAYrL   Ú_accept_connection2Zcreate_task)r    rJ   r$   r+   r"   rK   r*   Ú_ÚconnÚaddrÚexcr!   rQ   r   r   r   rI   ’   s6    



z(BaseSelectorEventLoop._accept_connectionc          
   Ã   sÖ   d }d }yl|ƒ }|   ¡ }	|r8| j||||	d|||d}n| j|||	||d}y|	I d H  W n   | ¡  ‚ Y nX W n\ tk
rÐ }
 z>| jrÀd|
dœ}|d k	r¦||d< |d k	r¶||d< |  |¡ W d d }
~
X Y nX d S )NT)r&   r(   r!   r"   r*   )r&   r!   r"   z3Error on transport creation for incoming connection)rM   rN   r%   Ú	transport)Úcreate_futurer,   r'   r3   Ú	ExceptionrF   rT   )r    rJ   rW   r!   r+   r"   r*   r%   rZ   r&   rY   Úcontextr   r   r   rU   ¾   s6    
z)BaseSelectorEventLoop._accept_connection2c          
   C   sŽ   |}t |tƒsJyt| ¡ ƒ}W n* tttfk
rH   td|›ƒd ‚Y nX y| j| }W n tk
rl   Y nX | ¡ sŠt	d|›d|›ƒ‚d S )NzInvalid file object: zFile descriptor z is used by transport )
Ú
isinstanceÚintr6   ÚAttributeErrorÚ	TypeErrorÚ
ValueErrorr   r   Ú
is_closingr0   )r    r   r6   rZ   r   r   r   Ú_ensure_fd_no_transportå   s    
z-BaseSelectorEventLoop._ensure_fd_no_transportc       	   	   G   s”   |   ¡  t ||| d ¡}y| 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 )N)Ú_check_closedr   ÚHandler   r   r   Úregisterr   Ú
EVENT_READr=   ÚmodifyÚcancel)	r    r   ÚcallbackÚargsÚhandler   ÚmaskÚreaderÚwriterr   r   r   r;   ÷   s    
z!BaseSelectorEventLoop._add_readerc             C   s’   |   ¡ rdS y| j |¡}W n tk
r0   dS X |j|j }\}}|tj M }|sb| j |¡ n| j 	||d |f¡ |d k	rŠ| 
¡  dS dS d S )NFT)r1   r   r   r   r   r=   r   rh   Ú
unregisterri   rj   )r    r   r   rn   ro   rp   r   r   r   r4     s    z$BaseSelectorEventLoop._remove_readerc       	   	   G   s”   |   ¡  t ||| d ¡}y| 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 )N)re   r   rf   r   r   r   rg   r   ÚEVENT_WRITEr=   ri   rj   )	r    r   rk   rl   rm   r   rn   ro   rp   r   r   r   Ú_add_writer  s    
z!BaseSelectorEventLoop._add_writerc             C   s’   |   ¡ rdS y| j |¡}W n tk
r0   dS X |j|j }\}}|tj M }|sb| j |¡ n| j 	|||df¡ |dk	rŠ| 
¡  dS dS dS )zRemove a writer callback.FNT)r1   r   r   r   r   r=   r   rr   rq   ri   rj   )r    r   r   rn   ro   rp   r   r   r   Ú_remove_writer*  s    z$BaseSelectorEventLoop._remove_writerc             G   s   |   |¡ | j||f|žŽ S )zAdd a reader callback.)rd   r;   )r    r   rk   rl   r   r   r   Ú
add_readerA  s    
z BaseSelectorEventLoop.add_readerc             C   s   |   |¡ |  |¡S )zRemove a reader callback.)rd   r4   )r    r   r   r   r   Úremove_readerF  s    
z#BaseSelectorEventLoop.remove_readerc             G   s   |   |¡ | j||f|žŽ S )zAdd a writer callback..)rd   rs   )r    r   rk   rl   r   r   r   Ú
add_writerK  s    
z BaseSelectorEventLoop.add_writerc             C   s   |   |¡ |  |¡S )zRemove a writer callback.)rd   rt   )r    r   r   r   r   Úremove_writerP  s    
z#BaseSelectorEventLoop.remove_writerc             Ã   s<   | j r| ¡ dkrtdƒ‚|  ¡ }|  |d||¡ |I dH S )zÌReceive 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   zthe socket must be non-blockingN)rF   Ú
gettimeoutrb   r[   Ú
_sock_recv)r    r$   ÚnÚfutr   r   r   Ú	sock_recvU  s
    zBaseSelectorEventLoop.sock_recvc             C   sœ   |d k	r|   |¡ | ¡ rd S y| |¡}W n` ttfk
rb   | ¡ }|  || j||||¡ Y n6 tk
rŒ } z| 	|¡ W d d }~X Y nX | 
|¡ d S )N)rv   Ú	cancelledr?   rA   r@   r6   ru   rz   r\   Úset_exceptionÚ
set_result)r    r|   Úregistered_fdr$   r{   r=   r   rY   r   r   r   rz   b  s    
z BaseSelectorEventLoop._sock_recvc             Ã   s<   | j r| ¡ dkrtdƒ‚|  ¡ }|  |d||¡ |I dH S )z¥Receive data from the socket.

        The received data is written into *buf* (a writable buffer).
        The return value is the number of bytes written.
        r   zthe socket must be non-blockingN)rF   ry   rb   r[   Ú_sock_recv_into)r    r$   Úbufr|   r   r   r   Úsock_recv_intow  s
    z$BaseSelectorEventLoop.sock_recv_intoc             C   sœ   |d k	r|   |¡ | ¡ rd S y| |¡}W n` ttfk
rb   | ¡ }|  || j||||¡ Y n6 tk
rŒ } z| 	|¡ W d d }~X Y nX | 
|¡ d S )N)rv   r~   Ú	recv_intorA   r@   r6   ru   r‚   r\   r   r€   )r    r|   r   r$   rƒ   Únbytesr   rY   r   r   r   r‚   ƒ  s    
z%BaseSelectorEventLoop._sock_recv_intoc             Ã   sL   | j r| ¡ dkrtdƒ‚|  ¡ }|r8|  |d||¡ n
| 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   zthe socket must be non-blockingN)rF   ry   rb   r[   Ú_sock_sendallr€   )r    r$   r=   r|   r   r   r   Úsock_sendall™  s    	
z"BaseSelectorEventLoop.sock_sendallc          
   C   s¾   |d k	r|   |¡ | ¡ rd S y| |¡}W nF ttfk
rH   d}Y n, tk
rr } z| |¡ d S d }~X Y nX |t|ƒkrŒ| d ¡ n.|rœ||d … }| 	¡ }|  
|| j||||¡ d S )Nr   )rx   r~   rD   rA   r@   r\   r   Úlenr€   r6   rw   r‡   )r    r|   r   r$   r=   r{   rY   r   r   r   r   r‡   «  s"    

z#BaseSelectorEventLoop._sock_sendallc             Ã   s~   | j r| ¡ dkrtdƒ‚ttdƒr0|jtjkr^| 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   zthe socket must be non-blockingÚAF_UNIX)ÚfamilyÚprotoÚloopN)rF   ry   rb   Úhasattrr9   r‹   rŠ   Z_ensure_resolvedrŒ   r[   Ú_sock_connect)r    r$   r.   ZresolvedrV   r|   r   r   r   Úsock_connectÁ  s    z"BaseSelectorEventLoop.sock_connectc          
   C   s   |  ¡ }y| |¡ W nj ttfk
rV   | t | j|¡¡ |  || j	|||¡ Y n6 t
k
r€ } z| |¡ W d d }~X Y nX | d ¡ d S )N)r6   ZconnectrA   r@   Zadd_done_callbackÚ	functoolsÚpartialÚ_sock_connect_donerw   Ú_sock_connect_cbr\   r   r€   )r    r|   r$   r.   r   rY   r   r   r   r   Ò  s    z#BaseSelectorEventLoop._sock_connectc             C   s   |   |¡ d S )N)rx   )r    r   r|   r   r   r   r“   ã  s    z(BaseSelectorEventLoop._sock_connect_donec          
   C   sŠ   |  ¡ rd S y,| tjtj¡}|dkr6t|d|› ƒ‚W nB ttfk
rP   Y n6 tk
rz } z| 	|¡ W d d }~X Y nX | 
d ¡ d S )Nr   zConnect call failed )r~   Z
getsockoptr9   Z
SOL_SOCKETZSO_ERRORrE   rA   r@   r\   r   r€   )r    r|   r$   r.   ÚerrrY   r   r   r   r”   æ  s    z&BaseSelectorEventLoop._sock_connect_cbc             Ã   s:   | 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   zthe socket must be non-blockingFN)rF   ry   rb   r[   Ú_sock_accept)r    r$   r|   r   r   r   Úsock_accept÷  s
    z!BaseSelectorEventLoop.sock_acceptc          
   C   s¦   |  ¡ }|r|  |¡ | ¡ r"d S y| ¡ \}}| d¡ W nV ttfk
rh   |  || j|d|¡ Y n: t	k
r’ } z| 
|¡ W d d }~X Y nX | ||f¡ d S )NFT)r6   rv   r~   rQ   r:   rA   r@   ru   r–   r\   r   r€   )r    r|   Z
registeredr$   r   rW   r.   rY   r   r   r   r–     s    
z"BaseSelectorEventLoop._sock_acceptc          	   Ã   sl   | j |j= | ¡ }| ¡  | ¡ I d H  z| j|j|||ddI d H S | ¡  |rZ| ¡  || j |j< X d S )NF)Zfallback)	r   Ú_sock_fdÚ
is_readingÚpause_readingÚ_make_empty_waiterZsock_sendfileÚ_sockÚ_reset_empty_waiterÚresume_reading)r    ZtranspÚfileÚoffsetÚcountrž   r   r   r   Ú_sendfile_native  s    
z&BaseSelectorEventLoop._sendfile_nativec             C   s„   x~|D ]v\}}|j |j }\}}|tj@ rN|d k	rN|jrD|  |¡ n
|  |¡ |tj@ r|d k	r|jrr|  |¡ q|  |¡ qW d S )N)	Úfileobjr=   r   rh   Z
_cancelledr4   Z_add_callbackrr   rt   )r    Z
event_listr   rn   r£   ro   rp   r   r   r   Ú_process_events#  s    
z%BaseSelectorEventLoop._process_eventsc             C   s   |   | ¡ ¡ | ¡  d S )N)r4   r6   r3   )r    r$   r   r   r   Ú_stop_serving1  s    z#BaseSelectorEventLoop._stop_serving)N)N)N)NNN),r   Ú
__module__Ú__qualname__Ú__doc__r   r'   r   ZSSL_HANDSHAKE_TIMEOUTr,   r/   r3   r2   r   r>   r<   rG   rL   rI   rU   rd   r;   r4   rs   rt   ru   rv   rw   rx   r}   rz   r„   r‚   rˆ   r‡   r   r   r“   r”   r—   r–   r¢   r¤   r¥   Ú__classcell__r   r   )r   r   r   *   sZ   


+$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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 ƒ  ||¡ || jd< y| ¡ | jd< W n tk
rH   d | jd< Y nX d| jkrˆy| ¡ | 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 )Nr9   ZsocknamerO   Fr   )r   r   Ú_extraZgetsocknamerE   Zgetpeernamer9   Úerrorrœ   r6   r˜   Ú_protocol_connectedÚset_protocolÚ_serverÚ_buffer_factoryÚ_bufferÚ
_conn_lostÚ_closingZ_attachr   )r    r   r$   r%   r!   r"   )r   r   r   r   B  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 ¡ sÆt| jj	| jt
jƒ}|rz| d¡ n
| d¡ t| jj	| jt
jƒ}|r¢d}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˜   Ú_loopr1   r   r   r   rh   rr   Úget_write_buffer_sizeÚformatÚjoin)r    Úinfor¶   ÚstateÚbufsizer   r   r   Ú__repr__\  s*    



z_SelectorTransport.__repr__c             C   s   |   d ¡ d S )N)Ú_force_close)r    r   r   r   Úabortx  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 )N)rÄ   )r    r   r   r   Úget_protocol  s    z_SelectorTransport.get_protocolc             C   s   | j S )N)r³   )r    r   r   r   rc   ‚  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º   r4   r˜   r±   r²   rt   Ú	call_soonÚ_call_connection_lost)r    r   r   r   r3   …  s    z_SelectorTransport.closec             C   s.   | j d k	r*tjd| ›t| d | j  ¡  d S )Nzunclosed transport )Úsource)rœ   ÚwarningsÚwarnÚResourceWarningr3   )r    r   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: %sT)rC   )rM   rN   rZ   r%   )	r^   rE   rº   Ú	get_debugr   r   rT   rÄ   rÂ   )r    rY   rM   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 )NTr   )
r²   r±   Úclearrº   rt   r˜   r³   r4   rÆ   rÇ   )r    rY   r   r   r   rÂ   £  s    
z_SelectorTransport._force_closec             C   sV   z| j r| j |¡ W d | j ¡  d | _d | _d | _| j}|d k	rP| ¡  d | _X d S )N)r­   rÄ   Zconnection_lostrœ   r3   rº   r¯   Z_detach)r    rY   r"   r   r   r   rÇ   ¯  s    
z(_SelectorTransport._call_connection_lostc             C   s
   t | jƒS )N)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 )N)r³   rº   r;   )r    r   rk   rl   r   r   r   r;   À  s    z_SelectorTransport._add_reader)NN)rÍ   )r   r¦   r§   Úmax_sizeÚ	bytearrayr°   rœ   r   rÁ   rÃ   r®   rÅ   rc   r3   rÌ   rÏ   rÂ   rÇ   r»   r;   r©   r   r   )r   r   rª   6  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 )NF)Ú_read_ready_cbr   r   Ú_eofÚ_pausedÚ_empty_waiterr   Z_set_nodelayrœ   rº   rÆ   rÄ   Úconnection_mader;   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 )N)r^   r   ZBufferedProtocolÚ_read_ready__get_bufferrÓ   Ú_read_ready__data_receivedr   r®   )r    r%   )r   r   r   r®   ã  s    
z%_SelectorSocketTransport.set_protocolc             C   s   | j  o| j S )N)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º   r4   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Õ   r;   r˜   rØ   rº   rÎ   r   r   )r    r   r   r   rž   ö  s    
z'_SelectorSocketTransport.resume_readingc             C   s   |   ¡  d S )N)rÓ   )r    r   r   r   rØ   þ  s    z$_SelectorSocketTransport._read_readyc          
   C   s  | j r
d S y | j d¡}t|ƒs(tdƒ‚W n. tk
rX } z|  |d¡ d S d }~X Y nX y| j |¡}W nD t	t
fk
r‚   d S  tk
r® } z|  |d¡ d S d }~X Y nX |sÀ|  ¡  d S y| j |¡ W n0 tk
r  } z|  |d¡ W d d }~X Y nX d S )Néÿÿÿÿz%get_buffer() returned an empty bufferz/Fatal error: protocol.get_buffer() call failed.z$Fatal read error on socket transportz3Fatal error: protocol.buffer_updated() call failed.)r²   rÄ   Z
get_bufferr‰   r0   r\   rÏ   rœ   r…   rA   r@   Ú_read_ready__on_eofZbuffer_updated)r    rƒ   rY   r†   r   r   r   rÚ     s2    z0_SelectorSocketTransport._read_ready__get_bufferc          
   C   s¶   | j r
d S y| j | j¡}W nD ttfk
r4   d S  tk
r` } z|  |d¡ d S d }~X Y nX |sr|  ¡  d S y| j	 
|¡ W n. tk
r° } z|  |d¡ W d d }~X Y nX d S )Nz$Fatal read error on socket transportz2Fatal error: protocol.data_received() call failed.)r²   rœ   r?   rÑ   rA   r@   r\   rÏ   rÝ   rÄ   Zdata_received)r    r=   rY   r   r   r   rÛ      s"    z3_SelectorSocketTransport._read_ready__data_receivedc          
   C   st   | j  ¡ rt d| ¡ y| j ¡ }W n. tk
rR } z|  |d¡ d S d }~X Y nX |rh| j  | j	¡ n|  
¡  d S )Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.)rº   rÎ   r   r   rÄ   Zeof_receivedr\   rÏ   r4   r˜   r3   )r    Z	keep_openrY   r   r   r   rÝ   5  s    
z,_SelectorSocketTransport._read_ready__on_eofc          
   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 sþy| j |¡}W nD ttfk
rª   Y nB tk
rÖ } z|  |d¡ d S d }~X Y nX ||d … }|sìd S | j | j| j¡ | j |¡ |  ¡  d S )Nz/data argument must be a bytes-like object, not z%Cannot call write() after write_eof()z(unable to write; sendfile is in progresszsocket.send() raised exception.r   z%Fatal write error on socket transport)r^   ÚbytesrÒ   Ú
memoryviewra   Útyper   rÔ   r0   rÖ   r²   r   Ú!LOG_THRESHOLD_FOR_CONNLOST_WRITESr   Úwarningr±   rœ   rD   rA   r@   r\   rÏ   rº   rs   r˜   Ú_write_readyÚextendÚ_maybe_pause_protocol)r    r=   r{   rY   r   r   r   ÚwriteH  s6    

z_SelectorSocketTransport.writec          
   C   s  | j stdƒ‚| jrd S y| j | j ¡}W nr ttfk
rB   Y nÈ tk
rœ } z>| j 	| j
¡ | j  ¡  |  |d¡ | jd k	rŒ| j |¡ W d d }~X Y nnX |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 emptyz%Fatal write error on socket transport)r±   ÚAssertionErrorr²   rœ   rD   rA   r@   r\   rº   rt   r˜   rÐ   rÏ   rÖ   r   Ú_maybe_resume_protocolr€   r³   rÇ   rÔ   Úshutdownr9   ÚSHUT_WR)r    r{   rY   r   r   r   rã   m  s0    


z%_SelectorSocketTransport._write_readyc             C   s.   | j s| jrd S d| _| js*| j tj¡ d S )NT)r³   rÔ   r±   rœ   ré   r9   rê   )r    r   r   r   Ú	write_eof‰  s
    z"_SelectorSocketTransport.write_eofc             C   s   dS )NTr   )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   ÚConnectionError)r    rY   )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Ö   r0   rº   r[   r±   r€   )r    r   r   r   r›   ™  s    
z+_SelectorSocketTransport._make_empty_waiterc             C   s
   d | _ d S )N)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 )r-   Nc                s^   t ƒ  ||||¡ || _| j | jj| ¡ | j | j| j| j	¡ |d k	rZ| j t
j|d ¡ d S )N)r   r   Ú_addressrº   rÆ   rÄ   r×   r;   r˜   rØ   r   rÙ   )r    r   r$   r%   r.   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 )N)r‰   )Ú.0r=   rV   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 y| j | j¡\}}W np ttfk
r8   Y nh tk
rd } z| j |¡ W d d }~X Y n< t	k
r } z|  
|d¡ W d d }~X Y nX | j ||¡ d S )Nz&Fatal read error on datagram transport)r²   rœ   ZrecvfromrÑ   rA   r@   rE   rÄ   Úerror_receivedr\   rÏ   Zdatagram_received)r    r=   rX   rY   r   r   r   rØ   ¹  s    z&_SelectorDatagramTransport._read_readyc          
   C   sd  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sDy*| jd r¬| j |¡ n| j ||¡ d S  ttfk
ræ   | j | j| j¡ Y n^ tk
r } z| j |¡ d S d }~X Y n0 tk
rB } z|  |d¡ d S d }~X Y nX | j t|ƒ|f¡ |  ¡  d S )Nz/data argument must be a bytes-like object, not z!Invalid address: must be None or zsocket.send() raised exception.r   rO   z'Fatal write error on datagram transport) r^   rÞ   rÒ   rß   ra   rà   r   rî   rb   r²   r   rá   r   râ   r±   r«   rœ   rD   ÚsendtorA   r@   rº   rs   r˜   Ú_sendto_readyrE   rÄ   rò   r\   rÏ   r¹   rå   )r    r=   rX   rY   r   r   r   ró   Ç  s>    

z!_SelectorDatagramTransport.sendtoc          
   C   sø   xÆ| j rÆ| j  ¡ \}}y*| jd r0| j |¡ n| j ||¡ W q ttfk
rj   | j  ||f¡ P Y q t	k
r– } z| j
 |¡ d S d }~X Y q tk
rÂ } z|  |d¡ d S d }~X Y qX qW |  ¡  | j sô| j | j¡ | jrô|  d ¡ d S )NrO   z'Fatal write error on datagram transport)r±   Úpopleftr«   rœ   rD   ró   rA   r@   Ú
appendleftrE   rÄ   rò   r\   rÏ   rè   rº   rt   r˜   r³   rÇ   )r    r=   rX   rY   r   r   r   rô   ð  s*    
z(_SelectorDatagramTransport._sendto_ready)NNN)N)r   r¦   r§   ÚcollectionsÚdequer°   r   r»   rØ   ró   rô   r©   r   r   )r   r   r-   ¥  s    
)r-   )r¨   Ú__all__r÷   rS   r‘   r   r9   rÉ   r   ZsslÚImportErrorÚ r   r   r   r   r   r	   r
   Úlogr   r   ZBaseEventLoopr   Z_FlowControlMixinZ	Transportrª   r#   r-   r   r   r   r   Ú<module>   s@   
      _