B
    v9aë‘  ã               @   s  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
r`   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 ))Ú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   ú%/usr/lib/python3.7/selector_events.pyÚ_test_selector_event   s
    r   c                   s‚  e Zd ZdP‡ fdd„	ZdQdddœdd„ZdRddddejdœd	d
„ZdSd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.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Z d>d?„ Z!d@dA„ Z"dBdC„ Z#dDdE„ Z$dFdG„ Z%dHdI„ Z&dJdK„ Z'dLdM„ Z(dNdO„ Z)‡  Z*S )Tr   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   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   r2   Q   s    


zBaseSelectorEventLoop.closec             C   sB   |   | j ¡ ¡ | j ¡  d | _| j ¡  d | _|  jd8  _d S )Nr   )Ú_remove_readerÚ_ssockÚfilenor2   Ú_csockÚ_internal_fds)r   r   r   r   r1   \   s    

z&BaseSelectorEventLoop._close_self_pipec             C   sN   t  ¡ \| _| _| j d¡ | j d¡ |  jd7  _|  | j ¡ | j¡ d S )NFr   )	ÚsocketZ
socketpairr4   r6   Úsetblockingr7   Ú_add_readerr5   Ú_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   )r4   Ú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)r6   Ú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:   r5   Ú_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Ú	exceptionr8   Úpeername)ÚrangeÚacceptrE   r   r   r9   r@   r?   ÚConnectionAbortedErrorrD   ÚerrnoZEMFILEZENFILEZENOBUFSZENOMEMÚcall_exception_handlerr3   r5   Z
call_laterr   ZACCEPT_RETRY_DELAYrK   Ú_accept_connection2Zcreate_task)r   rI   r#   r*   r!   rJ   r)   Ú_ÚconnÚaddrÚexcr    rP   r   r   r   rH   ’   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)rL   rM   r$   Ú	transport)Úcreate_futurer+   r&   r2   Ú	ExceptionrE   rS   )r   rI   rV   r    r*   r!   r)   r$   rY   r%   rX   Úcontextr   r   r   rT   ¾   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Úintr5   ÚAttributeErrorÚ	TypeErrorÚ
ValueErrorr   r   Ú
is_closingr/   )r   r   r5   rY   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)r0   r   r   r   r   r<   r   rg   Ú
unregisterrh   ri   )r   r   r   rm   rn   ro   r   r   r   r3     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)rd   r   re   r   r   r   rf   r   ÚEVENT_WRITEr<   rh   ri   )	r   r   rj   rk   rl   r   rm   rn   ro   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 )NFT)r0   r   r   r   r   r<   r   rq   rp   rh   ri   )r   r   r   rm   rn   ro   r   r   r   Ú_remove_writer*  s    z$BaseSelectorEventLoop._remove_writerc             G   s   |   |¡ | j||f|žŽ S )N)rc   r:   )r   r   rj   rk   r   r   r   Ú
add_readerA  s    
z BaseSelectorEventLoop.add_readerc             C   s   |   |¡ |  |¡S )N)rc   r3   )r   r   r   r   r   Úremove_readerF  s    
z#BaseSelectorEventLoop.remove_readerc             G   s   |   |¡ | j||f|žŽ S )N)rc   rr   )r   r   rj   rk   r   r   r   Ú
add_writerK  s    
z BaseSelectorEventLoop.add_writerc             C   s   |   |¡ |  |¡S )N)rc   rs   )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 )Nr   zthe socket must be non-blocking)rE   Ú
gettimeoutra   rZ   Ú
_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)ru   Ú	cancelledr>   r@   r?   r5   rt   ry   r[   Úset_exceptionÚ
set_result)r   r{   Úregistered_fdr#   rz   r<   r   rX   r   r   r   ry   b  s    
z BaseSelectorEventLoop._sock_recvc             Ã   s<   | j r| ¡ dkrtdƒ‚|  ¡ }|  |d ||¡ |I d H S )Nr   zthe socket must be non-blocking)rE   rx   ra   rZ   Ú_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)ru   r}   Ú	recv_intor@   r?   r5   rt   r   r[   r~   r   )r   r{   r€   r#   r‚   Únbytesr   rX   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 )Nr   zthe socket must be non-blocking)rE   rx   ra   rZ   Ú_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   )rw   r}   rC   r@   r?   r[   r~   Úlenr   r5   rv   r†   )r   r{   r€   r#   r<   rz   rX   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 )Nr   zthe socket must be non-blockingÚAF_UNIX)ÚfamilyÚprotoÚloop)rE   rx   ra   Úhasattrr8   rŠ   r‰   Z_ensure_resolvedr‹   rZ   Ú_sock_connect)r   r#   r-   ZresolvedrU   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)r5   Zconnectr@   r?   Zadd_done_callbackÚ	functoolsÚpartialÚ_sock_connect_donerv   Ú_sock_connect_cbr[   r~   r   )r   r{   r#   r-   r   rX   r   r   r   rŽ   Ò  s    z#BaseSelectorEventLoop._sock_connectc             C   s   |   |¡ d S )N)rw   )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
getsockoptr8   Z
SOL_SOCKETZSO_ERRORrD   r@   r?   r[   r~   r   )r   r{   r#   r-   ÚerrrX   r   r   r   r“   æ  s    z&BaseSelectorEventLoop._sock_connect_cbc             Ã   s:   | j r| ¡ dkrtdƒ‚|  ¡ }|  |d|¡ |I d H S )Nr   zthe socket must be non-blockingF)rE   rx   ra   rZ   Ú_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)r5   ru   r}   rP   r9   r@   r?   rt   r•   r[   r~   r   )r   r{   Z
registeredr#   r   rV   r-   rX   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)Ú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   rg   Z
_cancelledr3   Z_add_callbackrq   rs   )r   Z
event_listr   rm   r£   rn   ro   r   r   r   Ú_process_events#  s    
z%BaseSelectorEventLoop._process_eventsc             C   s   |   | ¡ ¡ | ¡  d S )N)r3   r5   r2   )r   r#   r   r   r   Ú_stop_serving1  s    z#BaseSelectorEventLoop._stop_serving)N)N)N)NNN)+r   Ú
__module__Ú__qualname__r   r&   r   ZSSL_HANDSHAKE_TIMEOUTr+   r.   r2   r1   r   r=   r;   rF   rK   rH   rT   rc   r:   r3   rr   rs   rt   ru   rv   rw   r|   ry   rƒ   r   r‡   r†   r   rŽ   r’   r“   r–   r•   r¢   r¤   r¥   Ú__classcell__r   r   )r   r   r   *   sX   


+$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 )Nr8   ZsocknamerN   Fr   )r   r   Ú_extraZgetsocknamerD   Zgetpeernamer8   Úerrorrœ   r5   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˜   Ú_loopr0   r   r   r   rg   rq   Ú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   rb   ‚  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¹   r3   r˜   r°   r±   rs   Ú	call_soonÚ_call_connection_lost)r   r   r   r   r2   …  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ÚResourceWarningr2   )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)rB   )rL   rM   rY   r$   )	r]   rD   r¹   Ú	get_debugr   r   rS   rÃ   rÁ   )r   rX   rL   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¹   rs   r˜   r²   r3   rÅ   rÆ   )r   rX   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œ   r2   r¹   r®   Z_detach)r   rX   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   rj   rk   r   r   r   r:   À  s    z_SelectorTransport._add_reader)NN)rÌ   )r   r¦   r§   Úmax_sizeÚ	bytearrayr¯   rœ   r   rÀ   rÂ   r­   rÄ   rb   r2   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¹   r3   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ˆ   r/   r[   rÎ   rœ   r„   r@   r?   Ú_read_ready__on_eofZbuffer_updated)r   r‚   rX   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Ð   r@   r?   r[   rÎ   rÜ   rÃ   Zdata_received)r   r<   rX   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Î   r3   r˜   r2   )r   Z	keep_openrX   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Ñ   Ú
memoryviewr`   Útyper   rÓ   r/   rÕ   r±   r   Ú!LOG_THRESHOLD_FOR_CONNLOST_WRITESr   Úwarningr°   rœ   rC   r@   r?   r[   rÎ   r¹   rr   r˜   Ú_write_readyÚextendÚ_maybe_pause_protocol)r   r<   rz   rX   r   r   r   ÚwriteH  s6    

