o
    f                     @   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
y1   dZ	Y nw 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 )zEvent 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   s2   z|  |}W n
 ty   Y dS w t|j|@ S NF)get_keyKeyErrorboolr   )selectorfdeventkey r   ./usr/lib/python3.10/asyncio/selector_events.py_test_selector_event    s   r   c                       s  e Zd ZdZdS fdd	ZdSdddddZ	dSddddejd	d
dZ	dTddZ	 fddZ
dd Zdd Zdd Zdd Zdd ZdddejfddZdddejfddZddejfdd Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 ZdSd5d6Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dSdEdFZ%dGdH Z&dIdJ Z'dKdL Z(dMdN Z)dOdP Z*dQdR Z+  Z,S )Ur   zJSelector event loop.

    See events.EventLoop for API specification.
    Nc                    sF   t    |d u 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      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)r2   r&   )r	   SSLProtocolr+   _app_transport)r$   rawsockr-   
sslcontextr.   r0   r1   r'   r(   r2   ssl_protocolr   r   r   _make_ssl_transport@   s   z)BaseSelectorEventLoop._make_ssl_transportc                 C   r)   r*   )_SelectorDatagramTransport)r$   r,   r-   addressr.   r'   r   r   r   _make_datagram_transportM   s   z.BaseSelectorEventLoop._make_datagram_transportc                    sP   |   rtd|  rd S |   t   | jd ur&| j  d | _d S 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_fdsrA   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
socketpairrC   rE   setblockingrF   _add_readerrD   _read_from_selfrA   r   r   r   r    e   s
   z%BaseSelectorEventLoop._make_self_pipec                 C   s   d S r*   r   r$   datar   r   r   _process_self_datam      z(BaseSelectorEventLoop._process_self_datac                 C   sN   	 z| j d}|sW d S | | W n ty   Y q  ty%   Y d S w q)NTi   )rC   recvrN   InterruptedErrorBlockingIOErrorrL   r   r   r   rK   p   s   z%BaseSelectorEventLoop._read_from_selfc                 C   sR   | j }|d u r	d S z|d W d S  ty(   | jr%tjddd Y d S Y d S w )N    z3Fail to write a null byte into the self-pipe socketTexc_info)rE   sendOSError_debugr   r   )r$   csockr   r   r   _write_to_self|   s   z$BaseSelectorEventLoop._write_to_selfd   c              
   C   s"   |  | | j|||||| d S r*   )rJ   rD   _accept_connection)r$   protocol_factoryr,   r6   r(   backlogr2   r   r   r   _start_serving   s   
z$BaseSelectorEventLoop._start_servingc                 C   s  t |D ]}}z| \}}	| jrtd||	| |d W nO tttfy,   Y  d S  t	ym }
 z6|
j
t
jt
jt
jt
jfv rb| d|
t|d | |  | tj| j|||||| n W Y d }
~
qd }
~
ww d|	i}| ||||||}| | qd S )Nz#%r got a new connection from %r: %rFz&socket.accept() out of system resource)message	exceptionrG   peername)rangeacceptrX   r   r   rI   rR   rQ   ConnectionAbortedErrorrW   errnoEMFILEENFILEENOBUFSENOMEMcall_exception_handlerr   TransportSocketrB   rD   
call_laterr   ACCEPT_RETRY_DELAYr_   _accept_connection2create_task)r$   r]   r,   r6   r(   r^   r2   _connaddrexcr'   rd   r   r   r   r\      sH   
z(BaseSelectorEventLoop._accept_connectionc              
      s   d }d }z7| }|   }	|r| j||||	d|||d}n
| j|||	||d}z	|	I d H  W W d S  ty<   |   w  ttfyF     ty| }
 z+| jrqd|
