
    h;                     n   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	 ddl	Z	n# e
$ r dZ	Y nw xY 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 Z G d dej                  Z G d dej        ej                  Z G d de          Z G 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                 ~    	 |                      |          }t          |j        |z            S # t          $ r Y dS w xY wNF)get_keyboolr   KeyError)selectorfdeventkeys       ./usr/lib/python3.11/asyncio/selector_events.py_test_selector_eventr       sU    (r"" CJ&'''    uus   . 
<<c                       e Zd ZdZd4 fd	Zd4ddddZ	 d4ddddej        ej        ddZ		 d5d	Z
 fd
Zd Zd Zd Zd Zd Zdddej        ej        fdZdddej        ej        fdZddej        ej        fdZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd4dZd Zd  Z d! Z!d" Z"d# Z#d6d%Z$d& Z%d' Z&d( Z'd) Z(d* Z)d+ Z*d, Z+d4d-Z,d. Z-d/ Z.d0 Z/d1 Z0d2 Z1d3 Z2 xZ3S )7r   zJSelector event loop.

    See events.EventLoop for API specification.
    Nc                    t                                                       |t          j                    }t	          j        d|j        j                   || _        | 	                                 t          j                    | _        d S )NzUsing selector: %s)super__init__	selectorsDefaultSelectorr   debug	__class____name__	_selector_make_self_pipeweakrefWeakValueDictionary_transports)selfr   r    s     r   r   zBaseSelectorEventLoop.__init__1   sv     022H)8+=+FGGG!"688    extraserverc                *    t          | |||||          S N)_SelectorSocketTransport)r'   sockprotocolwaiterr*   r+   s         r   _make_socket_transportz,BaseSelectorEventLoop._make_socket_transport;   s!    'dHf(-v7 7 	7r(   F)server_sideserver_hostnamer*   r+   ssl_handshake_timeoutssl_shutdown_timeoutc          
      p    t          j        | ||||||	|
          }t          | ||||           |j        S )N)r5   r6   r)   )r
   SSLProtocolr.   _app_transport)r'   rawsockr0   
sslcontextr1   r3   r4   r*   r+   r5   r6   ssl_protocols               r   _make_ssl_transportz)BaseSelectorEventLoop._make_ssl_transport@   s\      +(J"7!5	
 
 
 	!w',V	= 	= 	= 	=**r(   c                 *    t          | |||||          S r-   )_SelectorDatagramTransport)r'   r/   r0   addressr1   r*   s         r   _make_datagram_transportz.BaseSelectorEventLoop._make_datagram_transportQ   s$    )$h*165B B 	Br(   c                 4   |                                  rt          d          |                                 rd S |                                  t	                                                       | j        "| j                                         d | _        d S d S )Nz!Cannot close a running event loop)
is_runningRuntimeError	is_closed_close_self_piper   closer"   )r'   r    s    r   rG   zBaseSelectorEventLoop.closeV   s    ?? 	DBCCC>> 	F>%N  """!DNNN &%r(   c                     |                      | j                                                   | j                                         d | _        | j                                         d | _        | xj        dz  c_        d S )Nr   )_remove_reader_ssockfilenorG   _csock_internal_fdsr'   s    r   rF   z&BaseSelectorEventLoop._close_self_pipea   st    DK..00111ar(   c                 2   t          j                    \  | _        | _        | j                            d           | j                            d           | xj        dz  c_        |                     | j                                        | j                   d S )NFr   )	socket
socketpairrJ   rL   setblockingrM   _add_readerrK   _read_from_selfrN   s    r   r#   z%BaseSelectorEventLoop._make_self_pipei   s    #)#4#6#6 T[&&&&&&a++--t/CDDDDDr(   c                     d S r-    r'   datas     r   _process_self_dataz(BaseSelectorEventLoop._process_self_dataq   s    r(   c                     	 	 | j                             d          }|sd S |                     |           n# t          $ r Y Bt          $ r Y d S w xY wR)NTi   )rJ   recvrY   InterruptedErrorBlockingIOErrorrW   s     r   rT   z%BaseSelectorEventLoop._read_from_selft   s    		{''-- E''----#   "   		s   7 7 
A	AAc                     | j         }|d S 	 |                    d           d S # t          $ r$ | j        rt	          j        dd           Y d S Y d S w xY w)N    z3Fail to write a null byte into the self-pipe socketTexc_info)rL   sendOSError_debugr   r   )r'   csocks     r   _write_to_selfz$BaseSelectorEventLoop._write_to_self   s     =F	,JJu 	, 	, 	,{ , 0&*, , , , , , ,, , ,	,s   $ 'AAd   c                 n    |                      |                                | j        |||||||	  	         d S r-   )rS   rK   _accept_connection)r'   protocol_factoryr/   r;   r+   backlogr5   r6   s           r   _start_servingz$BaseSelectorEventLoop._start_serving   sK     	(?)4VW.0D	F 	F 	F 	F 	Fr(   c                    t          |          D ]h}	 |                                \  }	}
| j        rt          j        d||
|	           |	                    d           d|
i}|                     ||	|||||          }|                     |           # t          t          t          f$ r Y  d S t          $ r}|j        t          j        t          j        t          j        t          j        fv r|                     d|t%          j        |          d           |                     |                                           |                     t.          j        | j        |||||||	  	         n Y d }~bd }~ww xY wd S )Nz#%r got a new connection from %r: %rFpeernamez&socket.accept() out of system resource)message	exceptionrP   )rangeacceptrd   r   r   rR   _accept_connection2create_taskr]   r\   ConnectionAbortedErrorrc   errnoEMFILEENFILEENOBUFSENOMEMcall_exception_handlerr   TransportSocketrI   rK   
call_laterr   ACCEPT_RETRY_DELAYrl   )r'   rj   r/   r;   r+   rk   r5   r6   _connaddrr*   rr   excs                 r   ri   z(BaseSelectorEventLoop._accept_connection   s    w #	) #	)A")![[]]
d; 5L!F!'t5 5 5  '''2 $T*11$dE:v)+?A A   ((((9 $%57MN   ttt   9u|!&!> > >
 //#K%("("8">">1 1   
 ''666OOI$@$($7$4dJ$+-B$8	: : : : : : : : :#	) #	)s   A
BE7.	E77B5E22E7c                   K   d }d }		  |            }|                                  }
|r|                     ||||
d||||	  	        }	n|                     |||
||          }		 |
 d {V  d S # t          $ r |	                                  w xY w# t
          t          f$ r  t          $ r@}| j        r.d|d}|||d<   |	|	|d<   |                     |           Y d }~d S Y d }~d S d }~ww xY w)NT)r1   r3   r*   r+   r5   r6   )r1   r*   r+   z3Error on transport creation for incoming connection)ro   rp   r0   	transport)	create_futurer=   r2   BaseExceptionrG   
