U
    wy¤]'—  ã                   @   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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ÚfdÚeventÚkey© r   úT/home/stadmin/Documents/SimTableSoftware/Python-3.8.0/Lib/asyncio/selector_events.pyÚ_test_selector_event    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__Ú	selectorsÚDefaultSelectorr   ÚdebugÚ	__class__Ú__name__Ú	_selectorÚ_make_self_pipeÚweakrefÚWeakValueDictionaryÚ_transports)Úselfr   ©r   r   r   r   1   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)r1   r&   )r	   ÚSSLProtocolr*   Ú_app_transport)r$   Úrawsockr,   Ú
sslcontextr-   r/   r0   r'   r(   r1   Ússl_protocolr   r   r   Ú_make_ssl_transport@   s        ý ÿz)BaseSelectorEventLoop._make_ssl_transportc                 C   s   t | |||||ƒS r)   )Ú_SelectorDatagramTransport)r$   r+   r,   Úaddressr-   r'   r   r   r   Ú_make_datagram_transportM   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)Ú
is_runningÚRuntimeErrorÚ	is_closedÚ_close_self_piper   Úcloser   ©r$   r%   r   r   r?   R   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>   ]   s    

z&BaseSelectorEventLoop._close_self_pipec                 C   sN   t  ¡ \| _| _| j d¡ | j d¡ |  jd7  _|  | j ¡ | j¡ d S )NFr   )	ÚsocketÚ
socketpairrB   rD   ÚsetblockingrE   Ú_add_readerrC   Ú_read_from_selfr@   r   r   r   r    e   s
    z%BaseSelectorEventLoop._make_self_pipec                 C   s   d S r)   r   ©r$   Údatar   r   r   Ú_process_self_datam   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   )rB   ÚrecvrM   ÚInterruptedErrorÚBlockingIOErrorrK   r   r   r   rJ   p   s    z%BaseSelectorEventLoop._read_from_selfc                 C   sJ   | j }|d k	rFz| 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)rD   Ú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)   )rI   rC   Ú_accept_connection)r$   Úprotocol_factoryr+   r5   r(   Úbacklogr1   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Ú	exceptionrF   Úpeername)ÚrangeÚacceptrV   r   r   rH   rP   rO   ÚConnectionAbortedErrorrU   ÚerrnoZEMFILEZENFILEZENOBUFSZENOMEMÚcall_exception_handlerr   ÚTransportSocketrA   rC   Ú