d}|d ur]||d< |d ure||d< | | W Y d }
~
d S W Y d }
~
d S d }
~
ww )NT)r.   r0   r'   r(   r2   )r.   r'   r(   z3Error on transport creation for incoming connection)r`   ra   r-   	transport)	create_futurer8   r/   BaseExceptionr@   
SystemExitKeyboardInterruptrX   rk   )r$   r]   rr   r'   r6   r(   r2   r-   ru   r.   rt   contextr   r   r   ro      sJ   z)BaseSelectorEventLoop._accept_connection2c              
   C   s   |}t |ts"zt| }W n tttfy!   td|d w z| j| }W n
 ty3   Y d S w | sBt	d|d|d S )NzInvalid file object: zFile descriptor z is used by transport )

isinstanceintrD   AttributeError	TypeError
ValueErrorr#   r   
is_closingr=   )r$   r   rD   ru   r   r   r   _ensure_fd_no_transport   s&   
z-BaseSelectorEventLoop._ensure_fd_no_transportc           	   	   G   s   |    t||| d }z| j|}W n ty)   | j|tj|d f Y |S w |j|j	}\}}| j
||tjB ||f |d urH|  |S r*   )_check_closedr   Handler   r   r   registerr   
EVENT_READrM   modifycancel	r$   r   callbackargshandler   maskreaderwriterr   r   r   rJ      "   z!BaseSelectorEventLoop._add_readerc                 C   s   |   rdS z| j|}W n
 ty   Y dS w |j|j}\}}|tj M }|s1| j| n
| j	||d |f |d urE|
  dS dS )NFT)r>   r   r   r   r   rM   r   r   
unregisterr   r   r$   r   r   r   r   r   r   r   r   rB     s    z$BaseSelectorEventLoop._remove_readerc           	   	   G   s   |    t||| d }z| j|}W n ty)   | j|tjd |f Y |S w |j|j	}\}}| j
||tjB ||f |d urH|  |S r*   )r   r   r   r   r   r   r   r   EVENT_WRITErM   r   r   r   r   r   r   _add_writer!  r   z!BaseSelectorEventLoop._add_writerc                 C   s   |   rdS z| j|}W n
 ty   Y dS w |j|j}\}}|tj M }|s1| j| n
| j	|||df |durE|
  dS dS )Remove a writer callback.FNT)r>   r   r   r   r   rM   r   r   r   r   r   r   r   r   r   _remove_writer1  s    z$BaseSelectorEventLoop._remove_writerc                 G   "   |  | | j||g|R   dS )zAdd a reader callback.N)r   rJ   r$   r   r   r   r   r   r   
add_readerH     
z BaseSelectorEventLoop.add_readerc                 C      |  | | |S )zRemove a reader callback.)r   rB   r$   r   r   r   r   remove_readerM     

z#BaseSelectorEventLoop.remove_readerc                 G   r   )zAdd a writer callback..N)r   r   r   r   r   r   
add_writerR  r   z BaseSelectorEventLoop.add_writerc                 C   r   )r   )r   r   r   r   r   r   remove_writerW  r   z#BaseSelectorEventLoop.remove_writerc              	         t | | jr| dkrtdz||W S  ttfy$   Y nw |  }|	 }| 
| | || j|||}|tj| j||d |I dH S )zReceive 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-blockingr   N)r   _check_ssl_socketrX   
gettimeoutr   rP   rR   rQ   rv   rD   r   rJ   
_sock_recvadd_done_callback	functoolspartial_sock_read_done)r$   r,   nfutr   r   r   r   r   	sock_recv\  s"   


zBaseSelectorEventLoop.sock_recvc                 C   "   |d u s|  s| | d S d S r*   )	cancelledr   r$   r   r   r   r   r   r   r   r     z%BaseSelectorEventLoop._sock_read_donec              
   C      |  rd S z||}W n, ttfy   Y d S  ttfy"     ty9 } z|| W Y d }~d S d }~ww || d S r*   )	donerP   rR   rQ   rx   ry   rw   set_exception
set_result)r$   r   r,   r   rM   rt   r   r   r   r   v  s   z BaseSelectorEventLoop._sock_recvc              	      r   )zReceive 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   r   N)r   r   rX   r   r   	recv_intorR   rQ   rv   rD   r   rJ   _sock_recv_intor   r   r   r   )r$   r,   bufr   r   r   r   r   r   sock_recv_into  s"   


z$BaseSelectorEventLoop.sock_recv_intoc              
   C   r   r*   )	r   r   rR   rQ   rx   ry   rw   r   r   )r$   r   r,   r   nbytesrt   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y'   d}Y nw |t|kr0dS | 	 }|
 }| | | || j||t||g}|tj| j||d |I dH S )a  Send data to the socket.

        The socket must be connected to a remote socket. This method continues
        to send data from data until either all data has been sent or an
        error occurs. None is returned on success. On error, an exception is
        raised, and there is no way to determine how much data, if any, was
        successfully processed by the receiving end of the connection.
        r   r   Nr   )r   r   rX   r   r   rV   rR   rQ   lenrv   rD   r   r   _sock_sendall
memoryviewr   r   r   _sock_write_done)r$   r,   rM   r   r   r   r   r   r   r   sock_sendall  s*   
	


z"BaseSelectorEventLoop.sock_sendallc              
   C   s   |  rd S |d }z|||d  }W n, ttfy!   Y d S  ttfy*     tyA } z|| W Y d }~d S d }~ww ||7 }|t|krS|	d  d S ||d< d S )Nr   )
r   rV   rR   rQ   rx   ry   rw   r   r   r   )r$   r   r,   viewposstartr   rt   r   r   r   r     s$   
z#BaseSelectorEventLoop._sock_sendallc                    s   t | | jr| dkrtd|jtjks"t jr;|jtj	kr;| j
||j|j|j| dI dH }|d \}}}}}|  }| ||| z|I dH W d}S d}w )zTConnect to a remote socket at address.

        This method is a coroutine.
        r   r   )familytypeprotoloopN)r   r   rX   r   r   r   rG   AF_INET	_HAS_IPv6AF_INET6_ensure_resolvedr   r   rv   _sock_connect)r$   r,   r:   resolvedrq   r   r   r   r   sock_connect  s$   

z"BaseSelectorEventLoop.sock_connectc              
   C   s   |  }zaz|| W nE ttfy2   | | | || j|||}|tj	| j
||d Y n* ttfy;     tyQ } z|| W Y d }~nd }~ww |d  W d }d S W d }d S W d }d S d }w )Nr   )rD   connectrR   rQ   r   r   _sock_connect_cbr   r   r   r   rx   ry   rw   r   r   )r$   r   r,   r:   r   r   rt   r   r   r   r     s.   
	z#BaseSelectorEventLoop._sock_connectc                 C   r   r*   )r   r   r   r   r   r   r     r   z&BaseSelectorEventLoop._sock_write_donec              
   C   s   |  rd S zUz|tjtj}|dkrt|d| W n* ttfy(   Y n* tt	fy1     t
yG } z|| W Y d }~nd }~ww |d  W d }d S W d }d S W d }d S d }w )Nr   zConnect call failed )r   
getsockoptrG   
SOL_SOCKETSO_ERRORrW   rR   rQ   rx   ry   rw   r   r   )r$   r   r,   r:   errrt   r   r   r   r     s*   z&BaseSelectorEventLoop._sock_connect_cbc                    sD   t | | jr| dkrt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   N)r   r   rX   r   r   rv   _sock_accept)r$   r,   r   r   r   r   sock_accept*  s   

z!BaseSelectorEventLoop.sock_acceptc              
   C   s   |  }z| \}}|d W nF ttfy7   | | | || j||}|t	j
| j||d Y d S  ttfy@     tyW } z|| W Y d }~d S d }~ww |||f d S )NFr   )rD   rd   rI   rR   rQ   r   rJ   r   r   r   r   r   rx   ry   rw   r   r   )r$   r   r,   r   rr   r:   r   rt   r   r   r   r   9  s"   

z"BaseSelectorEventLoop._sock_acceptc              	      s   | j |j= | }|  | I d H  z| j|j|||ddI d H W |  |r.|  || j |j< S |  |r?|  || j |j< w )NF)fallback)	r#   _sock_fd
is_readingpause_reading_make_empty_waitersock_sendfile_sock_reset_empty_waiterresume_reading)r$   transpfileoffsetcountr   r   r   r   _sendfile_nativeJ  s"   
z&BaseSelectorEventLoop._sendfile_nativec                 C   s   |D ];\}}|j |j}\}}|tj@ r&|d ur&|jr!| | n| | |tj@ r=|d ur=|jr8| | q| | qd S r*   )	fileobjrM   r   r   
_cancelledrB   _add_callbackr   r   )r$   
event_listr   r   r   r   r   r   r   r   _process_eventsX  s   

z%BaseSelectorEventLoop._process_eventsc                 C   s   |  |  |  d S r*   )rB   rD   r@   )r$   r,   r   r   r   _stop_servingf  s   z#BaseSelectorEventLoop._stop_servingr*   NNN)-r   
__module____qualname____doc__r   r/   r   SSL_HANDSHAKE_TIMEOUTr8   r;   r@   r?   r    rN   rK   rZ   r_   r\   ro   r   rJ   rB   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   +   sl    


	
.
)

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y&   d | jd< Y nw d| jvrEz	| | jd< W n tj	yD   d | jd< Y nw || _
| | _d| _| | || _|  | _d| _d| _| jd urm| j  | |j| j< d S )NrG   socknamerb   Fr   )r   r   r   rl   _extragetsocknamerW   getpeernamerG   errorr   rD   r   _protocol_connectedset_protocol_server_buffer_factory_buffer
_conn_lost_closing_attachr#   )r$   r   r,   r-   r'   r(   r%   r   r   r   w  s0   





z_SelectorTransport.__init__c                 C   s   | j jg}| jd u r|d n| jr|d |d| j  | jd urc| j sct| jj	| jt
j}|r=|d n|d t| jj	| jt
j}|rQd}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__  s.   



z_SelectorTransport.__repr__c                 C   s   |  d  d S r*   )_force_closerA   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      | j S r*   )r  rA   r   r   r   get_protocol     z_SelectorTransport.get_protocolc                 C   r  r*   )r   rA   r   r   r   r     r  z_SelectorTransport.is_closingc                 C   sX   | j rd S d| _ | j| j | js*|  jd7  _| j| j | j| jd  d S d S NTr   )	r   r  rB   r   r   r   r   	call_soon_call_connection_lostrA   r   r   r   r@     s   z_SelectorTransport.closec                 C   s0   | j d ur|d| t| d | j   d S 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: %sTrT   )r`   ra   ru   r-   )	r{   rW   r  	get_debugr   r   rk   r  r  )r$   rt   r`   r   r   r   _fatal_error  s   

z_SelectorTransport._fatal_errorc                 C   sd   | j rd S | jr| j  | j| j | js!d| _| j| j |  j d7  _ | j| j	| d S r  )
r   r   clearr  r   r   r   rB   r  r  r$   rt   r   r   r   r    s   
z_SelectorTransport._force_closec                 C   s   z*| j r
| j| W | j  d | _d | _d | _| j}|d ur)|  d | _d S d S | j  d | _d | _d | _| j}|d urG|  d | _w r*   )r   r  connection_lostr   r@   r  r   _detach)r$   rt   r(   r   r   r   r    s*   


z(_SelectorTransport._call_connection_lostc                 C   s
   t | jS r*   )r   r   rA   r   r   r   r       
z(_SelectorTransport.get_write_buffer_sizec                 G   s$   | j rd S | jj||g|R   d S r*   )r   r  rJ   r   r   r   r   rJ     s   z_SelectorTransport._add_reader)NN)r  )r   r   r   max_size	bytearrayr   r   r   r  r  r   r  r   r@   warningswarnr  r  r  r  r  rJ   r   r   r   r%   r   r   k  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 ur?| j	
tj|d  d S d S r   )_read_ready_cbr   r   _eof_paused_empty_waiterr   _set_nodelayr   r  r  r  connection_maderJ   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   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   rA   r   r   r   r     s   z#_SelectorSocketTransport.is_readingc                 C   sB   | j s| jrd S d| _| j| j | j rtd|  d S d S )NTz%r pauses reading)r   r)  r  rB   r   r  r   r   rA   r   r   r   r   "  s   
z&_SelectorSocketTransport.pause_readingc                 C   sD   | j s| jsd S d| _| | j| j | j r td|  d S d S )NFz%r resumes reading)	r   r)  rJ   r   r-  r  r  r   r   rA   r   r   r   r   *  s   
z'_SelectorSocketTransport.resume_readingc                 C   s   |    d S r*   )r'  rA   r   r   r   r-  2  s   z$_SelectorSocketTransport._read_readyc              
   C   sD  | j rd S z| jd}t|stdW n" ttfy     ty7 } z| |d W Y d }~d S d }~ww z| j	
|}W n- ttfyL   Y d S  ttfyU     tym } z| |d W Y d }~d S d }~ww |sv|   d S z	| j| W d S  ttfy     ty } z| |d W Y d }~d S d }~ww )Nz%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=   rx   ry   rw   r  r   r   rR   rQ   _read_ready__on_eofbuffer_updated)r$   r   rt   r   r   r   r   r0  5  sP   z0_SelectorSocketTransport._read_ready__get_bufferc              
   C   s   | j rd S z	| j| j}W n- ttfy   Y d S  ttfy#     ty; } z| 	|d W Y d }~d S d }~ww |sD| 
  d S z	| j| W d S  ttfyW     tyo } z| 	|d W Y d }~d S d }~ww )Nr3  z2Fatal error: protocol.data_received() call failed.)r   r   rP   r#  rR   rQ   rx   ry   rw   r  r5  r  data_received)r$   rM   rt   r   r   r   r1  Z  s4   z3_SelectorSocketTransport._read_ready__data_receivedc              
   C   s   | j  rtd|  z| j }W n" ttfy     ty4 } z| 	|d W Y d }~d S d }~ww |r@| j 
| j d S |   d S )Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.)r  r  r   r   r  eof_receivedrx   ry   rw   r  rB   r   r@   )r$   	keep_openrt   r   r   r   r5  s  s    
z,_SelectorSocketTransport._read_ready__on_eofc              
   C   s(  t |tttfstdt|j| jrtd| j	d ur"td|s&d S | j
r=| j
tjkr4td |  j
d7  _
d S | jsz| j|}W n, ttfyS   Y n, ttfy\     tyt } z| |d W Y d }~d S d }~ww ||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~   r   r   r(  r=   r*  r   r   !LOG_THRESHOLD_FOR_CONNLOST_WRITESr   warningr   r   rV   rR   rQ   rx   ry   rw   r  r  r   r   _write_readyextend_maybe_pause_protocol)r$   rM   r   rt   r   r   r   write  sB   

z_SelectorSocketTransport.writec              
   C   s8  | j sJ d| jrd S z	| j| j }W nK ttfy!   Y d S  ttfy*     ty` } z+| j	