SystemExitKeyboardInterruptrd   r{   )r'   rj   r   r*   r;   r+   r5   r6   r0   r   r1   r   contexts                r   rs   z)BaseSelectorEventLoop._accept_connection2   s     
 	"	5''))H''))F 	# 44(Jv $E&*?)=	 5 ? ?		 !77(6! 8 # #	    !!!
 -. 	 	 	 	5 	5 	5{ 
5 N!$ 
 '*2GJ'(+4GK(++G444444444
5 
5 
5 
5 
5 
5	5s*   AB "A, , BB C**/C%%C*c                 f   |}t          |t                    sQ	 t          |                                          }n.# t          t          t
          f$ r t          d|          d w xY w	 | j        |         }|                                st          d|d|          d S # t          $ r Y d S w xY w)NzInvalid file object: zFile descriptor z is used by transport )

isinstanceintrK   AttributeError	TypeError
ValueErrorr&   
is_closingrD   r   )r'   r   rK   r   s       r   _ensure_fd_no_transportz-BaseSelectorEventLoop._ensure_fd_no_transport   s    &#&& 	KKV]]__--"Iz: K K K !?!?!?@@dJK	&(0I '')) &"%r % % % %& & && &  	 	 	DD	s   !; +A&*B" "
B0/B0c                    |                                   t          j        ||| d           }	 | j                            |          }|j        |j        c}\  }}| j                            ||t          j        z  ||f           ||	                                 n8# t          $ r+ | j                            |t          j        |d f           Y nw xY w|S r-   )_check_closedr   Handler"   r   rX   modifyr   
EVENT_READcancelr   register	r'   r   callbackargshandler   maskreaderwriters	            r   rS   z!BaseSelectorEventLoop._add_reader  s    xtT::
	 .((,,C
 &)Z"D"66N!!"dY-A&A#)6"24 4 4!  	4 	4 	4N##B	(<%+TN4 4 4 4 4	4    B 2CCc                 t   |                                  rdS 	 | j                            |          }|j        |j        c}\  }}|t
          j         z  }|s| j                            |           n| j                            ||d |f           ||	                                 dS dS # t          $ r Y dS w xY w)NFT)rE   r"   r   r   rX   r   r   
unregisterr   r   r   r'   r   r   r   r   r   s         r   rI   z$BaseSelectorEventLoop._remove_reader  s    >> 	5	.((,,C &)Z"D"66Y)))D @))"----%%b$v???!tu  	 	 	55	   B) )
B76B7c                    |                                   t          j        ||| d           }	 | j                            |          }|j        |j        c}\  }}| j                            ||t          j        z  ||f           ||	                                 n8# t          $ r+ | j                            |t          j        d |f           Y nw xY w|S r-   )r   r   r   r"   r   rX   r   r   EVENT_WRITEr   r   r   r   s	            r   _add_writerz!BaseSelectorEventLoop._add_writer*  s    xtT::
	 .((,,C
 &)Z"D"66N!!"dY-B&B#)6"24 4 4!  	4 	4 	4N##B	(=%)6N4 4 4 4 4	4 r   c                 t   |                                  rdS 	 | j                            |          }|j        |j        c}\  }}|t
          j         z  }|s| j                            |           n| j                            |||df           ||	                                 dS dS # t          $ r Y dS w xY w)Remove a writer callback.FNT)rE   r"   r   r   rX   r   r   r   r   r   r   r   s         r   _remove_writerz$BaseSelectorEventLoop._remove_writer:  s    >> 	5	.((,,C &)Z"D"66Y***D @))"----%%b$???!tu  	 	 	55	r   c                 N    |                      |            | j        ||g|R   dS )zAdd a reader callback.N)r   rS   r'   r   r   r   s       r   
