
    Rhi                        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	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*                  ej,                        Z G d deej0                        Z G d deej4                        Z G d de      Z G d deej:                        Z G d deeej>                        Z  G d deeej>                        Z! G d de
jD                        Z#y)zEvent loop using a proactor and related classes.

A proactor is a "notify-on-completion" multiplexer.  Currently a
proactor is only implemented on Windows with IOCP.
)BaseProactorEventLoop    N   )base_events)	constants)futures)
exceptions)	protocols)sslproto)
transports)trsock)loggerc                    t        j                  |      | j                  d<   	 |j                         | j                  d<   d| j                  vr	 |j                         | j                  d<   y y # t        j
                  $ r5 | j                  j                         rt        j                  d|d       Y uw xY w# t        j
                  $ r d | j                  d<   Y y w xY w)Nsocketsocknamezgetsockname() failed on %rTexc_infopeername)r   TransportSocket_extragetsocknamer   error_loop	get_debugr   warninggetpeername)	transportsocks     ./usr/lib/python3.12/asyncio/proactor_events.py_set_socket_extrar      s    !'!7!7!=IXC'+'7'7'9	$ )))	0+/+;+;+=IZ( * << C??$$&NN,dTCC || 	0+/IZ(	0s$   A/ B: /AB76B7:"CCc                        e Zd 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 xZS )_ProactorBasePipeTransportz*Base class for pipe and socket transports.c                    t         |   ||       | j                  |       || _        | j	                  |       || _        d | _        d | _        d | _        d| _	        d| _
        d| _        d| _        d| _        | j
                  | j
                  j                          | j                  j!                  | j"                  j$                  |        |,| j                  j!                  t&        j(                  |d        y y )Nr   F)super__init__
_set_extra_sockset_protocol_server_buffer	_read_fut
_write_fut_pending_write
_conn_lost_closing_called_connection_lost_eof_written_attachr   	call_soon	_protocolconnection_mader   _set_result_unless_cancelledselfloopr   protocolwaiterextraserver	__class__s          r   r$   z#_ProactorBasePipeTransport.__init__2   s    %
(#',$!<<#LL  "

T^^;;TBJJ  !E!E!'/     c                    | j                   j                  g}| j                  |j                  d       n| j                  r|j                  d       | j                  ,|j                  d| j                  j                                 | j                  |j                  d| j                         | j                  |j                  d| j                         | j                  r'|j                  dt        | j                                | j                  r|j                  d       dj                  d	j                  |            S )
Nclosedclosingzfd=zread=zwrite=zwrite_bufsize=zEOF writtenz<{}> )r=   __name__r&   appendr.   filenor*   r+   r)   lenr0   formatjoin)r7   infos     r   __repr__z#_ProactorBasePipeTransport.__repr__I   s    ''(::KK!]]KK	"::!KK#djj//1234>>%KK%123??&KK& 345<<KK.T\\):(;<=KK&}}SXXd^,,r>   c                 "    || j                   d<   y )Npipe)r   r7   r   s     r   r%   z%_ProactorBasePipeTransport._set_extra[   s    "Fr>   c                     || _         y Nr3   )r7   r9   s     r   r'   z'_ProactorBasePipeTransport.set_protocol^   s	    !r>   c                     | j                   S rO   rP   r7   s    r   get_protocolz'_ProactorBasePipeTransport.get_protocola   s    ~~r>   c                     | j                   S rO   )r.   rR   s    r   
is_closingz%_ProactorBasePipeTransport.is_closingd   s    }}r>   c                 .   | j                   ry d| _         | xj                  dz  c_        | j                  s2| j                  &| j                  j                  | j                  d        | j                  "| j                  j                          d | _        y y )NTr   )	r.   r-   r)   r+   r   r2   _call_connection_lostr*   cancelrR   s    r   closez _ProactorBasePipeTransport.closeg   sq    ==1|| 7JJ  !;!;TB>>%NN!!#!DN &r>   c                 v    | j                   - |d| t        |        | j                   j                          y y )Nzunclosed transport )source)r&   ResourceWarningrY   )r7   _warns     r   __del__z"_ProactorBasePipeTransport.__del__r   s5    ::!'x0/$OJJ "r>   c                 0   	 t        |t              r4| j                  j                         rDt	        j
                  d| |d       n*| j                  j                  ||| | j                  d       | j                  |       y # | j                  |       w xY w)Nz%r: %sTr   )message	exceptionr   r9   )	
