<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
B
    YI~d$“  ã               @   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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   ú</opt/alt/python37/lib64/python3.7/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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   5   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)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_transportD   s    
z)BaseSelectorEventLoop._make_ssl_transportc             C   s   t | |||||ƒS )N)Ú_SelectorDatagramTransport)r$   r   r(   Úaddressr)   r%   r   r   r   Ú_make_datagram_transportQ   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   r6   V   s    


zBaseSelectorEventLoop.closec             C   sB   |   | j ¡ ¡ | j ¡  d | _| j ¡  d | _|  jd8  _d S )Nr   )Ú_remove_readerÚ_ssockÚfilenor6   Ú_csockÚ_internal_fds)r$   r   r   r   r5   a   s    

z&BaseSelectorEventLoop._close_self_pipec             C   sN   t  ¡ \| _| _| j d¡ | j d¡ |  jd7  _|  | j ¡ | j¡ d S )NFr   )	ÚsocketZ
socketpairr8   r:   Úsetblockingr;   Ú_add_readerr9   Ú_read_from_self)r$   r   r   r   r!   i   s
    z%BaseSelectorEventLoop._make_self_pipec             C   s   d S )Nr   )r$   Údatar   r   r   Ú_process_self_dataq   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   )r8   ÚrecvrA   ÚInterruptedErrorÚBlockingIOError)r$   r@   r   r   r   r?   t   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)r:   Ú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>   r9   Ú_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Ú	exceptionr<   Úpeername)ÚrangeÚacceptrI   r   r   r=   rD   rC   ÚConnectionAbortedErrorrH   ÚerrnoZEMFILEZENFILEZENOBUFSZENOMEMÚcall_exception_handlerr7   r9   Z
call_laterr   ZACCEPT_RETRY_DELAYrO   Ú_accept_connection2Zcreate_task)r$   rM   r   r.   r&   rN   r-   Ú_ÚconnÚaddrÚexcr%   rT   r   r   r   rL   —   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)rP   rQ   r(   Ú	transport)Úcreate_futurer/   r*   r6   Ú	ExceptionrI   rW   )r$   rM   rZ   r%   r.   r&   r-   r(   r]   r)   r\   Úcontextr   r   r   rX   Ã   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 )
r   Úintr9   ÚAttributeErrorr   Ú
ValueErrorr#   r   Ú
is_closingr3   )r$   r   r9   r]   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)r4   r    r   r   r   r@   r   ri   Ú
unregisterrj   rk   )r$   r   r   ro   rp   rq   r   r   r   r7     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)rf   r   rg   r    r   r   rh   r   ÚEVENT_WRITEr@   rj   rk   )	r$   r   rl   rm   rn   r   ro   rp   rq   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)r4   r    r   r   r   r@   r   rs   rr   rj   rk   )r$   r   r   ro   rp   rq   r   r   r   Ú_remove_writer/  s    z$BaseSelectorEventLoop._remove_writerc             G   s   |   |¡ | j||f|žŽ S )N)re   r>   )r$   r   rl   rm   r   r   r   Ú
add_readerF  s    
z BaseSelectorEventLoop.add_readerc             C   s   |   |¡ |  |¡S )N)re   r7   )r$   r   r   r   r   Úremove_readerK  s    
z#BaseSelectorEventLoop.remove_readerc             G   s   |   |¡ | j||f|žŽ S )N)re   rt   )r$   r   rl   rm   r   r   r   Ú
add_writerP  s    
z BaseSelectorEventLoop.add_writerc             C   s   |   |¡ |  |¡S )N)re   ru   )r$   r   r   r   r   Úremove_writerU  s    
z#BaseSelectorEventLoop.remove_writerc             Ã   sD   t |ƒ | jr"| ¡ dkr"tdƒ‚|  ¡ }|  |d ||¡ |I d H S )Nr   zthe socket must be non-blocking)r   rI   Ú
gettimeoutrc   r^   Ú
_sock_recv)r$   r   ÚnÚfutr   r   r   Ú	sock_recvZ  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)rw   Ú	cancelledrB   rD   rC   r9   rv   r{   r_   Úset_exceptionÚ
set_result)r$   r}   Úregistered_fdr   r|   r@   r   r\   r   r   r   r{   h  s    
z BaseSelectorEventLoop._sock_recvc             Ã   sD   t |ƒ | jr"| ¡ dkr"tdƒ‚|  ¡ }|  |d ||¡ |I d H S )Nr   zthe socket must be non-blocking)r   rI   rz   rc   r^   Ú_sock_recv_into)r$   r   Úbufr}   r   r   r   Úsock_recv_into}  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)rw   r   Ú	recv_intorD   rC   r9   rv   rƒ   r_   r€   r   )r$   r}   r‚   r   r„   Únbytesr   r\   r   r   r   rƒ   Š  s    
z%BaseSelectorEventLoop._sock_recv_intoc             Ã   sT   t |ƒ | jr"| ¡ dkr"tdƒ‚|  ¡ }|r@|  |d ||¡ n
| d ¡ |I d H S )Nr   zthe socket must be non-blocking)r   rI   rz   rc   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   )ry   r   rG   rD   rC   r_   r€   Úlenr   r9   rx   rˆ   )r$   r}   r‚   r   r@   r|   r\   r   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 )Nr   zthe socket must be non-blockingÚAF_UNIX)ÚfamilyÚprotoÚloop)r   rI   rz   rc   Úhasattrr<   rŒ   r‹   Z_ensure_resolvedr   r^   Ú_sock_connect)r$   r   r1   ZresolvedrY   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)r9   ZconnectrD   rC   Zadd_done_callbackÚ	functoolsÚpartialÚ_sock_connect_donerx   Ú_sock_connect_cbr_   r€   r   )r$   r}   r   r1   r   r\   r   r   r   r   Û  s    z#BaseSelectorEventLoop._sock_connectc             C   s   |   |¡ d S )N)ry   )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
getsockoptr<   Z
SOL_SOCKETZSO_ERRORrH   rD   rC   r_   r€   r   )r$   r}   r   r1   Úerrr\   r   r   r   r•   ï  s    z&BaseSelectorEventLoop._sock_connect_cbc             Ã   sB   t |ƒ | jr"| ¡ dkr"tdƒ‚|  ¡ }|  |d|¡ |I d H S )Nr   zthe socket must be non-blockingF)r   rI   rz   rc   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)r9   rw   r   rT   r=   rD   rC   rv   r—   r_   r€   r   )r$   r}   Z
registeredr   r   rZ   r1   r\   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   ri   Z
_cancelledr7   Z_add_callbackrs   ru   )r$   Z
event_listr   ro   r¥   rp   rq   r   r   r   Ú_process_events-  s    
z%BaseSelectorEventLoop._process_eventsc             C   s   |   | ¡ ¡ | ¡  d S )N)r7   r9   r6   )r$   r   r   r   r   Ú_stop_serving;  s    z#BaseSelectorEventLoop._stop_serving)N)N)N)NNN)+r   Ú
__module__Ú__qualname__r   r*   r   ZSSL_HANDSHAKE_TIMEOUTr/   r2   r6   r5   r!   rA   r?   rJ   rO   rL   rX   re   r>   r7   rt   ru   rv   rw   rx   ry   r~   r{   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 )Nr<   ZsocknamerR   Fr   )r   r   Ú_extraZgetsocknamerH   Zgetpeernamer<   Úerrorrž   r9   rš   Ú_protocol_connectedÚset_protocolÚ_serverÚ_buffer_factoryÚ_bufferÚ
_conn_lostÚ_closingZ_attachr#   )r$   rŽ   r   r(   r%   r&   )r   r   r   r   L  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š   Ú_loopr4   r   r    r   ri   rs   Úget_write_buffer_sizeÚformatÚjoin)r$   Úinfor·   ÚstateÚbufsizer   r   r   Ú__repr__f  s*    