z_SelectorSocketTransport.writec          
   C   sü   | j r
d S y| j | j¡}W nr ttfk
r4   Y nÄ tk
rŽ } z>| j | j	¡ | j 
¡  |  |d¡ | jd k	r~| j |¡ W d d }~X Y njX |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%Fatal write error on socket transport)r±   rœ   rC   r°   r@   r?   r[   r¹   rs   r˜   rÏ   rÎ   rÕ   r~   Ú_maybe_resume_protocolr   r²   rÆ   rÓ   Úshutdownr8   ÚSHUT_WR)r   rz   rX   r   r   r   râ   m  s.    


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ç   r8   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   rX   )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Õ   r/   r¹   rZ   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<   rU   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Ð   r@   r?   rD   rÃ   Úerror_receivedr[   rÎ   Zdatagram_received)r   r<   rW   rX   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   rN   z'Fatal write error on datagram transport) r]   rÝ   rÑ   rÞ   r`   rß   r   rì   ra   r±   r   rà   r   rá   r°   rª   rœ   rC   Úsendtor@   r?   r¹   rr   r˜   Ú_sendto_readyrD   rÃ   rð   r[   rÎ   r¸   rä   )r   r<   rW   rX   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 )NrN   z'Fatal write error on datagram transport)r°   Úpopleftrª   rœ   rC   rñ   r@   r?   Ú
appendleftrD   rÃ   rð   r[   rÎ   ræ   r¹   rs   r˜   r²   rÆ   )r   r<   rW   rX   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,   )Ú__all__rõ   rR   r   r   r8   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>   
      _