
    Rh                         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	ddl
Z
	 ddl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lmZ  eej                  d      Zer	  ej4                  d      Zd Z G d dej<                        Z G d dej@                  ejB                        Z" G d de"      Z# G d de"ejH                        Z%y# e$ r dZY w xY w# e$ r dZY pw xY w)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)loggersendmsg
SC_IOV_MAXFc                 t    	 | j                  |      }t        |j                  |z        S # t        $ r Y yw xY wNF)get_keyboolr   KeyError)selectorfdeventkeys       ./usr/lib/python3.12/asyncio/selector_events.py_test_selector_eventr   *   sA    (r" CJJ&''  s   + 	77c                       e Zd ZdZd3 fd	Zd3ddddZ	 d3ddddej                  ej                  ddZ		 d4d	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d3dZd Zd  Z d! Z!d" Z"d# Z#d5d$Z$d% Z%d& Z&d' Z'd( Z(d) Z)d* Z*d+ Z+d3d,Z,d- Z-d. Z.d/ Z/d0 Z0d1 Z1d2 Z2 xZ3S )6r   zJSelector event loop.

    See events.EventLoop for API specification.
    Nc                    t         |           |t        j                         }t	        j
                  d|j                  j                         || _        | j                          t        j                         | _        y )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__;   sa     002H)8+=+=+F+FG!"668    extraserverc                D    | j                  |       t        | |||||      S N)_ensure_fd_no_transport_SelectorSocketTransport)r)   sockprotocolwaiterr,   r-   s         r   _make_socket_transportz,BaseSelectorEventLoop._make_socket_transportE   s*    $$T*'dHf(-v7 	7r*   F)server_sideserver_hostnamer,   r-   ssl_handshake_timeoutssl_shutdown_timeoutc          
          | j                  |       t        j                  | ||||||	|
      }t        | ||||       |j                  S )N)r8   r9   r+   )r0   r
   SSLProtocolr1   _app_transport)r)   rawsockr3   
sslcontextr4   r6   r7   r,   r-   r8   r9   ssl_protocols               r   _make_ssl_transportz)BaseSelectorEventLoop._make_ssl_transportK   sW     	$$W-++(J"7!5	
 	!w',V	=***r*   c                 D    | j                  |       t        | |||||      S r/   )r0   _SelectorDatagramTransport)r)   r2   r3   addressr4   r,   s         r   _make_datagram_transportz.BaseSelectorEventLoop._make_datagram_transport]   s,    $$T*)$h*165B 	Br*   c                     | j                         rt        d      | j                         ry | j                          t        |           | j                  "| j                  j                          d | _        y y )Nz!Cannot close a running event loop)
is_runningRuntimeError	is_closed_close_self_piper   closer$   r)   r"   s    r   rJ   zBaseSelectorEventLoop.closec   sa    ??BCC>>>>%NN  "!DN &r*   c                    | j                  | j                  j                                | j                  j                          d | _        | j                  j                          d | _        | xj
                  dz  c_        y )Nr   )_remove_reader_ssockfilenorJ   _csock_internal_fdsr)   s    r   rI   z&BaseSelectorEventLoop._close_self_pipen   s\    DKK..01ar*   c                 D   t        j                         \  | _        | _        | j                  j	                  d       | j                  j	                  d       | xj
                  dz  c_        | j                  | j                  j                         | j                         y )NFr   )	socket
socketpairrN   rP   setblockingrQ   _add_readerrO   _read_from_selfrR   s    r   r%   z%BaseSelectorEventLoop._make_self_pipev   sq    #)#4#4#6 T[&&a++-t/C/CDr*   c                      y r/    r)   datas     r   _process_self_dataz(BaseSelectorEventLoop._process_self_data~   s    r*   c                     	 	 | j                   j                  d      }|sy | j                  |       1# t        $ r Y =t        $ r Y y w xY w)Ni   )rN   recvr]   InterruptedErrorBlockingIOErrorr[   s     r   rX   z%BaseSelectorEventLoop._read_from_self   sV    {{''-''-  $ " s   3 3 	A	A	A	c                     | j                   }|y 	 |j                  d       y # t        $ r( | j                  rt	        j
                  dd       Y y Y y w xY w)N    z3Fail to write a null byte into the self-pipe socketTexc_info)rP   sendOSError_debugr   r!   )r)   csocks     r   _write_to_selfz$BaseSelectorEventLoop._write_to_self   sU     =	,JJu 	,{{ 0&*, 	,s   # ,AAd   c                 f    | j                  |j                         | j                  |||||||	       y r/   )rW   rO   _accept_connection)r)   protocol_factoryr2   r>   r-   backlogr8   r9   s           r   _start_servingz$BaseSelectorEventLoop._start_serving   s4     	(?(?)4VW.0D	Fr*   c                    t        |      D ]w  }	 |j                         \  }	}
| j                  rt        j                  d||
|	       |	j                  d       d|
i}| j                  ||	|||||      }| j                  |       y y # t        t        t        f$ r Y  y t        $ r}|j                  t        j                  t        j                  t        j                  t        j                   fv ry| j#                  d|t%        j&                  |      d       | j)                  |j+                                | j-                  t.        j0                  | j2                  |||||||	       n Y d }~dd }~ww xY w)Nz#%r got a new connection from %r: %rFpeernamez&socket.accept() out of system resource)message	exceptionrT   )rangeacceptrh   r   r!   rV   _accept_connection2create_taskra   r`   ConnectionAbortedErrorrg   errnoEMFILEENFILEENOBUFSENOMEMcall_exception_handlerr   TransportSocketrM   rO   
call_laterr   ACCEPT_RETRY_DELAYrp   )r)   rn   r2   r>   r-   ro   r8   r9   _connaddrr,   rv   excs                 r   rm   z(BaseSelectorEventLoop._accept_connection   s]    w #	)A")![[]
d;;LL!F!'t5  '2 $T*11$dE:v)+?A   (G#	) $%57MN  99u||!&!> >
 //#K%("("8"8">1 
 ''6OOI$@$@$($7$7$4dJ$+-B$8	: :s   ABE5E5&CE00E5c                   K   d }d }		  |       }| j                         }