add_readerz BaseSelectorEventLoop.add_readerQ  9    $$R(((X-------r(   c                 V    |                      |           |                     |          S )zRemove a reader callback.)r   rI   r'   r   s     r   remove_readerz#BaseSelectorEventLoop.remove_readerV  *    $$R(((""2&&&r(   c                 N    |                      |            | j        ||g|R   dS )zAdd a writer callback..N)r   r   r   s       r   
add_writerz BaseSelectorEventLoop.add_writer[  r   r(   c                 V    |                      |           |                     |          S )r   )r   r   r   s     r   remove_writerz#BaseSelectorEventLoop.remove_writer`  r   r(   c                   K   t          j        |           | j        r'|                                dk    rt	          d          	 |                    |          S # t          t          f$ r Y nw xY w|                                 }|	                                }| 
                    |           |                     || j        |||          }|                    t          j        | j        ||                     | d{V 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_socketrd   
gettimeoutr   r[   r]   r\   r   rK   r   rS   
_sock_recvadd_done_callback	functoolspartial_sock_read_done)r'   r/   nfutr   r   s         r   	sock_recvzBaseSelectorEventLoop.sock_recve  s      	%d+++; 	@4??,,11>???	99Q<<!12 	 	 	D	  ""[[]]$$R(((!!"dosD!DDd2BvFFF	H 	H 	Hyyyyyy   A A/.A/c                 `    ||                                 s|                     |           d S d S r-   )	cancelledr   r'   r   r   r   s       r   r   z%BaseSelectorEventLoop._sock_read_done{  8    >!1!1!3!3>r""""" >r(   c                 *   |                                 rd S 	 |                    |          }|                    |           d S # t          t          f$ r Y d S t
          t          f$ r  t          $ r }|                    |           Y d }~d S d }~ww xY wr-   )	doner[   
set_resultr]   r\   r   r   r   set_exception)r'   r   r/   r   rX   r   s         r   r   z BaseSelectorEventLoop._sock_recv  s     88:: 	F		!99Q<<D NN4       !12 	 	 	FF-. 	 	 	 	# 	# 	#c"""""""""	#   A BB2BBc                   K   t          j        |           | j        r'|                                dk    rt	          d          	 |                    |          S # t          t          f$ r Y nw xY w|                                 }|	                                }| 
                    |           |                     || j        |||          }|                    t          j        | j        ||                     | d{V S )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   rd   r   r   	recv_intor]   r\   r   rK   r   rS   _sock_recv_intor   r   r   r   )r'   r/   bufr   r   r   s         r   sock_recv_intoz$BaseSelectorEventLoop.sock_recv_into  s      	%d+++; 	@4??,,11>???	>>#&&&!12 	 	 	D	  ""[[]]$$R(((!!"d&:CsKKd2BvFFF	H 	H 	Hyyyyyyr   c                 *   |                                 rd S 	 |                    |          }|                    |           d S # t          t          f$ r Y d S t
          t          f$ r  t          $ r }|                    |           Y d }~d S d }~ww xY wr-   )	r   r   r   r]   r\   r   r   r   r   )r'   r   r/   r   nbytesr   s         r   r   z%BaseSelectorEventLoop._sock_recv_into  s     88:: 	F		#^^C((F NN6"""""  !12 	 	 	FF-. 	 	 	 	# 	# 	#c"""""""""	#r   c                   K   t          j        |           | j        r'|                                dk    rt	          d          	 |                    |          S # t          t          f$ r Y nw xY w|                                 }|	                                }| 
                    |           |                     || j        |||          }|                    t          j        | j        ||                     | d{V S )a  Receive a datagram from a datagram socket.

        The return value is a tuple of (bytes, address) representing the
        datagram received and the address it came from.
        The maximum amount of data to be received at once is specified by
        nbytes.
        r   r   r   N)r   r   rd   r   r   recvfromr]   r\   r   rK   r   rS   _sock_recvfromr   r   r   r   )r'   r/   bufsizer   r   r   s         r   sock_recvfromz#BaseSelectorEventLoop.sock_recvfrom  s      	%d+++; 	@4??,,11>???	==)))!12 	 	 	D	  ""[[]]$$R(((!!"d&93gNNd2BvFFF	H 	H 	Hyyyyyyr   c                 *   |                                 rd S 	 |                    |          }|                    |           d S # t          t          f$ r Y d S t
          t          f$ r  t          $ r }|                    |           Y d }~d S d }~ww xY wr-   )	r   r   r   r]   r\   r   r   r   r   )r'   r   r/   r   resultr   s         r   r   z$BaseSelectorEventLoop._sock_recvfrom  s     88:: 	F		#]]7++F NN6"""""  !12 	 	 	FF-. 	 	 	 	# 	# 	#c"""""""""	#r   r   c                 .  K   t          j        |           | j        r'|                                dk    rt	          d          |st          |          }	 |                    ||          S # t          t          f$ r Y nw xY w| 	                                }|
                                }|                     |           |                     || j        ||||          }|                    t          j        | j        ||                     | d{V S )zReceive data from the socket.

        The received data is written into *buf* (a writable buffer).
        The return value is a tuple of (number of bytes written, address).
        r   r   r   N)r   r   rd   r   r   lenrecvfrom_intor]   r\   r   rK   r   rS   _sock_recvfrom_intor   r   r   r   )r'   r/   r   r   r   r   r   s          r   sock_recvfrom_intoz(BaseSelectorEventLoop.sock_recvfrom_into  s7      	%d+++; 	@4??,,11>??? 	XXF	%%c6222!12 	 	 	D	  ""[[]]$$R(((!!"d&>T3"(* *d2BvFFF	H 	H 	Hyyyyyys   A- -B Bc                 ,   |                                 rd S 	 |                    ||          }|                    |           d S # t          t          f$ r Y d S t
          t          f$ r  t          $ r }|                    |           Y d }~d S d }~ww xY wr-   )	r   r   r   r]   r\   r   r   r   r   )r'   r   r/   r   r   r   r   s          r   r   z)BaseSelectorEventLoop._sock_recvfrom_into  s     88:: 	F		#''W55F NN6"""""  !12 	 	 	FF-. 	 	 	 	# 	# 	#c"""""""""	#s   A BB3BBc           	      V  K   t          j        |           | j        r'|                                dk    rt	          d          	 |                    |          }n# t          t          f$ r d}Y nw xY w|t          |          k    rdS | 	                                }|
                                }|                     |           |                     || j        ||t          |          |g          }|                    t!          j        | j        ||                     | d{V S )  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   rd   r   r   rb   r]   r\   r   r   rK   r   r   _sock_sendall