call_laterr   ÚACCEPT_RETRY_DELAYr\   Ú_accept_connection2Úcreate_task)r$   rZ   r+   r5   r(   r[   r1   Ú_ÚconnÚaddrÚexcr'   ra   r   r   r   rY   “   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-   r/   r'   r(   r1   )r-   r'   r(   z3Error on transport creation for incoming connection)r]   r^   r,   Ú	transport)	Úcreate_futurer7   r.   ÚBaseExceptionr?   Ú
SystemExitÚKeyboardInterruptrV   rd   )r$   rZ   rk   r'   r5   r(   r1   r,   rn   r-   rm   Úcontextr   r   r   rh   ¿   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 )
Ú
isinstanceÚintrC   ÚAttributeErrorÚ	TypeErrorÚ
ValueErrorr#   r   Ú
is_closingr<   )r$   r   rC   rn   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_READrL   ÚmodifyÚcancel©	r$   r   ÚcallbackÚargsÚhandler   ÚmaskÚreaderÚwriterr   r   r   rI   ú   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)r=   r   r   r   r   rL   r   r~   Ú
unregisterr   r€   ©r$   r   r   r…   r†   r‡   r   r   r   rA   	  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)   )r{   r   r|   r   r   r   r}   r   ÚEVENT_WRITErL   r   r€   r   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)r=   r   r   r   r   rL   r   r‹   r‰   r   r€   rŠ   r   r   r   Ú_remove_writer-  s    z$BaseSelectorEventLoop._remove_writerc                 G   s   |   |¡ | j||f|žŽ S )zAdd a reader callback.)rz   rI   ©r$   r   r‚   rƒ   r   r   r   Ú
add_readerD  s    
z BaseSelectorEventLoop.add_readerc                 C   s   |   |¡ |  |¡S )zRemove a reader callback.)rz   rA   ©r$   r   r   r   r   Úremove_readerI  s    
z#BaseSelectorEventLoop.remove_readerc                 G   s   |   |¡ | j||f|žŽ S )zAdd a writer callback..)rz   rŒ   r   r   r   r   Ú
add_writerN  s    
z BaseSelectorEventLoop.add_writerc                 C   s   |   |¡ |  |¡S )r   )rz   rŽ   r‘   r   r   r   Úremove_writerS  s    
z#BaseSelectorEventLoop.remove_writerc              	   Ã   s‚   | j r| ¡ dkrtdƒ‚z| |¡W S  ttfk
r>   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)rV   Ú
gettimeoutrx   rN   rP   rO   ro   rC   r   Ú
_sock_recvÚadd_done_callbackÚ	functoolsÚpartialÚ_sock_read_done)r$   r+   ÚnÚfutr   r   r   r   Ú	sock_recvX  s    ÿzBaseSelectorEventLoop.sock_recvc                 C   s   |   |¡ d S r)   )r’   ©r$   r   r   r   r   r   r›   l  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)   )	ÚdonerN   rP   rO   rq   rr   rp   Úset_exceptionÚ
set_result)r$   r   r+   rœ   rL   rm   r   r   r   r—   o  s    z BaseSelectorEventLoop._sock_recvc              	   Ã   s‚   | j r| ¡ dkrtdƒ‚z| |¡W S  ttfk
r>   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)rV   r–   rx   Ú	recv_intorP   rO   ro   rC   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£   rP   rO   rq   rr   rp   r¡   r¢   )r$   r   r+   r¥   Únbytesrm   r   r   r   r¤   ’  s    z%BaseSelectorEventLoop._sock_recv_intoc              	   Ã   s    | j r| ¡ dkrtdƒ‚z| |¡}W n ttfk
rD   d}Y nX |t|ƒkrVd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)rV   r–   rx   rT   rP   rO   Úlenro   rC   r˜   r™   rš   Ú_sock_write_doner“   Ú_sock_sendallÚ
memoryview)r$   r+   rL   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    rT   rP   rO   rq   rr   rp   r¡   r¨   r¢   )r$   r   r+   ÚviewÚposÚstartrœ   rm   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   r•   ÚAF_UNIX)ÚfamilyÚprotoÚloopN)rV   r–   rx   ÚhasattrrF   r±   r°   Ú_ensure_resolvedr²   ro   Ú_sock_connect)r$   r+   r9   Zresolvedrj   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)   )rC   ÚconnectrP   rO   r˜   r™   rš   r©   r“   Ú_sock_connect_cbrq   rr   rp   r¡   r¢   )r$   r   r+   r9   r   rm   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    Ú
getsockoptrF   Ú
SOL_SOCKETÚSO_ERRORrU   rP   rO   rq   rr   rp   r¡   r¢   )r$   r   r+   r9   Úerrrm   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   r•   FN)rV   r–   rx   ro   Ú_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ˆ   )rC   r’   r    ra   rH   rP   rO   r   r¾   rq   rr   rp   r¡   r¢   )r$   r   Z
registeredr+   r   rk   r9   rm   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)Úfallback)	r#   Ú_sock_fdÚ
is_readingÚpause_readingÚ_make_empty_waiterÚ_reset_empty_waiterÚresume_readingÚsock_sendfileÚ_sock)r$   ÚtranspÚfileÚoffsetÚcountrÆ   r   r   r   Ú_sendfile_native0  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)   )	ÚfileobjrL   r   r~   Ú
_cancelledrA   Ú_add_callbackr‹   rŽ   )r$   Ú
event_listr   r…   rÎ   r†   r‡   r   r   r   Ú_process_events>  s    
z%BaseSelectorEventLoop._process_eventsc                 C   s   |   | ¡ ¡ | ¡  d S r)   )rA   rC   r?   )r$   r+   r   r   r   Ú_stop_servingL  s    z#BaseSelectorEventLoop._stop_serving)N)N)N)NNN)-r   Ú
__module__Ú__qualname__Ú__doc__r   r.   r   ÚSSL_HANDSHAKE_TIMEOUTr7   r:   r?   r>   r    rM   rJ   rW   r\   rY   rh   rz   rI   rA   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   +   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 )NrF   Zsocknamer_   Fr   )r   r   r   re   Ú_extraÚgetsocknamerU   ÚgetpeernamerF   ÚerrorrÈ   rC   rÁ   Ú_protocol_connectedÚset_protocolÚ_serverÚ_buffer_factoryÚ_bufferÚ
_conn_lostÚ_closingÚ_attachr#   )r$   r³   r+   r,   r'   r(   r%   r   r   r   ]  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ÚpollingÚidlezwrite=<z
, bufsize=ú>z<{}>ú )r   r   rÈ   Úappendrä   rÁ   Ú_loopr=   r   r   r   r~   r‹   Úget_write_buffer_sizeÚformatÚjoin)r$   Úinforè   ÚstateÚbufsizer   r   r   Ú__repr__w  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   ry     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í   rA   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$   Ú_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: %sTrR   )r]   r^   rn   r,   )	rt   rU   rí   Ú	get_debugr   r   rd   rø   rõ   )r$   rm   r]   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ä   rA   rü   rý   ©r$   rm   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à   Ú_detachrÞ   Úconnection_lost)r$   rm   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í   rI   r   r   r   r   rI   Ú  s    z_SelectorTransport._add_reader)NN)r  )r   rÔ   rÕ   Úmax_sizeÚ	bytearrayrá   rÈ   r   rô   rö   rß   rú   ry   r?   ÚwarningsÚwarnr  r  rõ   rý   rî   rI   rØ   r   r   r%   r   rÙ   Q  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   Ú_set_nodelayrÈ   rí   rü   rø   Úconnection_maderI   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)   )rt   r   Ú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í   rA   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  rI   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ø   Ú
get_bufferr¨   r<   rq   rr   rp   r  rÈ   r£   rP   rO   Ú_read_ready__on_eofÚbuffer_updated)r$   r¥   rm   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È   rN   r	  rP   rO   rq   rr   rp   r  r  rø   Údata_received)r$   rL   rm   r   r   r   r  @  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ø   Úeof_receivedrq   rr   rp   r  rA   rÁ   r?   )r$   Ú	keep_openrm   r   r   r   r  Y  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)rt   Úbytesr
  r«   rw   Útyper   r  r<   r  rã   r   Ú!LOG_THRESHOLD_FOR_CONNLOST_WRITESr   Úwarningrâ   rÈ   rT   rP   rO   rq   rr   rp   r  rí   rŒ   rÁ   Ú_write_readyÚextendÚ_maybe_pause_protocol)r$   rL   rœ   rm   r   r   r   Úwriten  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È   rT   rP   rO   rq   rr   rp   rí   rŽ   rÁ   r  r  r  r¡   Ú_maybe_resume_protocolr¢   rä   rý   r  ÚshutdownrF   ÚSHUT_WR)r$   rœ   rm   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-  rF   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  r<   rí   ro   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Õ   Ú_start_tls_compatibler   Ú_SendfileModeÚ