|r| j                  ||||
d||||	      }	n| j                  |||
||      }		 |
 d {    y 7 # t        $ r |	j	                          d }
 w xY w# t
        t        f$ r  t        $ r?}| j                  r)d|d}|||d<   |	|	|d<   | j                  |       Y d }~y Y d }~y d }~ww xY ww)NT)r4   r6   r,   r-   r8   r9   )r4   r,   r-   z3Error on transport creation for incoming connection)rs   rt   r3   	transport)	create_futurer@   r5   BaseExceptionrJ   
SystemExitKeyboardInterruptrh   r   )r)   rn   r   r,   r>   r-   r8   r9   r3   r   r4   r   contexts                r   rw   z)BaseSelectorEventLoop._accept_connection2   s    
 	&	5')H'')F 44(Jv $E&*?)=	 5 ?	 !77(6! 8 #	  !  -. 	 	5{{ N!$
 '*2GJ'(+4GK(++G44 	5sS   CA
B  A  AA  CA   A==B   C0C
CCCc                 *   |}t        |t              s	 t        |j                               }	 | j                  |   }|j                         st        d|d|      y # t        t        t
        f$ r t        d|      d w xY w# t        $ r Y y w xY w)NzInvalid file object: zFile descriptor z is used by transport )

isinstanceintrO   AttributeError	TypeError
ValueErrorr(   
is_closingrG   r   )r)   r   rO   r   s       r   r0   z-BaseSelectorEventLoop._ensure_fd_no_transport  s    &#&KV]]_-	&((0I '')"&rf,B m%& & * #Iz: K #8!?@dJK
  		s   A B $B	BBc                    | j                          t        j                  ||| d       }	 | j                  j	                  |      }|j                  |j
                  c}\  }}| j                  j                  ||t        j                  z  ||f       ||j                          |S # t        $ r1 | j                  j                  |t        j                  |d f       Y |S w xY wr/   )_check_closedr   Handler$   r   r\   modifyr   
EVENT_READcancelr   register	r)   r   callbackargshandler   maskreaderwriters	            r   rW   z!BaseSelectorEventLoop._add_reader  s    xtT:
	 ..((,C
 &)ZZ"D"66NN!!"dY-A-A&A#)6"24!  	4NN##B	(<(<%+TN4 	4   B% %6CCc                 |   | j                         ry	 | j                  j                  |      }|j                  |j                  c}\  }}|t
        j                   z  }|s| j                  j                  |       n| j                  j                  ||d |f       ||j                          yy# t        $ r Y yw xY w)NFT)rH   r$   r   r   r\   r   r   
unregisterr   r   r   r)   r   r   r   r   r   s         r   rM   z$BaseSelectorEventLoop._remove_reader&  s    >>	..((,C &)ZZ"D"66Y))))D))"-%%b$v?!  		   B/ /	B;:B;c                    | j                          t        j                  ||| d       }	 | j                  j	                  |      }|j                  |j
                  c}\  }}| j                  j                  ||t        j                  z  ||f       ||j                          |S # t        $ r1 | j                  j                  |t        j                  d |f       Y |S w xY wr/   )r   r   r   r$   r   r\   r   r   EVENT_WRITEr   r   r   r   s	            r   _add_writerz!BaseSelectorEventLoop._add_writer;  s    xtT:
	 ..((,C
 &)ZZ"D"66NN!!"dY-B-B&B#)6"24!  	4NN##B	(=(=%)6N4 	4r   c                 |   | j                         ry	 | j                  j                  |      }|j                  |j                  c}\  }}|t
        j                   z  }|s| j                  j                  |       n| j                  j                  |||df       ||j                          yy# t        $ r Y yw xY w)Remove a writer callback.FNT)rH   r$   r   r   r\   r   r   r   r   r   r   r   s         r   _remove_writerz$BaseSelectorEventLoop._remove_writerK  s    >>	..((,C &)ZZ"D"66Y****D))"-%%b$?!  		r   c                 N    | j                  |        | j                  ||g|  y)zAdd a reader callback.N)r0   rW   r)   r   r   r   s       r   