z_SelectorTransport.__repr__c             C   s   |   d ¡ d S )N)Ú_force_close)r$   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 )N)rÅ   )r$   r   r   r   Úget_protocol‰  s    z_SelectorTransport.get_protocolc             C   s   | j S )N)r´   )r$   r   r   r   rd   Œ  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»   r7   rš   r²   r³   ru   Ú	call_soonÚ_call_connection_lost)r$   r   r   r   r6     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ÚResourceWarningr6   )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)rF   )rP   rQ   r]   r(   )	r   rH   r»   Ú	get_debugr   r   rW   rÅ   rÃ   )r$   r\   rP   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»   ru   rš   r´   r7   rÇ   rÈ   )r$   r\   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ž   r6   r»   r°   Z_detach)r$   r\   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   rl   rm   r   r   r   r>   Ê  s    z_SelectorTransport._add_reader)NN)rÎ   )r   r¨   r©   Úmax_sizeÚ	bytearrayr±   rž   r   rÂ   rÄ   r¯   rÆ   rd   r6   rÍ   rÐ   rÃ   rÈ   r¼   r>   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 )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»   r7   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Š   r3   r_   rÐ   rž   r†   rD   rC   Ú_read_ready__on_eofZbuffer_updated)r$   r„   r\   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ž   rB   rÒ   rD   rC   r_   rÐ   rÞ   rÅ   Zdata_received)r$   r@   r\   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Ð   r7   rš   r6   )r$   Z	keep_openr\   r   r   r   rÞ   ?  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Õ   r3   r×   r³   r   Ú!LOG_THRESHOLD_FOR_CONNLOST_WRITESr   Úwarningr²   rž   rG   rD   rC   r_   rÐ   r»   rt   rš   Ú_write_readyÚextendÚ_maybe_pause_protocol)r$   r@   r|   r\   r   r   r   ÚwriteR  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ž   rG   r²   rD   rC   r_   r»   ru   rš   rÑ   rÐ   r×   r€   Ú_maybe_resume_protocolr   r´   rÈ   rÕ   Úshutdownr<   ÚSHUT_WR)r$   r|   r\   r   r   r   rä   w  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é   r<   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$   r\   )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×   r3   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 )r0   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(   r1   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@   rY   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Ò   rD   rC   rH   rÅ   Úerror_receivedr_   rÐ   Zdatagram_received)r$   r@   r[   r\   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   rR   z'Fatal write error on datagram transport) r   rß   rÓ   rà   r   rá   r   rî   rc   r³   r   râ   r   rã   r²   r¬   rž   rG   ÚsendtorD   rC   r»   rt   rš   Ú_sendto_readyrH   rÅ   rò   r_   rÐ   rº   ræ   )r$   r@   r[   r\   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 )NrR   z'Fatal write error on datagram transport)r²   Úpopleftr¬   rž   rG   ró   rD   rC   Ú
appendleftrH   rÅ   rò   r_   rÐ   rè   r»   ru   rš   r´   rÈ   )r$   r@   r[   r\   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   r0   ¯  s    
)r0   )Ú__all__r÷   rV   r’   r   r<   rÊ   r"   r   ÚImportErrorÚ r   r   r   r   r   r	   r
   Úlogr   r   r   ZBaseEventLoopr   Z_FlowControlMixinZ	Transportr«   r'   r0   r   r   r   r   Ú<module>   s@   
      _