TRY_NATIVEÚ_sendfile_compatibler   rß   rÂ   rÃ   rÆ   r  r  r  r  r*  r'  r/  r0  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 )r8   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  rI   rÁ   r  r   r  )r$   r³   r+   r,   r9   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¨   )Ú.0rL   rj   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È   Úrecvfromr	  rP   rO   rU   rø   Úerror_receivedrq   rr   rp   r  Údatagram_received©r$   rL   rl   rm   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   r_   ú'Fatal write error on datagram transport)"rt   r#  r
  r«   rw   r$  r   r6  rx   rã   r   r%  r   r&  râ   rÚ   rÈ   rT   ÚsendtorP   rO   rí   rŒ   rÁ   Ú_sendto_readyrU   rø   r;  rq   rr   rp   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 )Nr_   r>  )râ   ÚpopleftrÚ   rÈ   rT   r?  rP   rO   Ú
appendleftrU   rø   r;  rq   rr   rp   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   r8   Ï  s       ÿ
+r8   )rÖ   Ú__all__rC  rc   r™   r   rF   r  r!   ÚsslÚImportErrorÚ r   r   r   r   r   r	   r
   r   Úlogr   r   ÚBaseEventLoopr   Ú_FlowControlMixinÚ	TransportrÙ   r*   r8   r   r   r   r   Ú<module>   sD   
    *ÿ  o