add_readerz BaseSelectorEventLoop.add_readerb  '    $$R(X--r*   c                 F    | j                  |       | j                  |      S )zRemove a reader callback.)r0   rM   r)   r   s     r   remove_readerz#BaseSelectorEventLoop.remove_readerg  !    $$R(""2&&r*   c                 N    | j                  |        | j                  ||g|  y)zAdd a writer callback..N)r0   r   r   s       r   
add_writerz BaseSelectorEventLoop.add_writerl  r   r*   c                 F    | j                  |       | j                  |      S )r   )r0   r   r   s     r   remove_writerz#BaseSelectorEventLoop.remove_writerq  r   r*   c                   K   t        j                  |       | j                  r|j                         dk7  rt	        d      	 |j                  |      S # t        t        f$ r Y nw xY w| j                         }|j                         }| j                  |       | j                  || j                  |||      }|j                  t        j                  | j                   ||             | d{  7  S w)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_socketrh   
gettimeoutr   r_   ra   r`   r   rO   r0   rW   
_sock_recvadd_done_callback	functoolspartial_sock_read_done)r)   r2   nfutr   r   s         r   	sock_recvzBaseSelectorEventLoop.sock_recvv  s      	%%d+;;4??,1>??	99Q<!12 		  "[[]$$R(!!"doosD!Dd22BvF	Hyy7   A C5A C5A&#C5%A&&B	C5/C20C5c                 L    ||j                         s| j                  |       y y r/   )	cancelledr   r)   r   r   r   s       r   r   z%BaseSelectorEventLoop._sock_read_done  %    >!1!1!3r" "4r*   c                     |j                         ry 	 |j                  |      }|j                  |       y # t        t        f$ r Y y t
        t        f$ r  t        $ r}|j                  |       Y d }~y d }~ww xY wr/   )	doner_   
set_resultra   r`   r   r   r   set_exception)r)   r   r2   r   r\   r   s         r   r   z BaseSelectorEventLoop._sock_recv  su     88:		!99Q<D NN4   !12 	-. 	 	#c""	#   6 A9A9A44A9c                   K   t        j                  |       | j                  r|j                         dk7  rt	        d      	 |j                  |      S # t        t        f$ r Y nw xY w| j                         }|j                         }| j                  |       | j                  || j                  |||      }|j                  t        j                  | j                   ||             | d{  7  S w)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   rh   r   r   	recv_intora   r`   r   rO   r0   rW   _sock_recv_intor   r   r   r   )r)   r2   bufr   r   r   s         r   sock_recv_intoz$BaseSelectorEventLoop.sock_recv_into  s      	%%d+;;4??,1>??	>>#&&!12 		  "[[]$$R(!!"d&:&:CsKd22BvF	Hyyr   c                     |j                         ry 	 |j                  |      }|j                  |       y # t        t        f$ r Y y t
        t        f$ r  t        $ r}|j                  |       Y d }~y d }~ww xY wr/   )	r   r   r   ra   r`   r   r   r   r   )r)   r   r2   r   nbytesr   s         r   r   z%BaseSelectorEventLoop._sock_recv_into  sv     88:		#^^C(F NN6"  !12 	-. 	 	#c""	#r   c                   K   t        j                  |       | j                  r|j                         dk7  rt	        d      	 |j                  |      S # t        t        f$ r Y nw xY w| j                         }|j                         }| j                  |       | j                  || j                  |||      }|j                  t        j                  | j                   ||             | d{  7  S w)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   rh   r   r   recvfromra   r`   r   rO   r0   rW   _sock_recvfromr   r   r   r   )r)   r2   bufsizer   r   r   s         r   sock_recvfromz#BaseSelectorEventLoop.sock_recvfrom  s      	%%d+;;4??,1>??	==))!12 		  "[[]$$R(!!"d&9&93gNd22BvF	Hyyr   c                     |j                         ry 	 |j                  |      }|j                  |       y # t        t        f$ r Y y t
        t        f$ r  t        $ r}|j                  |       Y d }~y d }~ww xY wr/   )	r   r   r   ra   r`   r   r   r   r   )r)   r   r2   r   resultr   s         r   r   z$BaseSelectorEventLoop._sock_recvfrom  sv     88:		#]]7+F NN6"  !12 	-. 	 	#c""	#r   c                   K   t        j                  |       | j                  r|j                         dk7  rt	        d      |st        |      }	 |j                  ||      S # t        t        f$ r Y nw xY w| j                         }|j                         }| j                  |       | j                  || j                  ||||      }|j                  t        j                   | j"                  ||             | d{  7  S w)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   rh   r   r   lenrecvfrom_intora   r`   r   rO   r0   rW   _sock_recvfrom_intor   r   r   r   )r)   r2   r   r   r   r   r   s          r   sock_recvfrom_intoz(BaseSelectorEventLoop.sock_recvfrom_into  s      	%%d+;;4??,1>??XF	%%c622!12 		  "[[]$$R(!!"d&>&>T3"(*d22BvF	Hyys7   ADA" !D"A41D3A44B
D>D?Dc                     |j                         ry 	 |j                  ||      }|j                  |       y # t        t        f$ r Y y t
        t        f$ r  t        $ r}|j                  |       Y d }~y d }~ww xY wr/   )	r   r   r   ra   r`   r   r   r   r   )r)   r   r2   r   r   r   r   s          r   r   z)BaseSelectorEventLoop._sock_recvfrom_into  sz     88:		#''W5F NN6"  !12 	-. 	 	#c""	#s   7 A:A:A55A:c           	      (  K   t        j                  |       | j                  r|j                         dk7  rt	        d      	 |j                  |      }|t        |      k(  ry| j                         }|j                         }| j                  |       | j                  || j                  ||t        |      |g      }|j                  t!        j"                  | j$                  ||             | d{   S # t        t        f$ r d}Y w xY w7 w)  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   rh   r   r   rf   ra   r`   r   r   rO   r0   r   _sock_sendall
memoryviewr   r   r   _sock_write_done)r)   r2   r\   r   r   r   r   s          r   sock_sendallz"BaseSelectorEventLoop.sock_sendall  s      	%%d+;;4??,1>??			$A D	>  "[[]$$R(!!"d&8&8#t",T"2QC9d33RG	Iy  !12 	A	 s7   A DC9 B D4D5D9D
DDDc                 :   |j                         ry |d   }	 |j                  ||d        }||z  }|t        |      k(  r|j                  d        y ||d<   y # t        t        f$ r Y y t        t
        f$ r  t        $ r}|j                  |       Y d }~y d }~ww xY wNr   )