isinstanceOSErrorr   r   r   debugcall_exception_handlerr3   _force_close)r7   excr`   s      r   _fatal_errorz'_ProactorBasePipeTransport._fatal_errorw   sy    	##w'::'')LL44H

11&!$!% $	3  c"Dc"s   A.B Bc                 H   | j                   S| j                   j                         s9|| j                   j                  d        n| j                   j                  |       | j                  r| j
                  ry d| _        | xj                  dz  c_        | j                  r!| j                  j                          d | _        | j                  r!| j                  j                          d | _	        d| _
        d | _        | j                  j                  | j                  |       y )NTr   r   )_empty_waiterdone
set_resultset_exceptionr.   r/   r-   r+   rX   r*   r,   r)   r   r2   rW   )r7   rg   s     r   rf   z'_ProactorBasePipeTransport._force_close   s    )$2D2D2I2I2K{""--d3""005==T991??OO""$"DO>>NN!!#!DN

T77=r>   c                    | j                   ry 	 | j                  j                  |       t        | j                  d      rF| j                  j                         dk7  r)| j                  j                  t        j                         | j                  j                          d | _        | j                  }||j                          d | _
        d| _         y # t        | j                  d      rF| j                  j                         dk7  r)| j                  j                  t        j                         | j                  j                          d | _        | j                  }||j                          d | _
        d| _         w xY w)NshutdownT)r/   r3   connection_losthasattrr&   rE   ro   r   	SHUT_RDWRrY   r(   _detach)r7   rg   r<   s      r   rW   z0_ProactorBasePipeTransport._call_connection_lost   s   ''	0NN**3/ tzz:.4::3D3D3F"3L

##F$4$45JJDJ\\F! #+/D( tzz:.4::3D3D3F"3L

##F$4$45JJDJ\\F! #+/D(s   C B+E?c                 f    | j                   }| j                  |t        | j                        z  }|S rO   )r,   r)   rF   )r7   sizes     r   get_write_buffer_sizez0_ProactorBasePipeTransport.get_write_buffer_size   s/    ""<<#C%%Dr>   NNN)zFatal error on pipe transport)rC   
__module____qualname____doc__r$   rJ   r%   r'   rS   rU   rY   warningswarnr^   rh   rf   rW   rw   __classcell__r=   s   @r   r!   r!   .   sQ    448$(/.-$#"	" %MM 
#>(0(r>   r!   c                   N     e Zd ZdZ	 	 d	 fd	Zd Zd Zd Zd Zd Z	d
dZ
 xZS )_ProactorReadPipeTransportzTransport for read pipes.c                     d| _         d| _        t        |   ||||||       t	        |      | _        | j                  j                  | j                         d| _        y )Nrp   TF)	_pending_data_length_pausedr#   r$   	bytearray_datar   r2   _loop_reading)	r7   r8   r   r9   r:   r;   r<   buffer_sizer=   s	           r   r$   z#_ProactorReadPipeTransport.__init__   sT    $&!tXvufE{+


T//0r>   c                 :    | j                    xr | j                   S rO   )r   r.   rR   s    r   
is_readingz%_ProactorReadPipeTransport.is_reading   s    <<5$55r>   c                     | j                   s| j                  ry d| _        | j                  j                         rt	        j
                  d|        y y )NTz%r pauses reading)r.   r   r   r   r   rd   rR   s    r   pause_readingz(_ProactorReadPipeTransport.pause_reading   s?    ==DLL ::!LL,d3 "r>   c                    | j                   s| j                  sy d| _        | j                  &| j                  j	                  | j
                  d        | j                  }d| _        |dkD  r4| j                  j	                  | j                  | j                  d | |       | j                  j                         rt        j                  d|        y y )NFrp   z%r resumes reading)r.   r   r*   r   r2   r   r   _data_receivedr   r   r   rd   )r7   lengths     r   resume_readingz)_ProactorReadPipeTransport.resume_reading   s    ==>>!JJ  !3!3T:**$&!B; JJ  !4!4djj&6I6R::!LL-t4 "r>   c                 .   | j                   j                         rt        j                  d|        	 | j                  j                         }|s| j                          y 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.)r   r   r   rd   r3   eof_received
SystemExitKeyboardInterruptBaseExceptionrh   rY   )r7   	keep_openrg   s      r   _eof_receivedz(_ProactorReadPipeTransport._eof_received   s    ::!LL*D1	335I JJL  -. 	 	HJ	s   A   B8BBc                    | j                   r| j                  dk(  sJ || _        y |dk(  r| j                          y t        | j                  t
        j                        r"	 t        j                  | j                  |       y | j                  j                  |       y # t        t        f$ r  t        $ r}| j                  |d       Y d }~y d }~ww xY w)Nrp   r   z3Fatal error: protocol.buffer_updated() call failed.)r   r   r   rb   r3   r	   BufferedProtocol_feed_data_to_buffered_protor   r   r   rh   data_received)r7   datar   rg   s       r   r   z)_ProactorReadPipeTransport._data_received   s    << ,,222(.D%Q; dnni&@&@A66t~~tL NN((.  12   !!##12 	s   ! B C6CCc                    d}d }	 || j                   |u s| j                   | j                  sJ d | _         |j                         rQ|j                         }|dk(  r	 |dkD  r| j	                  ||       y y t        t        | j                        d |       }n|j                          | j                  r	 |dkD  r| j	                  ||       y y | j                  s?| j                  j                  j                  | j                  | j                        | _         | j                  s&| j                   j                  | j                         	 |dkD  r| j	                  ||       y y # t         $ rZ}| j                  s| j#                  |d       n1| j                  j%                         rt'        j(                  dd       Y d }~wd }~wt*        $ r}| j-                  |       Y d }~d }~wt.        $ r}| j#                  |d       Y d }~d }~wt0        j2                  $ r | j                  s Y w xY w# |dkD  r| j	                  ||       w w xY w)Nrp   r   z"Fatal read error on pipe transportz*Read error on pipe transport while closingTr   )r*   r.   rk   resultr   bytes
memoryviewr   rX   r   r   	_proactor	recv_intor&   add_done_callbackr   ConnectionAbortedErrorrh   r   r   rd   ConnectionResetErrorrf   rc   r   CancelledError)r7   futr   r   rg   s        r   r   z(_ProactorReadPipeTransport._loop_reading  s   .	2~~,1G15@ @!%88: ZZ\F{F {##D&1 A !DJJ!7!@AD JJL}}2 {##D&1 ) <<!%!5!5!?!?

DJJ!W <<001C1CD{##D&1 # & 	,==!!#'KL%%'I&*,# 	#c"" 	Ic#GHH(( 	== !	 {##D&1 sn   AE$ 6>E$ AE$ 2H0 $	H--AG=H0 H-G$H0 $H-0HH0 #H-*H0 ,H--H0 0I
)NNNi   rO   )rC   ry   rz   r{   r$   r   r   r   r   r   r   r~   r   s   @r   r   r      s/    #486;64&5$ /212r>   r   c                   R     e Zd ZdZdZ fdZd ZddZd Zd Z	d Z
d	 Zd
 Z xZS )_ProactorBaseWritePipeTransportzTransport for write pipes.Tc                 2    t        |   |i | d | _        y rO   )r#   r$   rj   r7   argskwr=   s      r   r$   z(_ProactorBaseWritePipeTransport.__init__N  s    $%"%!r>   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                  *| j                   J | j#                  t        |             y | j                   s!t        |      | _        | j%                          y | j                   j'                  |       | j%                          y )Nz/data argument must be a bytes-like object, not zwrite_eof() already calledz(unable to write; sendfile is in progresszsocket.send() raised exception.r   )r   )rb   r   r   r   	TypeErrortyperC   r0   RuntimeErrorrj   r-   r   !LOG_THRESHOLD_FOR_CONNLOST_WRITESr   r   r+   r)   _loop_writing_maybe_pause_protocolextend)r7   r   s     r   writez%_ProactorBaseWritePipeTransport.writeR  s   $	: >?Dz**+-. . ;<<)IJJ??)"M"MM@AOOq O ??"<<'''E$K0$T?DL&&( LL%&&(r>   c                 N   	 || j                   | j                  ry || j                   u sJ d | _         d| _        |r|j                          || j                  }d | _        |sx| j                  r&| j
                  j                  | j                  d        | j                  r)| j                  j                  t        j                         | j                          n| j
                  j                  j                  | j                  |      | _         | j                   j!                         sW| j                  dk(  sJ t#        |      | _        | j                   j%                  | j&                         | j)                          n%| j                   j%                  | j&                         | j*                  )| j                   | j*                  j-                  d        y y y # t.        $ r}| j1                  |       Y d }~y d }~wt2        $ r}| j5                  |d       Y d }~y d }~ww xY w)Nr   z#Fatal write error on pipe transport)r+   r.   r,   r   r)   r   r2   rW   r0   r&   ro   r   SHUT_WR_maybe_resume_protocolr   sendrk   rF   r   r   r   rj   rl   r   rf   rc   rh   )r7   fr   rg   s       r   r   z-_ProactorBaseWritePipeTransport._loop_writingx  s   &	J}!8T]] '''"DO"#D
|||#==JJ(()C)CTJ$$JJ''7 ++-"&**"6"6";";DJJ"M++-..!333*-d)D'OO55d6H6HI..0OO55d6H6HI!!-$//2I""--d3 3J-# 	#c"" 	Jc#HII	Js)   G F=G 	H$&G<<H$HH$c                      yNT rR   s    r   can_write_eofz-_ProactorBaseWritePipeTransport.can_write_eof      r>   c                 $    | j                          y rO   )rY   rR   s    r   	write_eofz)_ProactorBaseWritePipeTransport.write_eof  s    

r>   c                 &    | j                  d        y rO   rf   rR   s    r   abortz%_ProactorBaseWritePipeTransport.abort      $r>   c                     | j                   t        d      | j                  j                         | _         | j                  | j                   j                  d        | j                   S )NzEmpty waiter is already set)rj   r   r   create_futurer+   rl   rR   s    r   _make_empty_waiterz2_ProactorBaseWritePipeTransport._make_empty_waiter  sY    )<==!ZZ557??"))$/!!!r>   c                     d | _         y rO   )rj   rR   s    r   _reset_empty_waiterz3_ProactorBaseWritePipeTransport._reset_empty_waiter  s
    !r>   NN)rC   ry   rz   r{   _start_tls_compatibler$   r   r   r   r   r   r   r   r~   r   s   @r   r   r   H  s7    $ "$)L'JR ""r>   r   c                   $     e Zd Z fdZd Z xZS )_ProactorWritePipeTransportc                     t        |   |i | | j                  j                  j	                  | j
                  d      | _        | j                  j                  | j                         y )N   )	r#   r$   r   r   recvr&   r*   r   _pipe_closedr   s      r   r$   z$_ProactorWritePipeTransport.__init__  sO    $%"%--224::rB(():):;r>   c                 B   |j                         ry |j                         dk(  sJ | j                  r| j                  J y || j                  u sJ || j                  f       d | _        | j                  | j                  t                      y | j                          y )Nr>   )	cancelledr   r.   r*   r+   rf   BrokenPipeErrorrY   )r7   r   s     r   r   z(_ProactorWritePipeTransport._pipe_closed  s    ==?zz|s"""==>>)))dnn$;sDNN&;;$??&o/0JJLr>   )rC   ry   rz   r$   r   r~   r   s   @r   r   r     s    <
r>   r   c                   R     e Zd ZdZ	 	 d	 fd	Zd Zd Zd Zd
dZd
dZ	d
dZ
 xZS )_ProactorDatagramTransporti   c                     || _         d | _        d| _        t        |   |||||       t        j                         | _        | j                  j                  | j                         y )Nr   )r:   r;   )_addressrj   _buffer_sizer#   r$   collectionsdequer)   r   r2   r   )r7   r8   r   r9   addressr:   r;   r=   s          r   r$   z#_ProactorDatagramTransport.__init__  s^    ! 	tXfEJ #((*

T//0r>   c                     t        | |       y rO   r   rM   s     r   r%   z%_ProactorDatagramTransport._set_extra      $%r>   c                     | j                   S rO   )r   rR   s    r   rw   z0_ProactorDatagramTransport.get_write_buffer_size  s       r>   c                 &    | j                  d        y rO   r   rR   s    r   r   z _ProactorDatagramTransport.abort  r   r>   c                 r   t        |t        t        t        f      st	        dt        |            |sy | j                  (|d | j                  fvrt        d| j                         | j                  rT| j                  rH| j                  t        j                  k\  rt        j                  d       | xj                  dz  c_        y | j                  j                  t        |      |f       | xj                  t!        |      z  c_        | j"                  | j%                          | j'                          y )Nz,data argument must be bytes-like object (%r)z!Invalid address: must be None or z!socket.sendto() raised exception.r   )rb   r   r   r   r   r   r   
ValueErrorr-   r   r   r   r   r)   rD   r   rF   r+   r   r   )r7   r   addrs      r   sendtoz!_ProactorDatagramTransport.sendto  s    $	: >?J J( ( ==$dDMM5J)J3DMM?CE E ??t}})"M"MMBCOOq O 	U4[$/0SY&??"  	""$r>   c                    	 | j                   ry || j                  u sJ d | _        |r|j                          | j                  r| j                   r?| j                  r3| j
                  r&| j                  j                  | j                  d        y | j                  j                         \  }}| xj                  t        |      z  c_
        | j                  6| j                  j                  j                  | j                  |      | _        n7| j                  j                  j                  | j                  ||      | _        | j                  j!                  | j"                         | j%                          y # t&        $ r%}| j(                  j+                  |       Y d }~y d }~wt,        $ r}| j/                  |d       Y d }~y d }~ww xY w)N)r   z'Fatal write error on datagram transport)r-   r+   r   r)   r   r.   r   r2   rW   popleftr   rF   r   r   r&   r   r   r   r   rc   r3   error_received	Exceptionrh   )r7   r   r   r   rg   s        r   r   z(_ProactorDatagramTransport._loop_writing  sd   	*$//)))"DO

<<DOO==JJ(()C)CTJ--/JD$T*}}("&**"6"6";";DJJ<@#B #'**"6"6"="=djj>BCG #> #I OO--d.@.@A'')  	/NN))#.. 	Nc#LMM	Ns0   E9 A?E9 B4E9 9	G
F""G
.GG
c                    d }	 | j                   r!	 |r| j                  j                  |       y y | j                  |u s| j                  | j                  sJ d | _        |_|j                         }| j                  r#d }	 |r| j                  j                  |       y y | j                  || j                  }}n|\  }}| j                   r!	 |r| j                  j                  |       y y | j                  @| j                  j                  j                  | j                  | j                        | _        n?| j                  j                  j                  | j                  | j                        | _        | j                  &| j                  j                  | j                         	 |r| j                  j                  |       y y # t        $ r%}| j                  j!                  |       Y d }~Id }~wt"        j$                  $ r | j                  s Y nw xY w# |r| j                  j                  |       w w xY wrO   )r-   r3   datagram_receivedr*   r.   r   r   r   r   r   r&   max_sizerecvfromr   r   rc   r   r   r   )r7   r   r   r   resrg   s         r   r   z(_ProactorDatagramTransport._loop_reading$  s   '	=H 00t< E >>S(T^^-C-1]]< < "DNjjl==D0 00t< - ==,!$dmm$D!$JD$  00t<  }}(!%!5!5!:!:4::;?=="J "&!5!5!>!>tzz?C}}"N ~~)001C1CD00t<   	/NN))#..(( 	== !	 00t< sN   G AG !,G .BG 92H 	HG4/H 4#HH HH !H>rx   rO   )rC   ry   rz   r   r$   r%   rw   r   r   r   r   r~   r   s   @r   r   r     s2    H59$(1&! %: *D)=r>   r   c                       e Zd ZdZd Zd Zy)_ProactorDuplexPipeTransportzTransport for duplex pipes.c                      y)NFr   rR   s    r   r   z*_ProactorDuplexPipeTransport.can_write_eofU  s    r>   c                     t         rO   )NotImplementedErrorrR   s    r   r   z&_ProactorDuplexPipeTransport.write_eofX  s    !!r>   N)rC   ry   rz   r{   r   r   r   r>   r   r   r   P  s     &"r>   r   c                   f     e Zd ZdZej
                  j                  Z	 	 d fd	Zd Z	d Z
d Z xZS )_ProactorSocketTransportz Transport for connected sockets.c                 X    t         |   ||||||       t        j                  |       y rO   )r#   r$   r   _set_nodelayr6   s          r   r$   z!_ProactorSocketTransport.__init__c  s(    tXvufE  &r>   c                     t        | |       y rO   r   rM   s     r   r%   z#_ProactorSocketTransport._set_extrah  r   r>   c                      yr   r   rR   s    r   r   z&_ProactorSocketTransport.can_write_eofk  r   r>   c                     | j                   s| j                  ry d| _        | j                  *| j                  j	                  t
        j                         y y r   )r.   r0   r+   r&   ro   r   r   rR   s    r   r   z"_ProactorSocketTransport.write_eofn  sA    ==D-- ??"JJ/ #r>   rx   )rC   ry   rz   r{   r   _SendfileMode
TRY_NATIVE_sendfile_compatibler$   r%   r   r   r~   r   s   @r   r   r   \  s4     +$22==48$('
&0r>   r   c                        e Zd Z fdZ	 	 ddZ	 dddddddddZ	 ddZ	 	 d dZ	 	 d d	Z	 	 d d
Z	 fdZ
d Zd Zd Zd!dZd Zd Zd Zd Zd Zd Zd Zd ZddZd Z	 	 	 d"dZd Zd Zd Z xZS )#r   c                    t         |           t        j                  d|j                  j
                         || _        || _        d | _        i | _	        |j                  |        | j                          t        j                         t        j                         u r.t        j                   | j"                  j%                                y y )NzUsing proactor: %s)r#   r$   r   rd   r=   rC   r   	_selector_self_reading_future_accept_futuresset_loop_make_self_pipe	threadingcurrent_threadmain_threadsignalset_wakeup_fd_csockrE   )r7   proactorr=   s     r   r$   zBaseProactorEventLoop.__init__x  s    )8+=+=+F+FG!!$(!!$##%)>)>)@@  !3!3!56 Ar>   Nc                 "    t        | |||||      S rO   )r   )r7   r   r9   r:   r;   r<   s         r   _make_socket_transportz,BaseProactorEventLoop._make_socket_transport  s    'dHf(-v7 	7r>   F)server_sideserver_hostnamer;   r<   ssl_handshake_timeoutssl_shutdown_timeoutc          
      t    t        j                  | ||||||	|
      }t        | ||||       |j                  S )N)r  r  r;   r<   )r
   SSLProtocolr   _app_transport)r7   rawsockr9   
sslcontextr:   r  r  r;   r<   r  r  ssl_protocols               r   _make_ssl_transportz)BaseProactorEventLoop._make_ssl_transport  sI      ++h
F_&;%9	;
 	!w',V	=***r>   c                 "    t        | |||||      S rO   )r   )r7   r   r9   r   r:   r;   s         r   _make_datagram_transportz.BaseProactorEventLoop._make_datagram_transport  s    )$h*0%9 	9r>   c                      t        | ||||      S rO   )r   r7   r   r9   r:   r;   s        r   _make_duplex_pipe_transportz1BaseProactorEventLoop._make_duplex_pipe_transport  s    +D,0(FEK 	Kr>   c                      t        | ||||      S rO   )r   r  s        r   _make_read_pipe_transportz/BaseProactorEventLoop._make_read_pipe_transport  s    )$hNNr>   c                      t        | ||||      S rO   )r   r  s        r   _make_write_pipe_transportz0BaseProactorEventLoop._make_write_pipe_transport  s     +4+/65J 	Jr>   c                    | j                         rt        d      | j                         ry t        j                         t        j
                         u rt        j                  d       | j                          | j                          | j                  j                          d | _
        d | _        t        | -          y )Nz!Cannot close a running event looprp   )
is_runningr   	is_closedr  r  r	  r
  r  _stop_accept_futures_close_self_piper   rY   r  r#   )r7   r=   s    r   rY   zBaseProactorEventLoop.close  s    ??BCC>>##%)>)>)@@  $ 	!!# 	r>   c                 V   K   | j                   j                  ||       d {   S 7 wrO   )r   r   )r7   r   ns      r   	sock_recvzBaseProactorEventLoop.sock_recv  s#     ^^((q1111    )')c                 V   K   | j                   j                  ||       d {   S 7 wrO   )r   r   )r7   r   bufs      r   sock_recv_intoz$BaseProactorEventLoop.sock_recv_into  s#     ^^--dC8888r-  c                 V   K   | j                   j                  ||       d {   S 7 wrO   )r   r   )r7   r   bufsizes      r   sock_recvfromz#BaseProactorEventLoop.sock_recvfrom  s#     ^^,,T7;;;;r-  c                 r   K   |st        |      }| j                  j                  |||       d {   S 7 wrO   )rF   r   recvfrom_into)r7   r   r/  nbytess       r   sock_recvfrom_intoz(BaseProactorEventLoop.sock_recvfrom_into  s1     XF^^11$VDDDDs   .757c                 V   K   | j                   j                  ||       d {   S 7 wrO   )r   r   )r7   r   r   s      r   sock_sendallz"BaseProactorEventLoop.sock_sendall  s#     ^^((t4444r-  c                 Z   K   | j                   j                  ||d|       d {   S 7 w)Nr   )r   r   )r7   r   r   r   s       r   sock_sendtoz!BaseProactorEventLoop.sock_sendto  s'     ^^**4q'BBBBs   "+)+c                 V   K   | j                   j                  ||       d {   S 7 wrO   )r   connect)r7   r   r   s      r   sock_connectz"BaseProactorEventLoop.sock_connect  s#     ^^++D'::::r-  c                 T   K   | j                   j                  |       d {   S 7 wrO   )r   acceptrM   s     r   sock_acceptz!BaseProactorEventLoop.sock_accept  s!     ^^**40000s   (&(c                   K   	 |j                         }	 t        j                  |      j                  }|r|n|}|syt        |d      }|rt        ||z   |      n|}	t        ||      }d}
	 	 t        |	|z
  |      }|dk  r|
|
dkD  r|j                  |       S S | j                  j                  ||||       d {    ||z  }|
|z  }
^# t        t        j                  f$ r}t	        j
                  d      d }~ww xY w# t        $ r t	        j
                  d      w xY w7 g# |
dkD  r|j                  |       w w xY ww)Nznot a regular filer   l    )rE   AttributeErrorioUnsupportedOperationr   SendfileNotAvailableErrorosfstatst_sizerc   minseekr   sendfile)r7   r   fileoffsetcountrE   errfsize	blocksizeend_pos
total_sents              r   _sock_sendfile_nativez+BaseProactorEventLoop._sock_sendfile_native  s_    	M[[]F	MHHV$,,E #E		;/	05#fune,5VU#

	"& 0)<	>%
 A~		&! 	 nn--dD&)LLL)#i'
   7 78 	M667KLL	M  	M667KLL	M M A~		&! sh   E C
 D  6E +D$ E !D$ :D";D$ 
C=#C88C==E  DE "D$ $D==E c                 j  K   |j                         }|j                          |j                          d {    	 | j                  |j                  |||d       d {   |j                          |r|j                          S S 7 P7 )# |j                          |r|j                          w w xY ww)NF)fallback)r   r   r   sock_sendfiler&   r   r   )r7   transprM  rN  rO  r   s         r   _sendfile_nativez&BaseProactorEventLoop._sendfile_native  s     **,'')))	(++FLL$5: , < < &&(%%'  	*< &&(%%' s8   4B3BB3#B B	 B #%B3	B %B00B3c                    | j                   !| j                   j                          d | _         | j                  j                          d | _        | j                  j                          d | _        | xj
                  dz  c_        y )Nr   )r  rX   _ssockrY   r  _internal_fdsrR   s    r   r)  z&BaseProactorEventLoop._close_self_pipe  sg    $$0%%,,.(,D%ar>   c                     t        j                         \  | _        | _        | j                  j	                  d       | j                  j	                  d       | xj
                  dz  c_        y )NFr   )r   
socketpairr\  r  setblockingr]  rR   s    r   r  z%BaseProactorEventLoop._make_self_pipe  sN    #)#4#4#6 T[&&ar>   c                 t   	 ||j                          | j                  |ury | j                  j                  | j                  d      }|| _        |j                  | j                         y # t        j                  $ r Y y t        t        f$ r  t        $ r}| j                  d|| d       Y d }~y d }~ww xY w)Ni   z.Error on reading from the event loop self pipe)r`   ra   r8   )r   r  r   r   r\  r   _loop_self_readingr   r   r   r   r   re   )r7   r   rg   s      r   rb  z(BaseProactorEventLoop._loop_self_reading  s    	9}
((1 ##DKK6A )*D% 7 78 (( 	-. 	 	''K )  	s"    A, &A, ,B7B7B22B7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 socketTr   )r  r   rc   _debugr   rd   )r7   csocks     r   _write_to_selfz$BaseProactorEventLoop._write_to_self2  sU     =	,JJu 	,{{ 0&*, 	,s   # ,AAc           	      P     d fd	 j                         y )Nc           
         	 | s| j                         \  }}j                  rt        j                  d||               }j	                  ||dd|i
       nj                  ||d|i       j                         ry j                  j                  	      } | j                  	j                         <   | j                         y # t        $ r}	j                         dk7  r9j                  d|t        j                  	      d       	j!                          n.j                  rt        j                  d		d
       Y d }~y Y d }~y Y d }~y d }~wt"        j$                  $ r 	j!                          Y y w xY w)Nz#%r got a new connection from %r: %rTr   )r  r;   r<   r  r  r  rp   zAccept failed on a socket)r`   ra   r   zAccept failed on socket %rr   )r   re  r   rd   r  r  r'  r   r@  r  rE   r   rc   re   r   r   rY   r   r   )r   connr   r9   rg   r8   protocol_factoryr7   r<   r   r  r  r  s        r   r8   z2BaseProactorEventLoop._start_serving.<locals>.loopI  sw   #*=!"JD${{%J%+T49/1H!-00 (JD#-t"4V2G1E	 1 G 33 (#-t"4V 4 E >>#NN))$/ 78$$T[[]3##D)  
6;;=B&//#>%("("8"8">1 
 JJL[[LL!=!%6 6 ! ! ,, 

s%   BC 	C 	FA0E&FFrO   )r2   )	r7   rk  r   r  r<   backlogr  r  r8   s	   ````` ``@r   _start_servingz$BaseProactorEventLoop._start_servingD  s    
$	* $	*L 	tr>   c                      y rO   r   )r7   
event_lists     r   _process_eventsz%BaseProactorEventLoop._process_eventsq  s    r>   c                     | j                   j                         D ]  }|j                           | j                   j                          y rO   )r  valuesrX   clear)r7   futures     r   r(  z*BaseProactorEventLoop._stop_accept_futuresu  s;    **113 	FMMO	""$r>   c                     | j                   j                  |j                         d       }|r|j                          | j                  j                  |       |j                          y rO   )r  poprE   rX   r   _stop_servingrY   )r7   r   rt  s      r   rw  z#BaseProactorEventLoop._stop_servingz  sG    %%))$++->MMO$$T*

r>   rx   rO   r   )r   )NNd   NN)rC   ry   rz   r$   r  r  r  r   r"  r$  rY   r,  r0  r3  r7  r9  r;  r>  rA  rU  rZ  r)  r  rb  rg  rm  rp  r(  rw  r~   r   s   @r   r   r   v  s    7 =A267 9=+ $t"&!%+  CG9
 BF*.K
 @D(,O AE)-J(29<E5C;1":
(  98,& >A-1,0+Z%
r>   r   )$r{   __all__rD  rG  r   r|   r
  r  r    r   r   r   r   r	   r
   r   r   logr   r   _FlowControlMixinBaseTransportr!   ReadTransportr   WriteTransportr   r   DatagramTransportr   	Transportr   r   BaseEventLoopr   r   r>   r   <module>r     s   # 	 	              0$D!=!=!+!9!9DNP2!;!+!9!9P2fk"&@&0&?&?k"\"A ,A=!;!+!=!=A=H	"#=#B#-#7#7	"09>)3304IK55 Ir>   