memoryviewr   r   r   _sock_write_done)r'   r/   rX   r   r   r   r   s          r   sock_sendallz"BaseSelectorEventLoop.sock_sendall  sC      	%d+++; 	@4??,,11>???			$AA!12 	 	 	AAA	 D		>>F  ""[[]]$$R(((!!"d&8#t",T"2"2QC9 9d3RGGG	I 	I 	Iyyyyyys   A A21A2c                    |                                 rd S |d         }	 |                    ||d                    }nQ# t          t          f$ r Y d S t          t
          f$ r  t          $ r }|                    |           Y d }~d S d }~ww xY w||z  }|t          |          k    r|	                    d            d S ||d<   d S Nr   )
r   rb   r]   r\   r   r   r   r   r   r   )r'   r   r/   viewposstartr   r   s           r   r   z#BaseSelectorEventLoop._sock_sendall&  s    88:: 	FA			$uvv,''AA!12 	 	 	FF-. 	 	 	 	 	 	c"""FFFFF	 	
CIINN4     CFFFs   > BB,BBc                   K   t          j        |           | j        r'|                                dk    rt	          d          	 |                    ||          S # t          t          f$ r Y nw xY w|                                 }|	                                }| 
                    |           |                     || j        ||||          }|                    t          j        | j        ||                     | d{V S )r   r   r   r   N)r   r   rd   r   r   sendtor]   r\   r   rK   r   r   _sock_sendtor   r   r   r   )r'   r/   rX   r@   r   r   r   s          r   sock_sendtoz!BaseSelectorEventLoop.sock_sendto<  s$      	%d+++; 	@4??,,11>???	;;tW---!12 	 	 	D	   ""[[]]$$R(((!!"d&7dD")+ +d3RGGG	I 	I 	Iyyyyyys   A A0/A0c                 .   |                                 rd S 	 |                    |d|          }|                    |           d S # t          t          f$ r Y d S t
          t          f$ r  t          $ r }|                    |           Y d }~d S d }~ww xY wr   )	r   r   r   r]   r\   r   r   r   r   )r'   r   r/   rX   r@   r   r   s          r   r   z"BaseSelectorEventLoop._sock_sendtoW  s    88:: 	F		D!W--A NN1  !12 	 	 	FF-. 	 	 	 	# 	# 	#c"""""""""	#s   A BB4BBc                   K   t          j        |           | j        r'|                                dk    rt	          d          |j        t          j        k    s!t           j        rR|j        t          j	        k    r=| 
                    ||j        |j        |j        |            d{V }|d         \  }}}}}|                                 }|                     |||           	 | d{V 	 d}S # d}w xY w)zTConnect to a remote socket at address.

        This method is a coroutine.
        r   r   )familytypeprotoloopN)r   r   rd   r   r   r   rP   AF_INET	_HAS_IPv6AF_INET6_ensure_resolvedr   r   r   _sock_connect)r'   r/   r@   resolvedr   r   s         r   sock_connectz"BaseSelectorEventLoop.sock_connectf  s&     
 	%d+++; 	@4??,,11>???;&.((% )*.+*H*H!22$)4: 3        H #+1+Aq!Q  ""3g...	999999 CC$CJJJJs   $C/ /C3c                    |                                 }	 |                    |           |                    d            n# t          t          f$ re |                     |           |                     || j        |||          }|                    t          j
        | j        ||                     Y n<t          t          f$ r  t          $ r}|                    |           Y d }~nd }~ww xY wd }d S # d }w xY w)Nr   )rK   connectr   r]   r\   r   r   _sock_connect_cbr   r   r   r   r   r   r   r   )r'   r   r/   r@   r   r   r   s          r   r   z#BaseSelectorEventLoop._sock_connect  sG   [[]]	LL!!!  NN4      !12 		M 		M 		M
 ((,,,%%D)3g? ?F!!!$"7FKKKM M M M M-. 	 	 	 	# 	# 	#c""""""""	#
 CCC$CJJJJs;   A C6 A3C/4C6 6C/C*%C6 *C//C6 6C:c                 `    ||                                 s|                     |           d S d S r-   )r   r   r   s       r   r   z&BaseSelectorEventLoop._sock_write_done  r   r(   c                    |                                 rd S 	 |                    t          j        t          j                  }|dk    rt          |d|           	 |                    d            nO# t          t          f$ r Y n<t          t          f$ r  t          $ r}|                    |           Y d }~nd }~ww xY wd }d S # d }w xY w)Nr   zConnect call failed )r   
getsockoptrP   
SOL_SOCKETSO_ERRORrc   r   r]   r\   r   r   r   r   )r'   r   r/   r@   errr   s         r   r   z&BaseSelectorEventLoop._sock_connect_cb  s   88:: 	F	//&"3V_EECaxxc#C'#C#CDDD  NN4      !12 	 	 	D-. 	 	 	 	# 	# 	#c""""""""	#
 CCC$CJJJJs<   AA2 C 2B>C B>B94C 9B>>C C	c                    K   t          j        |           | j        r'|                                dk    rt	          d          |                                 }|                     ||           | d{V 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   rd   r   r   r   _sock_accept)r'   r/   r   s      r   sock_acceptz!BaseSelectorEventLoop.sock_accept  s       	%d+++; 	@4??,,11>???  ""#t$$$yyyyyyr(   c                    |                                 }	 |                                \  }}|                    d           |                    ||f           d S # t          t
          f$ re |                     |           |                     || j        ||          }|	                    t          j        | j        ||                     Y d S t          t          f$ r  t          $ r }|                    |           Y d }~d S d }~ww xY w)NFr   )rK   rr   rR   r   r]   r\   r   rS   r  r   r   r   r   r   r   r   r   )r'   r   r/   r   r   r@   r   r   s           r   r  z"BaseSelectorEventLoop._sock_accept  sI   [[]]	, KKMMMD'U### NND'?+++++  !12 	L 	L 	L((,,,%%b$*;S$GGF!!!$"66JJJL L L L L L-. 	 	 	 	# 	# 	#c"""""""""	#s   ,A A2D