| j | j   | |d | jd urU| j| W Y d }~d S W Y d }~d S d }~ww |ri| j d |= |   | j s| j	
| j | jd ur| jd  | jr| d  d S | jr| jtj d S d S d S )NzData should not be emptyr<  )r   r   r   rV   rR   rQ   rx   ry   rw   r  r   r   r  r  r*  r   _maybe_resume_protocolr   r   r  r(  shutdownrG   SHUT_WR)r$   r   rt   r   r   r   r@    s>   


z%_SelectorSocketTransport._write_readyc                 C   s2   | j s| jrd S d| _| js| jtj d S d S r  )r   r(  r   r   rE  rG   rF  rA   r   r   r   	write_eof  s   z"_SelectorSocketTransport.write_eofc                 C   s   dS r  r   rA   r   r   r   can_write_eof  rO   z&_SelectorSocketTransport.can_write_eofc                    s.   t  | | jd ur| jtd d S 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 ur	td| j | _ | js| j d  | j S )NzEmpty waiter is already set)r*  r=   r  rv   r   r   rA   r   r   r   r     s   
z+_SelectorSocketTransport._make_empty_waiterc                 C   s
   d | _ d S r*   )r*  rA   r   r   r   r     r"  z,_SelectorSocketTransport._reset_empty_waiterr   )r   r   r   _start_tls_compatibler   _SendfileMode