r   rf   ra   r`   r   r   r   r   r   r   )r)   r   r2   viewposstartr   r   s           r   r   z#BaseSelectorEventLoop._sock_sendall7  s    88:A			$uv,'A 	
CINN4 CF  !12 	-. 	 	c"	s   A B(B?BBc                   K   t        j                  |       | j                  r|j                         dk7  rt	        d      	 |j                  ||      S # t        t        f$ r Y nw xY w| j                         }|j                         }| j                  |       | j                  || j                  ||||      }|j                  t        j                  | j                   ||             | d{  7  S w)r   r   r   r   N)r   r   rh   r   r   sendtora   r`   r   rO   r0   r   _sock_sendtor   r   r   r   )r)   r2   r\   rC   r   r   r   s          r   sock_sendtoz!BaseSelectorEventLoop.sock_sendtoM  s      	%%d+;;4??,1>??	;;tW--!12 		   "[[]$$R(!!"d&7&7dD")+d33RG	Iyys7   A C7A C7A'$C7&A''B
C71C42C7c                     |j                         ry 	 |j                  |d|      }|j                  |       y # t        t        f$ r Y y t
        t        f$ r  t        $ r}|j                  |       Y d }~y d }~ww xY wr   )	r   r   r   ra   r`   r   r   r   r   )r)   r   r2   r\   rC   r   r   s          r   r   z"BaseSelectorEventLoop._sock_sendtoh  sx    88:		D!W-A NN1  !12 	-. 	 	#c""	#s   8 A;	A; A66A;c                    K   t        j                  |       | j                  r|j                         dk7  rt	        d      |j
                  t        j                  k(  s-t         j                  rd|j
                  t        j                  k(  rG| j                  ||j
                  |j                  |j                  |        d{   }|d   \  }}}}}| j                         }| j                  |||       	 | d{   d}S 7 ?7 # d}w xY ww)zTConnect to a remote socket at address.

        This method is a coroutine.
        r   r   )familytypeprotoloopN)r   r   rh   r   r   r   rT   AF_INET	_HAS_IPv6AF_INET6_ensure_resolvedr   r   r   _sock_connect)r)   r2   rC   resolvedr   r   s         r   sock_connectz"BaseSelectorEventLoop.sock_connectw  s     
 	%%d+;;4??,1>??;;&..(%%$++*H!22$))4:: 3  H #+1+Aq!Q  "3g.	9 C  Cs<   CDD2D7D <D=D  DD DDc                    |j                         }	 |j                  |       |j                  d        d }y # t        t        f$ rf | j                  |       | j                  || j                  |||      }|j                  t        j                  | j                  ||             Y d }y t        t        f$ r  t        $ r}|j                  |       Y d }~d }y d }~ww xY w# d }w xY w)Nr   )rO   connectr   ra   r`   r0   r   _sock_connect_cbr   r   r   r   r   r   r   r   )r)   r   r2   rC   r   r   r   s          r   r   z#BaseSelectorEventLoop._sock_connect  s    [[]	LL!  NN4 C#  !12 		M
 ((,%%D))3g?F!!!!$"7"7FKM C -. 	 	#c"" C	#
 Cs9   7 C" A0C'C" +CCC" CC" "C&c                 L    ||j                         s| j                  |       y y r/   )r   r   r   s       r   r   z&BaseSelectorEventLoop._sock_write_done  r   r*   c                 v   |j                         ry 	 |j                  t        j                  t        j                        }|dk7  rt        |d|       	 |j                  d        d }y # t        t        f$ r Y d }y t        t        f$ r  t        $ r}|j                  |       Y d }~d }y d }~ww xY w# d }w xY w)Nr   zConnect call failed )r   
getsockoptrT   
SOL_SOCKETSO_ERRORrg   r   ra   r`   r   r   r   r   )r)   r   r2   rC   errr   s         r   r  z&BaseSelectorEventLoop._sock_connect_cb  s    88:	//&"3"3V__ECaxc%9'#CDD  NN4 C  !12 	 C -. 	 	#c"" C	#
 Cs<   AA* B4 *B19B4 =B1B,%B4 ,B11B4 4B8c                    K   t        j                  |       | j                  r|j                         dk7  rt	        d      | j                         }| j                  ||       | d{   S 7 w)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   rh   r   r   r   _sock_accept)r)   r2   r   s      r   sock_acceptz!BaseSelectorEventLoop.sock_accept  s_      	%%d+;;4??,1>??  "#t$yys   A'A0)A.*A0c                    |j                         }	 |j                         \  }}|j                  d       |j                  ||f       y # t        t
        f$ rc | j                  |       | j                  || j                  ||      }|j                  t        j                  | j                  ||             Y y t        t        f$ r  t        $ r}|j!                  |       Y d }~y d }~ww xY w)NFr   )rO   rv   rV   r   ra   r`   r0   rW   r  r   r   r   r   r   r   r   r   )r)   r   r2   r   r   rC   r   r   s           r   r  z"BaseSelectorEventLoop._sock_accept  s    [[]	, KKMMD'U# NND'?+  !12 	L((,%%b$*;*;S$GF!!!!$"6"66JL-. 	 	#c""	#s   $A
 