D
*DD
c                   K   | j         |j        = |                                }|                                 |                                 d {V  	 |                     |j        |||d           d {V 	 |                                 |r|                                 || j         |j        <   S # |                                 |r|                                 || j         |j        <   w xY 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  s         r   _sendfile_nativez&BaseSelectorEventLoop._sendfile_native  s1     V_-**,,'')))))))))	7++FL$5: , < < < < < < < < < &&((( (%%'''06DV_-- &&((( (%%'''06DV_-6666s   $B2 2;C-c                 F   |D ]\  }}|j         |j        c}\  }}|t          j        z  r4|2|j        r|                     |           n|                     |           |t          j        z  r4|2|j        r|                     |           |                     |           d S r-   )	fileobjrX   r   r   
_cancelledrI   _add_callbackr   r   )r'   
event_listr   r   r  r   r   s          r   _process_eventsz%BaseSelectorEventLoop._process_events  s    # 	/ 	/IC(+SX%G%ffi** /v/A$ /''0000&&v...i++ /0B$ /''0000&&v...	/ 	/r(   c                 |    |                      |                                           |                                 d S r-   )rI   rK   rG   )r'   r/   s     r   _stop_servingz#BaseSelectorEventLoop._stop_serving  s/    DKKMM***

r(   r-   NNN)r   )4r!   
__module____qualname____doc__r   r2   r   SSL_HANDSHAKE_TIMEOUTSSL_SHUTDOWN_TIMEOUTr=   rA   rG   rF   r#   rY   rT   rf   rl   ri   rs   r   rS   rI   r   r   r   r   r   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    s   @r   r   r   +   s        
9 9 9 9 9 97%)$7 7 7 7 7 9=+ $t"+"A!*!?+ + + + +$ CGB B B B
	" 	" 	" 	" 	"     E E E  
 
 
, , ,& #'tS-6-L,5,JF F F F D#"+"A!*!?	,) ,) ,) ,)` D"+"A!*!?	)5 )5 )5 )5V& & &$     *     .. . .
' ' '
. . .
' ' '
  ,# # # #! ! !   *# # #"  .# # #"   2# # #"  >  ,  6    2  .# # # #  *  , , ,"7 7 7/ / /      r(   r   c                        e Zd ZdZeZdZd fd	Zd Zd Z	d Z
d Zd Zd	 Zej        fd
ZddZd Zd Zd Zd Z xZS )_SelectorTransporti   Nc                    t                                          ||           t          j        |          | j        d<   	 |                                | j        d<   n# t          $ r d | j        d<   Y nw xY wd| j        vr=	 |                                | j        d<   n# t          j	        $ r d | j        d<   Y nw xY w|| _
        |                                | _        d| _        |                     |           || _        |                                 | _        d| _        d| _        | j        | j                                         | |j        | j        <   d S )NrP   socknamern   Fr   )r   r   r   r|   _extragetsocknamerc   getpeernamerP   errorr  rK   r  _protocol_connectedset_protocol_server_buffer_factory_buffer
_conn_lost_closing_attachr&   )r'   r   r/   r0   r*   r+   r    s         r   r   z_SelectorTransport.__init__  sh   %%% & 6t < <H	+&*&6&6&8&8DK
## 	+ 	+ 	+&*DK
###	+T[((/*.*:*:*<*<J''< / / /*.J'''/
#( (###++--<#L  """*.'''s$   A A54A5B B;:B;c                    | j         j        g}| j        |                    d           n| j        r|                    d           |                    d| j                    | j        | j                                        st          | j        j	        | j        t          j                  }|r|                    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  appendr8  r  _looprE   r   r"   r   r   r   get_write_buffer_sizeformatjoin)r'   infor=  stater   s        r   __repr__z_SelectorTransport.__repr__  s]   '(:KK!!!!] 	#KK	""")$-))***:!$**>*>*@*@!*4:+?+/=):NP PG )N++++K(((*4:+?+/=+4+@B BG  !0022GKK=%==7===>>>}}SXXd^^,,,r(   c                 0    |                      d            d S r-   )_force_closerN   s    r   abortz_SelectorTransport.abort2  s    $r(   c                 "    || _         d| _        d S NT)	_protocolr2  )r'   r0   s     r   r3  z_SelectorTransport.set_protocol5  s    !#'   r(   c                     | j         S r-   )rN  rN   s    r   get_protocolz_SelectorTransport.get_protocol9  s
    ~r(   c                     | j         S r-   )r8  rN   s    r   r   z_SelectorTransport.is_closing<  s
    }r(   c                    | j         rd S d| _         | j                            | j                   | j        sQ| xj        dz  c_        | j                            | j                   | j                            | j        d            d S d S NTr   )	r8  rB  rI   r  r6  r7  r   	call_soon_call_connection_lostrN   s    r   rG   z_SelectorTransport.close?  s    = 	F