TRY_NATIVE_sendfile_compatibler   r   r   r   r   r-  r0  r1  r5  rC  r@  rG  rH  r  r   r   r   r   r   r%   r   r+     s*    %'r+   c                       sJ   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 )r9   Nc                    sb   t  |||| || _| j| jj|  | j| j| j| j	 |d ur/| jt
j|d  d S d S r*   )r   r   _addressr  r  r  r,  rJ   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 r*   )r   ).0rM   rq   r   r   r   	<genexpr>  s    zC_SelectorDatagramTransport.get_write_buffer_size.<locals>.<genexpr>)sumr   rA   r   r   r   r    s   z0_SelectorDatagramTransport.get_write_buffer_sizec              
   C   s   | j rd S z| j| j\}}W nE ttfy   Y d S  ty4 } z| j| W Y d }~d S d }~w t	t
fy=     tyU } z| |d W Y d }~d S d }~ww | j|| d S )Nz&Fatal read error on datagram transport)r   r   recvfromr#  rR   rQ   rW   r  error_receivedrx   ry   rw   r  datagram_receivedr$   rM   rs   rt   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r+|d | jfvr(td| j | j}| j	rE| jrE| j	t
jkr<td |  j	d7  _	d S | jsz| jd rW| j| W d S | j|| W d S  ttfyt   | j| j| j Y n: ty } z| j| W Y d }~d S d }~w ttfy     ty } z| |d W Y d }~d S d }~ww | j t||f | !  d S )Nr:  z!Invalid address: must be None or r;  r   rb   'Fatal write error on datagram transport)"r{   r=  r$  r   r~   r   r   rN  r   r   r   r>  r   r?  r   r   r   rV   sendtorR   rQ   r  r   r   _sendto_readyrW   r  rS  rx   ry   rw   r  r  rB  rU  r   r   r   rW    sR   


z!_SelectorDatagramTransport.sendtoc              
   C   s  | j ro| j  \}}z| jd r| j| n| j|| W nL ttfy2   | j ||f Y n= t	yJ } z| j
| W Y d }~d S d }~w ttfyS     tyk } z| |d W Y d }~d S d }~ww | j s|   | j s| j| j | jr| d  d S d S d S )Nrb   rV  )r   popleftr   r   rV   rW  rR   rQ   
appendleftrW   r  rS  rx   ry   rw   r  rD  r  r   r   r   r  rU  r   r   r   rX  8  s>   
z(_SelectorDatagramTransport._sendto_readyr   r*   )r   r   r   collectionsdequer   r   r  r-  rW  rX  r   r   r   r%   r   r9     s    
+r9   )r   __all__r[  rf   r   r   rG   r%  r!   sslImportError r   r   r   r   r   r	   r
   r   logr   r   BaseEventLoopr   _FlowControlMixin	Transportr   r+   r9   r   r   r   r   <module>   sH        D  o