A/C-;C-C((C-c                   K   | j                   |j                  = |j                         }|j                          |j	                          d {    	 | j                  |j                  |||d       d {   |j                          |r|j                          || j                   |j                  <   S 7 h7 A# |j                          |r|j                          || j                   |j                  <   w xY w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  s     V__-**,'')))	7++FLL$5: , < < &&(%%'06DV__- 	*< &&(%%'06DV__-s<   AC:B6C:#B: 6B87B: :=C:8B: :=C77C:c                 d   |D ]  \  }}|j                   |j                  c}\  }}|t        j                  z  r1|/|j                  r| j                  |       n| j                  |       |t        j                  z  sz|}|j                  r| j                  |       | j                  |        y r/   )	fileobjr\   r   r   
_cancelledrM   _add_callbackr   r   )r)   
event_listr   r   r  r   r   s          r   _process_eventsz%BaseSelectorEventLoop._process_events  s    # 	/IC(+SXX%G%ffi***v/A$$''0&&v.i+++0B$$''0&&v.	/r*   c                 b    | j                  |j                                |j                          y r/   )rM   rO   rJ   )r)   r2   s     r   _stop_servingz#BaseSelectorEventLoop._stop_serving  s    DKKM*

r*   r/   NNN)r   )4r#   
__module____qualname____doc__r   r5   r   SSL_HANDSHAKE_TIMEOUTSSL_SHUTDOWN_TIMEOUTr@   rD   rJ   rI   r%   r]   rX   rj   rp   rm   rw   r0   rW   rM   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   5   so   
97%)$7 9=+ $t"+"A"A!*!?!?+& CGB	" E
,& #'tS-6-L-L,5,J,JF D#"+"A"A!*!?!?	,)` D"+"A"A!*!?!?	-5^&$ * ..
'
.
'
,#! *#".#"2#">,62.#*,"7/r*   r   c                        e Zd ZdZdZd fd	Zd Zd Z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                         | j                  d<   d| j                  vr	 |j                         | j                  d<   || _
        |j                         | _        d| _        | j                  |       || _        t!        j"                         | _        d| _        d| _        d| _        | j                  | j                  j-                          | |j.                  | j                  <   y # t        $ r d | j                  d<   Y w xY w# t        j                  $ r d | j                  d<   Y w xY w)NrT   socknamerr   Fr   )r   r   r   r   _extragetsocknamerg   getpeernamerT   errorr  rO   r  _protocol_connectedset_protocol_servercollectionsdeque_buffer