!!$-000| 	COOq OOJ%%dm444J  !;TBBBBB	C 	Cr(   c                 v    | j         1 |d| t          |            | j                                          d S d S )Nzunclosed transport )source)r  ResourceWarningrG   )r'   _warns     r   __del__z_SelectorTransport.__del__I  sL    :!E000/$OOOOJ "!r(   Fatal error on transportc                    t          |t                    r2| j                                        rt	          j        d| |d           n$| j                            ||| | j        d           |                     |           d S )Nz%r: %sTr`   )ro   rp   r   r0   )	r   rc   rB  	get_debugr   r   r{   rN  rJ  )r'   r   ro   s      r   _fatal_errorz_SelectorTransport._fatal_errorN  s    c7## 		z##%% EXtWtDDDDJ--" ! N	/ /    	#r(   c                 P   | j         rd S | j        r8| j                                         | j                            | j                   | j        s&d| _        | j                            | j                   | xj         dz  c_         | j                            | j	        |           d S rS  )
r7  r6  clearrB  r   r  r8  rI   rT  rU  )r'   r   s     r   rJ  z_SelectorTransport._force_close\  s    ? 	F< 	5L   J%%dm444} 	5 DMJ%%dm4441
T7=====r(   c                    	 | j         r| j                            |           | j                                         d | _        d | _        d | _        | j        }||                                 d | _        d S d S # | j                                         d | _        d | _        d | _        | j        }||                                 d | _        w xY wr-   )r2  rN  connection_lostr  rG   rB  r4  _detach)r'   r   r+   s      r   rU  z(_SelectorTransport._call_connection_losth  s    	$' 4..s333JDJ!DNDJ\F!   # "! JDJ!DNDJ\F!   #####s   !A9 9ACc                 *    t          | j                  S r-   )r   r6  rN   s    r   rC  z(_SelectorTransport.get_write_buffer_sizev  s    4<   r(   c                 @    | j         rd S  | j        j        ||g|R   d S r-   )r8  rB  rS   r   s       r   rS   z_SelectorTransport._add_readery  s6    = 	F
r83d333333r(   )NN)r[  )r!   r#  r$  max_size	bytearrayr5  r  r   rH  rK  r3  rP  r   rG   warningswarnrZ  r^  rJ  rU  rC  rS   r(  r)  s   @r   r+  r+    s        HO
 E/ / / / / /4- - -8     ( ( (    C C C %M    
   
> 
> 
>$ $ $! ! !4 4 4 4 4 4 4r(   r+  c                        e Zd ZdZej        j        Z	 	 d fd	Z fdZ	d Z
d Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Z fdZd Zd Z xZS )r.   TNc                    d | _         t                                          |||||           d| _        d| _        d | _        t          j        | j                   | j	        
                    | j        j        |            | j	        
                    | j        | j        | j                   |(| j	        
                    t           j        |d            d S d S r   )_read_ready_cbr   r   _eof_paused_empty_waiterr   _set_nodelayr  rB  rT  rN  connection_maderS   r  _read_readyr   _set_result_unless_cancelled)r'   r   r/   r0   r1   r*   r+   r    s          r   r   z!_SelectorSocketTransport.__init__  s     #tXuf===	!
 	 ,,,
T^;TBBB
T-!]D,<	> 	> 	>J  !E!'/ / / / / r(   c                     t          |t          j                  r| j        | _        n| j        | _        t                                          |           d S r-   )r   r	   BufferedProtocol_read_ready__get_bufferrl  _read_ready__data_receivedr   r3  )r'   r0   r    s     r   r3  z%_SelectorSocketTransport.set_protocol  sP    h	 :;; 	B"&">D"&"ADX&&&&&r(   c                 "    | j          o| j         S r-   )rn  r8  rN   s    r   r  z#_SelectorSocketTransport.is_reading  s    <5$55r(   c                     | j         s| j        rd S d| _        | j                            | j                   | j                                        rt          j        d|            d S d S )NTz%r pauses reading)r8  rn  rB  rI   r  r]  r   r   rN   s    r   r  z&_SelectorSocketTransport.pause_reading  sr    = 	DL 	F
!!$-000:!! 	4L,d33333	4 	4r(   c                     | j         s| j        sd S d| _        |                     | j        | j                   | j                                        rt          j        d|            d S d S )NFz%r resumes reading)	r8  rn  rS   r  rr  rB  r]  r   r   rN   s    r   r  z'_SelectorSocketTransport.resume_reading  su    = 	 	F(8999:!! 	5L-t44444	5 	5r(   c                 .    |                                   d S r-   )rl  rN   s    r   rr  z$_SelectorSocketTransport._read_ready  s    r(   c                    | j         rd S 	 | j                            d          }t          |          st	          d          n?# t
          t          f$ r  t          $ r!}|                     |d           Y d }~d S d }~ww xY w	 | j	        
                    |          }nR# t          t          f$ r Y d S t
          t          f$ r  t          $ r!}|                     |d           Y d }~d S d }~ww xY w|s|                                  d S 	 | j                            |           d S # t
          t          f$ r  t          $ r!}|                     |d           Y d }~d S d }~ww xY 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.)r7  rN  
