
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    ¡ê,aT˜  ã                   @   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 )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)Ú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   ú</opt/alt/python38/lib64/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_selféd   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ràd|
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 | ¡ sŠt	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 )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   ú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 )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   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rŽz| ¡ | 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 ¡ 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¯   Ú_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 )Néÿÿÿÿz%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 qêY 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