_conn_lost_closing_paused_attachr(   )r)   r   r2   r3   r,   r-   r"   s         r   r   z_SelectorTransport.__init__  s8   % & 6 6t <H	+&*&6&6&8DKK
# T[[(/*.*:*:*<J' 
#( (#"((*<<#LL  "*.'+  	+&*DKK
#	+
 << /*.J'/s#   D' !E 'EE"E*)E*c                    | j                   j                  g}| j                  |j                  d       n| j                  r|j                  d       |j                  d| j
                          | j                  | j                  j                         st        | j                  j                  | j
                  t        j                        }|r|j                  d       n|j                  d       t        | j                  j                  | j
                  t        j                        }|rd}nd}| j                         }|j                  d| d	| d
       dj                  dj                  |            S )Nclosedclosingzfd=zread=pollingz	read=idlepollingidlezwrite=<z
, bufsize=>z<{}> )r"   r#   r  appendr<  r  _looprH   r   r$   r   r   r   get_write_buffer_sizeformatjoin)r)   inforB  stater   s        r   __repr__z_SelectorTransport.__repr__'  s$   ''(::KK!]]KK	"c$--)*::!$***>*>*@*4::+?+?+/==):N:NPGN+K(*4::+?+?+/==+4+@+@BG !002GKK'%
7)1=>}}SXXd^,,r*   c                 &    | j                  d        y r/   )_force_closerR   s    r   abortz_SelectorTransport.abortC  s    $r*   c                      || _         d| _        y NT)	_protocolr5  )r)   r3   s     r   r6  z_SelectorTransport.set_protocolF  s    !#' r*   c                     | j                   S r/   )rS  rR   s    r   get_protocolz_SelectorTransport.get_protocolJ  s    ~~r*   c                     | j                   S r/   )r<  rR   s    r   r   z_SelectorTransport.is_closingM  s    }}r*   c                 B    | j                          xr | j                   S r/   )r   r=  rR   s    r   r  z_SelectorTransport.is_readingP  s    ??$$9T\\)99r*   c                     | j                         sy d| _        | j                  j                  | j                         | j                  j                         rt        j                  d|        y y )NTz%r pauses reading)r  r=  rG  rM   r  	get_debugr   r!   rR   s    r   r  z _SelectorTransport.pause_readingS  sP     

!!$--0::!LL,d3 "r*   c                     | j                   s| j                  sy d| _        | j                  | j                  | j                         | j
                  j                         rt        j                  d|        y y )NFz%r resumes reading)	r<  r=  rW   r  _read_readyrG  rY  r   r!   rR   s    r   r  z!_SelectorTransport.resume_reading[  sW    ==(8(89::!LL-t4 "r*   c                 P   | j                   ry d| _         | j                  j                  | j                         | j                  sa| xj
                  dz  c_        | j                  j                  | j                         | j                  j                  | j                  d        y y NTr   )	r<  rG  rM   r  r:  r;  r   	call_soon_call_connection_lostrR   s    r   rJ   z_SelectorTransport.closec  ss    ==

!!$--0||OOq OJJ%%dmm4JJ  !;!;TB r*   c                 v    | j                   - |d| t        |        | j                   j                          y y )Nzunclosed transport )source)r  ResourceWarningrJ   )r)   _warns     r   __del__z_SelectorTransport.__del__m  s5    ::!'x0/$OJJ "r*   c                    t        |t              r4| j                  j                         rDt	        j
                  d| |d       n*| j                  j                  ||| | j                  d       | j                  |       y )Nz%r: %sTrd   )rs   rt   r   r3   )	r   rg   rG  rY  r   r!   r   rS  rO  )r)   r   rs   s      r   _fatal_errorz_SelectorTransport._fatal_errorr  se    c7#zz##%XtWtDJJ--" ! NN	/  	#r*   c                    | j                   ry | j                  r?| j                  j                          | j                  j	                  | j
                         | j                  s,d| _        | j                  j                  | j
                         | xj                   dz  c_         | j                  j                  | j                  |       y r]  )
r;  r:  clearrG  r   r  r<  rM   r^  r_  )r)   r   s     r   rO  z_SelectorTransport._force_close  s    ??<<LL JJ%%dmm4}} DMJJ%%dmm41

T77=r*   c                    	 | j                   r| j                  j                  |       | j                  j	                          d | _        d | _        d | _        | j                  }||j                          d | _        y y # | j                  j	                          d | _        d | _        d | _        | j                  }||j                          d | _        w w xY wr/   )r5  rS  connection_lostr  rJ   rG  r7  _detach)r)   r   r-   s      r   r_  z(_SelectorTransport._call_connection_lost  s    	$''..s3JJDJ!DNDJ\\F! # " JJDJ!DNDJ\\F! # "s   'A? ?ACc                 H    t        t        t        | j                              S r/   )summapr   r:  rR   s    r   rH  z(_SelectorTransport.get_write_buffer_size  s    3sDLL)**r*   c                 b    | j                         sy  | j                  j                  ||g|  y r/   )r  rG  rW   r   s       r   rW   z_SelectorTransport._add_reader  s*     

r83d3r*   )NN)zFatal error on transport)r#   r&  r'  max_sizer  r   rM  rP  r6  rU  r   r  r  r  rJ   warningswarnrd  rf  rO  r_  rH  rW   r+  r,  s   @r   r.  r.    sk     H
 E/8-8 (:45C %MM 

>$+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eddfdZd Zd Zd Zd Z fdZd Zd Z fdZ xZS )r1   TNc                    d | _         t        | 	  |||||       d| _        d | _        t
        r| j                  | _        n| j                  | _        t        j                  | j                         | j                  j                  | j                  j                  |        | j                  j                  | j                   | j"                  | j$                         |,| j                  j                  t&        j(                  |d        y y r   )_read_ready_cbr   r   _eof_empty_waiter_HAS_SENDMSG_write_sendmsg_write_ready_write_sendr   _set_nodelayr  rG  r^  rS  connection_maderW   r  r[  r   _set_result_unless_cancelled)r)   r   r2   r3   r4   r,   r-   r"   s          r   r   z!_SelectorSocketTransport.__init__  s     #tXuf=	! $ 3 3D $ 0 0D 	  ,

T^^;;TB

T--!]]D,<,<	>JJ  !E!E!'/ r*   c                     t        |t        j                        r| j                  | _        n| j
                  | _        t        |   |       y r/   )r   r	   BufferedProtocol_read_ready__get_bufferru  _read_ready__data_receivedr   r6  )r)   r3   r"   s     r   r6  z%_SelectorSocketTransport.set_protocol  s<    h	 : :;"&">">D"&"A"ADX&r*   c                 $    | j                          y r/   )ru  rR   s    r   r[  z$_SelectorSocketTransport._read_ready  s    r*   c                    | j                   ry 	 | j                  j                  d      }t        |      st	        d      	 	 | j                  j                  |      }|s| j                          y 	 | j                  j                  |       y # t
        t        f$ r  t        $ r}| j                  |d       Y d }~y d }~ww xY w# t        t        f$ r Y y t
        t        f$ r  t        $ r}| j                  |d       Y d }~y d }~ww xY w# t
        t        f$ r  t        $ r}| j                  |d       Y d }~y 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.)r;  rS  
get_bufferr   rG   r   r   r   rf  r  r   ra   r`   _read_ready__on_eofbuffer_updated)r)   r   r   r   s       r   r  z0_SelectorSocketTransport._read_ready__get_buffer  sC   ??		..++B/Cs8"#JKK 	ZZ))#.F $$&	LNN))&1- -. 	 	FH	  !12 	-. 	 	c#IJ	 -. 	 	LJL L	LsM   1B C 1D C%B<<CDD,DDD?#D::D?c                    | j                   ry 	 | j                  j                  | j                        }|s| j                          y 	 | j                  j                  |       y # t        t
        f$ r Y y t        t        f$ r  t        $ r}| j                  |d       Y d }~y d }~ww xY w# t        t        f$ r  t        $ r}| j                  |d       Y d }~y d }~ww xY w)Nr  z2Fatal error: protocol.data_received() call failed.)r;  r  r_   rp  ra   r`   r   r   r   rf  r  rS  data_received)r)   r\   r   s      r   r  z3_SelectorSocketTransport._read_ready__data_received  s    ??	::??4==1D $$&	KNN((.  !12 	-. 	 	c#IJ	 -. 	 	KIK K	Ks5   %A$ B+ $B(5B(B##B(+CCCc                 x   | j                   j                         rt        j                  d|        	 | j                  j                         }|r&| j                   j                  | j                         y | j                          y # t        t        f$ r  t        $ r}| j                  |d       Y d }~y d }~ww xY w)Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.)rG  rY  r   r!   rS  eof_receivedr   r   r   rf  rM   r  rJ   )r)   	keep_openr   s      r   r  z,_SelectorSocketTransport._read_ready__on_eof
  s    ::!LL*D1	335I  JJ%%dmm4JJL -. 	 	HJ	s   B B9B44B9c                 <   t        |t        t        t        f      s!t	        dt        |      j                        | j                  rt        d      | j                  t        d      |sy | j                  rH| j                  t        j                  k\  rt        j                  d       | xj                  dz  c_
        y | j                  s]	 | j                   j#                  |      }t        |      |d  }|sy | j0                  j3                  | j4                  | j6                         | j                  j9                  |       | j;                          y # t$        t&        f$ r Y mt(        t*        f$ r  t,        $ r}| j/                  |d       Y d }~y d }~ww xY w)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   bytes	bytearrayr   r   r   r#   rv  rG   rw  r;  r   !LOG_THRESHOLD_FOR_CONNLOST_WRITESr   warningr:  r  rf   ra   r`   r   r   r   rf  rG  r   r  rz  rF  _maybe_pause_protocol)r)   r\   r   r   s       r   writez_SelectorSocketTransport.write  s_   $	: >? ##':#6#6"9; < <99FGG)IJJ??)"M"MM@AOOq O||JJOOD) "$'+JJ""4==$2C2CD 	D!""$! $%56  12   !!#'NOs   E F(F?FFc                 J    t        j                  | j                  t              S r/   )	itertoolsislicer:  r   rR   s    r   _get_sendmsg_bufferz,_SelectorSocketTransport._get_sendmsg_bufferF  s    j99r*   c                    | j                   sJ d       | j                  ry 	 | j                  j                  | j	                               }| j                  |       | j                          | j                   s| j                  j                  | j                         | j                  | j                  j                  d        | j                  r| j                  d        y | j                  r*| j                  j                  t         j"                         y y y # t$        t&        f$ r Y y t(        t*        f$ r  t,        $ r}| j                  j                  | j                         | j                   j/                          | j1                  |d       | j                   | j                  j3                  |       Y d }~y Y d }~y d }~ww xY wNzData should not be emptyr  )r:  r;  r  r   r  _adjust_leftover_buffer_maybe_resume_protocolrG  r   r  rw  r   r<  r_  rv  shutdownrT   SHUT_WRra   r`   r   r   r   rh  rf  r   )r)   r   r   s      r   ry  z'_SelectorSocketTransport._write_sendmsgI  sh   ||777|??	8ZZ''(@(@(BCF((0 '')<<

))$--8%%1&&11$7==..t4YYJJ''7     !12 	-. 	 	6JJ%%dmm4LL c#JK!!-""0055 .		6s   :D G	+G	A8GG	r   returnc                     | j                   }|r?|j                         }t        |      }||k  r||z  }n|j                  ||d         y |r>y y r/   )r:  popleftr   
appendleft)r)   r   bufferbb_lens        r   r  z0_SelectorSocketTransport._adjust_leftover_buffere  sO     AFE%!!!FG*- r*   c                    | j                   sJ d       | j                  ry 	 | j                   j                         }| j                  j	                  |      }|t        |      k7  r| j                   j                  ||d         | j                          | j                   s| j                  j                  | j                         | j                  | j                  j                  d        | j                  r| j                  d        y | j                  r*| j                  j!                  t"        j$                         y y y # t&        t(        f$ r Y y t*        t,        f$ r  t.        $ r}| j                  j                  | j                         | j                   j1                          | j3                  |d       | j                   | j                  j5                  |       Y d }~y Y d }~y d }~ww xY wr  )r:  r;  r  r  rf   r   r  r  rG  r   r  rw  r   r<  r_  rv  r  rT   r  ra   r`   r   r   r   rh  rf  r   )r)   r  r   r   s       r   r{  z$_SelectorSocketTransport._write_sendp  s   ||777|??	8\\))+F

'ACK''qr
3 '')<<

))$--8%%1&&11$7==..t4YYJJ''7     !12 	-. 	 	6JJ%%dmm4LL c#JK!!-""0055 .		6s   A!E G0G0)A8G++G0c                     | j                   s| j                  ry d| _        | j                  s*| j                  j	                  t
        j                         y y rR  )r<  rv  r:  r  r  rT   r  rR   s    r   	write_eofz"_SelectorSocketTransport.write_eof  s;    ==DII	||JJ/ r*   c                    | j                   rt        d      | j                  t        d      |sy | j                  j	                  |D cg c]  }t        |       c}       | j                          | j                  rA| j                  j                  | j                  | j                         | j                          y y c c}w )Nz*Cannot call writelines() after write_eof()z-unable to writelines; sendfile is in progress)rv  rG   rw  r:  extendr   rz  rG  r   r  r  )r)   list_of_datar\   s      r   
writelinesz#_SelectorSocketTransport.writelines  s    99KLL)NOO,G$Z-GH<<JJ""4==$2C2CD&&(  Hs   Cc                      yrR  rZ   rR   s    r   can_write_eofz&_SelectorSocketTransport.can_write_eof  s    r*   c                     t         |   |       | j                  %| j                  j                  t	        d             y y )NzConnection is closed by peer)r   r_  rw  r   ConnectionError)r)   r   r"   s     r   r_  z._SelectorSocketTransport._call_connection_lost  s?    %c*),, >?A *r*   c                     | j                   t        d      | j                  j                         | _         | j                  s| j                   j                  d        | j                   S )NzEmpty waiter is already set)rw  rG   rG  r   r:  r   rR   s    r   r  z+_SelectorSocketTransport._make_empty_waiter  sV    )<==!ZZ557||))$/!!!r*   c                     d | _         y r/   )rw  rR   s    r   r  z,_SelectorSocketTransport._reset_empty_waiter  s
    !r*   c                 >    d | _         d | _        t        |           y r/   )ru  rz  r   rJ   rK   s    r   rJ   z_SelectorSocketTransport.close  s    " r*   r%  )r#   r&  r'  _start_tls_compatibler   _SendfileMode
TRY_NATIVE_sendfile_compatibler   r6  r[  r  r  r  r  r  ry  r   r  r{  r  r  r  r_  r  r  rJ   r+  r,  s   @r   r1   r1     s     $22==48$(/2'#LJK2*%%N:88	c 	d 	8>0)A"" r*   r1   c                   V     e Zd Zej                  Z	 	 d fd	Zd Zd ZddZ	d Z
 xZS )rB   c                 x   t         |   ||||       || _        d| _        | j                  j                  | j                  j                  |        | j                  j                  | j                  | j                  | j                         |,| j                  j                  t        j                  |d        y y r   )r   r   _address_buffer_sizerG  r^  rS  r}  rW   r  r[  r   r~  )r)   r   r2   r3   rC   r4   r,   r"   s          r   r   z#_SelectorDatagramTransport.__init__  s    tXu5

T^^;;TB

T--!]]D,<,<	>JJ  !E!E!'/ r*   c                     | j                   S r/   )r  rR   s    r   rH  z0_SelectorDatagramTransport.get_write_buffer_size  s       r*   c                    | j                   ry 	 | j                  j                  | j                        \  }}| j                  j                  ||       y # t        t        f$ r Y y t        $ r%}| j                  j                  |       Y d }~y d }~wt        t        f$ r  t        $ r}| j                  |d       Y d }~y d }~ww xY w)Nz&Fatal read error on datagram transport)r;  r  r   rp  rS  datagram_receivedra   r`   rg   error_receivedr   r   r   rf  r)   r\   r   r   s       r   r[  z&_SelectorDatagramTransport._read_ready  s    ??	9,,T]];JD$ NN,,T48  !12 	 	/NN))#..-. 	 	Mc#KLL	Ms)   (A C%C-BC(B??Cc                 Z   t        |t        t        t        f      s!t	        dt        |      j                        |sy | j                  r4|d | j                  fvrt        d| j                         | j                  }| j                  rT| j                  rH| j                  t        j                  k\  rt        j                  d       | xj                  dz  c_	        y | j                  sI	 | j                  d   r| j                   j#                  |       y | j                   j%                  ||       y | j                  jA                  t        |      |f       | xjB                  tE        |      z  c_!        | jG                          y # t&        t(        f$ r3 | j*                  j-                  | j.                  | j0                         Y t2        $ r%}| j4                  j7                  |       Y d }~y d }~wt8        t:        f$ r  t<        $ r}| j?                  |d       Y d }~y d }~ww xY w)Nr  z!Invalid address: must be None or r  r   rr   'Fatal write error on datagram transport)$r   r  r  r   r   r   r#   r  r   r;  r   r  r   r  r:  r1  r  rf   r   ra   r`   rG  r   r  _sendto_readyrg   rS  r  r   r   r   rf  rF  r  r   r  r  s       r   r   z!_SelectorDatagramTransport.sendto  s   $	: >? ##':#6#6"9; < <==D$--00 7GI I==D??t}})"M"MM@AOOq O||;;z*JJOOD)  JJ%%dD1 	U4[$/0SY&""$ $%56 J

&&t}}d6H6HI --c2 12   !!BDs0   -*F
 F
 
?H*H*G33H*H%%H*c                 X   | j                   r| j                   j                         \  }}| xj                  t        |      z  c_        	 | j                  d   r| j
                  j                  |       n| j
                  j                  ||       | j                   r| j%                          | j                   sD| j&                  j)                  | j*                         | j,                  r| j/                  d        y y y # t        t        f$ r> | j                   j                  ||f       | xj                  t        |      z  c_        Y t        $ r%}| j                  j                  |       Y d }~y d }~wt        t        f$ r  t         $ r}| j#                  |d       Y d }~y d }~ww xY w)Nrr   r  )r:  r  r  r   r1  r  rf   r   ra   r`   r  rg   rS  r  r   r   r   rf  r  rG  r   r  r<  r_  r  s       r   r  z(_SelectorDatagramTransport._sendto_ready  sQ   ll--/JD$T*;;z*JJOOD)JJ%%dD1 ll, 	##%||JJ%%dmm4}}**40   $%56 ''t5!!SY.! --c2 12   !!BDs,   	AC> >A
F)
F)E22F)F$$F)r%  r/   )r#   r&  r'  r8  r9  _buffer_factoryr   rH  r[  r   r  r+  r,  s   @r   rB   rB     s.    !''O59$(/!9 *%X1r*   rB   )&r(  __all__r8  rz   r   r  osr   rT   rq  r&   sslImportError r   r   r   r   r	   r
   r   r   logr   hasattrrx  sysconfr   rg   r   BaseEventLoopr   _FlowControlMixin	Transportr.  r1   DatagramTransportrB   rZ   r*   r   <module>r     s   #     	             v}}i0RZZ-

(IK55 IX_455#--_4DX1 Xvl1!3Z5Q5Q l1U%  
C$  s#   C& :C3 &C0/C03C=<C=