get_bufferr   rD   r   r   r   r^  r  r   r]   r\   _read_ready__on_eofbuffer_updated)r'   r   r   r   s       r   rv  z0_SelectorSocketTransport._read_ready__get_buffer  s   ? 	F		.++B//Cs88 L"#JKKKL-. 	 	 	 	 	 	FH H HFFFFF	
	Z))#..FF!12 	 	 	FF-. 	 	 	 	 	 	c#IJJJFFFFF	  	$$&&&F	LN))&11111-. 	 	 	 	L 	L 	LJL L L L L L L L L	LsM   8A B A;;B B C.3C.C))C.
D& &E"EE"c                    | j         rd S 	 | j                            | j                  }nR# t          t
          f$ r Y d S t          t          f$ r  t          $ r!}| 	                    |d           Y d }~d S d }~ww xY w|s| 
                                 d S 	 | j                            |           d S # t          t          f$ r  t          $ r!}| 	                    |d           Y d }~d S d }~ww xY w)Nr~  z2Fatal error: protocol.data_received() call failed.)r7  r  r[   rf  r]   r\   r   r   r   r^  r  rN  data_received)r'   rX   r   s      r   rw  z3_SelectorSocketTransport._read_ready__data_received  sp   ? 	F	:??4=11DD!12 	 	 	FF-. 	 	 	 	 	 	c#IJJJFFFFF	  	$$&&&F	KN((.....-. 	 	 	 	K 	K 	KIK K K K K K K K K	Ks2   + A:A:A55A:B2 2C.C))C.c                    | j                                         rt          j        d|            	 | j                                        }n?# t          t          f$ r  t          $ r!}| 	                    |d           Y d }~d S d }~ww xY w|r!| j         
                    | j                   d S |                                  d S )Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.)rB  r]  r   r   rN  eof_receivedr   r   r   r^  rI   r  rG   )r'   	keep_openr   s      r   r  z,_SelectorSocketTransport._read_ready__on_eof  s    :!! 	2L*D111	3355II-. 	 	 	 	 	 	HJ J JFFFFF	
  	 J%%dm44444JJLLLLLs   A
 
B%BBc                     t          |t          t          t          f          s$t	          dt          |          j                  | j        rt          d          | j	        t          d          |sd S | j
        r;| j
        t          j        k    rt          j        d           | xj
        dz  c_
        d S | j        s	 | j                            |          }||d          }|sd S nQ# t$          t&          f$ r Y n>t(          t*          f$ r  t,          $ r!}|                     |d           Y d }~d S d }~ww xY w| 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   bytesrg  r   r   r   r!   rm  rD   ro  r7  r   !LOG_THRESHOLD_FOR_CONNLOST_WRITESr   warningr6  r  rb   r]   r\   r   r   r   r^  rB  r   r  _write_readyextend_maybe_pause_protocol)r'   rX   r   r   s       r   writez_SelectorSocketTransport.write  s   $	: >?? 	< ;#'::#6; ; < < <9 	HFGGG)IJJJ 	F? 	)"MMM@AAAOOq OOF| 	EJOOD)) ABBx F $%56    12       !!#'NOOO J""4=$2CDDD 	D!!!""$$$$$s   C* *D8=D8D33D8c                 D   | j         s
J d            | j        rd S 	 | j                            | j                   }|r
| j         d |= |                                  | j         s| j                            | j                   | j        | j        	                    d            | j
        r|                     d            d S | j        r(| j                            t          j                   d S d S d S # t           t"          f$ r Y d S t$          t&          f$ r  t(          $ r}| j                            | j                   | j                                          |                     |d           | j         | j                            |           Y d }~d S Y d }~d S d }~ww xY w)NzData should not be emptyr  )r6  r7  r  rb   _maybe_resume_protocolrB  r   r  ro  r   r8  rU  rm  shutdownrP   SHUT_WRr]   r\   r   r   r   r`  r^  r   )r'   r   r   s      r   r  z%_SelectorSocketTransport._write_ready4  s   |777777? 	F	8
--A  %L!$'')))< 8
))$-888%1&11$777= 8..t44444Y 8J''777778 88 8)  !12 	 	 	DD-. 	 	 	 	6 	6 	6J%%dm444L   c#JKKK!-"00555555555 .-----		6s   C1 1FFA/FFc                     | j         s| j        rd S d| _        | j        s&| j                            t
          j                   d S d S rM  )r8  rm  r6  r  r  rP   r  rN   s    r   	write_eofz"_SelectorSocketTransport.write_eofR  sS    = 	DI 	F	| 	0J/////	0 	0r(   c                     dS rM  rV   rN   s    r   can_write_eofz&_SelectorSocketTransport.can_write_eofY  s    tr(   c                     t                                          |           | j        )| j                            t	          d                     d S d S )NzConnection is closed by peer)r   rU  ro  r   ConnectionError)r'   r   r    s     r   rU  z._SelectorSocketTransport._call_connection_lost\  sb    %%c***),, >??A A A A A *)r(   c                     | j         t          d          | j                                        | _         | j        s| j                             d            | j         S )NzEmpty waiter is already set)ro  rD   rB  r   r6  r   rN   s    r   r  z+_SelectorSocketTransport._make_empty_waiterb  sZ    )<===!Z5577| 	0))$///!!r(   c                     d | _         d S r-   )ro  rN   s    r   r  z,_SelectorSocketTransport._reset_empty_waiterj  s    !r(   r"  )r!   r#  r$  _start_tls_compatibler   _SendfileMode
TRY_NATIVE_sendfile_compatibler   r3  r  r  r  rr  rv  rw  r  r  r  r  r  rU  r  r  r(  r)  s   @r   r.   r.     sW        $2=48$(/ / / / / /.' ' ' ' '6 6 64 4 45 5 5  #L #L #LJK K K2  *%% %% %%N8 8 8<0 0 0  A A A A A" " "" " " " " " "r(   r.   c                   L     e Zd Zej        Z	 	 d fd	Zd Zd ZddZ	d Z
 xZS )	r?   Nc                 `   t                                          ||||           || _        d| _        | j                            | j        j        |            | j                            | j        | j	        | j
                   |(| j                            t          j        |d            d S d S r   )r   r   _address_buffer_sizerB  rT  rN  rq  rS   r  rr  r   rs  )r'   r   r/   r0   r@   r1   r*   r    s          r   r   z#_SelectorDatagramTransport.__init__r  s    tXu555
T^;TBBB
T-!]D,<	> 	> 	>J  !E!'/ / / / / r(   c                     | j         S r-   )r  rN   s    r   rC  z0_SelectorDatagramTransport.get_write_buffer_size  s      r(   c                    | j         rd S 	 | j                            | j                  \  }}| j                            ||           d S # t          t          f$ r Y d S t          $ r%}| j        	                    |           Y d }~d S d }~wt          t          f$ r  t          $ r!}|                     |d           Y d }~d S d }~ww xY w)Nz&Fatal read error on datagram transport)r7  r  r   rf  rN  datagram_receivedr]   r\   rc   error_receivedr   r   r   r^  r'   rX   r   r   s       r   rr  z&_SelectorDatagramTransport._read_ready  s   ? 	F	9,,T];;JD$ N,,T488888  !12 	 	 	DD 	/ 	/ 	/N))#.........-. 	 	 	 	M 	M 	Mc#KLLLLLLLLL	Ms)   "A
 
C	C'BC%CCc                     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	        rB| j        r;| j	        t          j        k    rt          j        d           | xj	        dz  c_	        d S | j        s	 | j        d         r| j                            |           n| j                            ||           d S # t&          t(          f$ r( | j                            | j        | j                   Y nkt2          $ r%}| j                            |           Y d }~d S d }~wt8          t:          f$ r  t<          $ r!}|                     |d           Y d }~d S d }~ww xY w| j                             t          |          |f           | xj!        tE          |          z  c_!        | #                                 d S )Nr  z!Invalid address: must be None or r  r   rn   'Fatal write error on datagram transport)$r   r  rg  r   r   r   r!   r  r   r7  r   r  r   r  r6  r.  r  rb   r   r]   r\   rB  r   r  _sendto_readyrc   rN  r  r   r   r   r^  rA  r  r   r  r  s       r   r   z!_SelectorDatagramTransport.sendto  si   $	: >?? 	< ;#'::#6; ; < < < 	F= 	!D$-000 GGGI I I=D? 	t} 	)"MMM@AAAOOq OOF| 	;z* 2JOOD))))J%%dD111#%56 J J J
&&t}d6HIIIII   --c222 12       !!BD D D 	U4[[$/000SYY&""$$$$$s+   AD 6F1		F1E22F1F,,F1c                 D   | j         r=| j                                         \  }}| xj        t          |          z  c_        	 | j        d         r| j                            |           n| j                            ||           n# t          t          f$ r< | j         
                    ||f           | xj        t          |          z  c_        Y nst          $ r%}| j                            |           Y d }~d S d }~wt          t          f$ r  t           $ r!}|                     |d           Y d }~d S d }~ww xY w| j         =|                                  | j         s=| j                            | j                   | j        r|                     d            d S d S d S )Nrn   r  )r6  popleftr  r   r.  r  rb   r   r]   r\   
appendleftrc   rN  r  r   r   r   r^  r  rB  r   r  r8  rU  r  s       r   r  z(_SelectorDatagramTransport._sendto_ready  s   l 	--//JD$T*;z* 2JOOD))))J%%dD111#%56   ''t555!!SYY.!!   --c222 12       !!BD D D# l 	, 	##%%%| 	1J%%dm444} 1**400000	1 	11 1s,   AB A
D;	D;C<<D;D66D;r"  r-   )r!   r#  r$  collectionsdequer5  r   rC  rr  r   r  r(  r)  s   @r   r?   r?   n  s        !'O59$(/ / / / / /! ! !9 9 9 *% *% *% *%X1 1 1 1 1 1 1r(   r?   )r%  __all__r  rv   r   r   rP   rh  r$   sslImportError r   r   r   r   r	   r
   r   r   logr   r   BaseEventLoopr   _FlowControlMixin	Transportr+  r.   r?   rV   r(   r   <module>r     s*    #                JJJJ   
CCC                                                      ( ( (B B B B BK5 B B BJM4 M4 M4 M4 M45#-M4 M4 M4`k" k" k" k" k"1 k" k" k"\l1 l1 l1 l1 l1!3 l1 l1 l1 l1 l1s   ' 11