o [d@sXdZdZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z ddl m Z ddl m Z dd l mZdd l mZdd l mZdd l mZdd lmZddZGdddejejZGdddeejZGdddeejZGdddeZGdddeejZGdddeeejZ GdddeeejZ!Gddde j"Z#dS) 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. )BaseProactorEventLoopN) base_events) constants)futures) exceptions) protocols)sslproto) transports)trsock)loggercCst||jd<z ||jd<Wntjy(|jr&tj d|ddYnwd|jvrIz | |jd<WdStjyHd|jd<YdSwdS)Nsocketsocknamezgetsockname() failed on %rTexc_infopeername) r TransportSocket_extra getsocknamer error_loop get_debugr warning getpeername) transportsockr./usr/lib/python3.10/asyncio/proactor_events.py_set_socket_extras"  rcseZdZdZ  dfdd ZddZddZd d Zd d Zd dZ ddZ e j fddZ dddZddZddZddZZS)_ProactorBasePipeTransportz*Base class for pipe and socket transports.Ncst||||||_||||_d|_d|_d|_d|_ d|_ d|_ d|_ d|_ |jdur9|j|j|jj||durQ|jtj|ddSdS)NrF)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 _protocolconnection_mader_set_result_unless_cancelledselflooprprotocolwaiterextraserver __class__rrr!2s*     z#_ProactorBasePipeTransport.__init__cCs|jjg}|jdur|dn|jr|d|jdur(|d|j|jdur6|d|j|jdurD|d|j|jrR|dt |j|j rZ|dd d |S) Nclosedclosingzfd=zread=zwrite=zwrite_bufsize=z EOF writtenz<{}> ) r;__name__r#appendr+filenor'r(r&lenr-formatjoin)r4inforrr__repr__Is        z#_ProactorBasePipeTransport.__repr__cCs||jd<dS)Npipe)rr4rrrrr"[z%_ProactorBasePipeTransport._set_extracCs ||_dSNr0)r4r6rrrr$^ z'_ProactorBasePipeTransport.set_protocolcC|jSrJrKr4rrr get_protocolaz'_ProactorBasePipeTransport.get_protocolcCrMrJ)r+rNrrr is_closingdrPz%_ProactorBasePipeTransport.is_closingcCs`|jrdSd|_|jd7_|js|jdur|j|jd|jdur.|jd|_dSdS)NTr) r+r*r&r(rr/_call_connection_lostr'cancelrNrrrclosegs   z _ProactorBasePipeTransport.closecCs0|jdur|d|t|d|jdSdS)Nzunclosed transport )source)r#ResourceWarningrT)r4_warnrrr__del__rs z"_ProactorBasePipeTransport.__del__Fatal error on pipe transportc Csnz0t|tr|jrtjd||ddn|j||||jdW||dSW||dS||w)Nz%r: %sTr)message exceptionrr6) isinstanceOSErrorrrr debugcall_exception_handlerr0 _force_close)r4excrZrrr _fatal_errorws   z'_ProactorBasePipeTransport._fatal_errorcCs|jdur|js|dur|jdn|j||jr#|jr#dSd|_|jd7_|jr8|jd|_|j rC|j d|_ d|_ d|_ |j |j|dS)NTrr) _empty_waiterdone set_result set_exceptionr+r,r*r(rSr'r)r&rr/rR)r4rarrrr`s"    z'_ProactorBasePipeTransport._force_closec Cs|jrdSz6|j|Wt|jdr!|jdkr!|jtj|j d|_|j }|dur7| d|_ d|_dSt|jdrP|jdkrP|jtj|j d|_|j }|durf| d|_ d|_w)NshutdownT) r,r0connection_losthasattrr#rArgr SHUT_RDWRrTr%_detach)r4rar9rrrrRs,   z0_ProactorBasePipeTransport._call_connection_lostcCs"|j}|jdur|t|j7}|SrJ)r)r&rB)r4sizerrrget_write_buffer_sizes z0_ProactorBasePipeTransport.get_write_buffer_sizeNNN)rY)r? __module__ __qualname____doc__r!rFr"r$rOrQrTwarningswarnrXrbr`rRrn __classcell__rrr:rr.s  rcsXeZdZdZ  dfdd ZddZdd Zd d Zd d ZddZ dddZ Z S)_ProactorReadPipeTransportzTransport for read pipes.NcsDd|_d|_t||||||t||_|j|jd|_dS)NrhTF) _pending_data_length_pausedr r! bytearray_datarr/ _loop_reading)r4r5rr6r7r8r9 buffer_sizer:rrr!s   z#_ProactorReadPipeTransport.__init__cCs|j o|j SrJ)ryr+rNrrr is_readingsz%_ProactorReadPipeTransport.is_readingcCs4|js|jrdSd|_|jrtd|dSdS)NTz%r pauses reading)r+ryrrr r^rNrrr pause_readings  z(_ProactorReadPipeTransport.pause_readingcCs~|js|jsdSd|_|jdur|j|jd|j}d|_|dkr0|j|j|jd|||j r=t d|dSdS)NFrhz%r resumes reading) r+ryr'rr/r|rx_data_receivedr{rr r^)r4lengthrrrresume_readings   z)_ProactorReadPipeTransport.resume_readingc Cs~|jr td|z|j}Wn"ttfyty4}z | |dWYd}~dSd}~ww|s=| dSdS)Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.) rrr r^r0 eof_received SystemExitKeyboardInterrupt BaseExceptionrbrT)r4 keep_openrarrr _eof_receiveds   z(_ProactorReadPipeTransport._eof_receivedc Cs|jr|jdks J||_dS|dkr|dSt|jtjrMz t|j|WdStt fy4t yL}z | |dWYd}~dSd}~ww|j |dS)Nrhrz3Fatal error: protocol.buffer_updated() call failed.) ryrxrr\r0rBufferedProtocol_feed_data_to_buffered_protorrrrb data_received)r4datarrarrrrs(z)_ProactorReadPipeTransport._data_receivedc Csd}d}zza|durD|j|us|jdur|jsJd|_|r@|}|dkr8WW|dkr6|||dSdS|jd|}n||jrWWW|dkrU|||dSdS|jse|jj |j |j|_Wnbt y}z|jsx| |dn |jrtjdddWYd}~nId}~wty}z ||WYd}~n3d}~wty}z | |dWYd}~nd}~wtjy|jsƂYn w|js|j|jW|dkr|||dSdS|dkr|||ww)Nrhrz"Fatal read error on pipe transportz*Read error on pipe transport while closingTr)r'r+rdresultrr{rSryr _proactor recv_intor#ConnectionAbortedErrorrbrr r^ConnectionResetErrorr`r]rCancelledErroradd_done_callbackr|)r4futrrrarrrr|sh"  z(_ProactorReadPipeTransport._loop_reading)NNNrwrJ) r?rprqrrr!r~rrrrr|rurrr:rrvs rvcs^eZdZdZdZfddZddZddd Zd d Zd d Z ddZ ddZ ddZ Z S)_ProactorBaseWritePipeTransportzTransport for write pipes.Tcstj|i|d|_dSrJ)r r!rcr4argskwr:rrr!Ms z(_ProactorBaseWritePipeTransport.__init__cCst|tttfstdt|j|jrtd|j dur"td|s&dS|j r=|j t j kr4t d|j d7_ dS|jdurS|jdusIJ|jt|ddS|jsat||_|dS|j||dS)Nz/data argument must be a bytes-like object, not zwrite_eof() already calledz(unable to write; sendfile is in progresszsocket.send() raised exception.r)r)r\bytesrz memoryview TypeErrortyper?r- RuntimeErrorrcr*r!LOG_THRESHOLD_FOR_CONNLOST_WRITESr rr(r& _loop_writing_maybe_pause_protocolextend)r4rrrrwriteQs2        z%_ProactorBaseWritePipeTransport.writeNc Csz|dur|jdur|jrWdS||jusJd|_d|_|r#||dur-|j}d|_|sI|jr:|j|jd|jrD|j t j | n.|jj|j ||_|jsp|jdks_Jt||_|j|j|n|j|j|jdur|jdur|jdWdSWdSWdSty}z ||WYd}~dSd}~wty}z ||dWYd}~dSd}~ww)Nrz#Fatal write error on pipe transport)r(r+r)rr&rr/rRr-r#rgr SHUT_WR_maybe_resume_protocolrsendrdrBrrrrcrerr`r]rb)r4frrarrrrwsD     z-_ProactorBaseWritePipeTransport._loop_writingcCdSNTrrNrrr can_write_eofz-_ProactorBaseWritePipeTransport.can_write_eofcCs |dSrJ)rTrNrrr write_eofs z)_ProactorBaseWritePipeTransport.write_eofcC|ddSrJr`rNrrrabortrIz%_ProactorBaseWritePipeTransport.abortcCs:|jdur td|j|_|jdur|jd|jS)NzEmpty waiter is already set)rcrr create_futurer(rerNrrr_make_empty_waiters    z2_ProactorBaseWritePipeTransport._make_empty_waitercCs d|_dSrJ)rcrNrrr_reset_empty_waiterrLz3_ProactorBaseWritePipeTransport._reset_empty_waiterNN)r?rprqrr_start_tls_compatibler!rrrrrrrrurrr:rrGs  &)rcs$eZdZfddZddZZS)_ProactorWritePipeTransportcs8tj|i||jj|jd|_|j|jdS)N) r r!rrrecvr#r'r _pipe_closedrr:rrr!sz$_ProactorWritePipeTransport.__init__cCsx|rdS|dksJ|jr|jdusJdS||jus&J||jfd|_|jdur6|tdS|dS)N) cancelledrr+r'r(r`BrokenPipeErrorrT)r4rrrrrs  z(_ProactorWritePipeTransport._pipe_closed)r?rprqr!rrurrr:rrs rcs\eZdZdZ  dfdd ZddZddZd d Zdd d Zdd dZ dddZ Z S)_ProactorDatagramTransportiNcs>||_d|_tj|||||dt|_|j|j dS)N)r7r8) _addressrcr r! collectionsdequer&rr/r|)r4r5rr6addressr7r8r:rrr!s  z#_ProactorDatagramTransport.__init__cCt||dSrJrrHrrrr"rIz%_ProactorDatagramTransport._set_extracCstdd|jDS)Ncss|] \}}t|VqdSrJ)rB).0r_rrr szC_ProactorDatagramTransport.get_write_buffer_size..)sumr&rNrrrrnsz0_ProactorDatagramTransport.get_write_buffer_sizecCrrJrrNrrrrrIz _ProactorDatagramTransport.abortcCst|tttfstdt||sdS|jdur'|d|jfvr'td|j|jrA|jrA|jt j kr8t d|jd7_dS|j t||f|jdurT||dS)Nz,data argument must be bytes-like object (%r)z!Invalid address: must be None or z!socket.sendto() raised exception.r)r\rrzrrrr ValueErrorr*rrr rr&r@r(rr)r4raddrrrrsendtos&      z!_ProactorDatagramTransport.sendtoc Cs"zR|jrWdS||jusJd|_|r||jr |jr.|jr.|jr+|j|jdWdS|j \}}|jdurE|jj |j ||_n |jj j |j ||d|_Wn1tyk}z |j|WYd}~dSd}~wty}z ||dWYd}~dSd}~ww|j|j|dS)N)rz'Fatal write error on datagram transport)r*r(rr&rr+rr/rRpopleftrrr#rr]r0error_received Exceptionrbrrr)r4rrrrarrrrs<    z(_ProactorDatagramTransport._loop_writingc Csd}zz|jrWW|r|j||dSdS|j|us%|jdur#|js%Jd|_|durT|}|jrDd}WW|rB|j||dSdS|jdurP||j}}n|\}}|jrfWW|rd|j||dSdS|jdurw|jj |j |j |_n |jj |j |j |_Wn%t y}z |j|WYd}~nd}~wtjy|jsYn w|jdur|j|jW|r|j||dSdS|r|j||wwrJ)r*r0datagram_receivedr'r+rrrrrr#max_sizerecvfromr]rrrrr|)r4rrrresrarrrr| sf$    z(_ProactorDatagramTransport._loop_readingrorJ) r?rprqrr!r"rnrrrr|rurrr:rrs   !rc@s eZdZdZddZddZdS)_ProactorDuplexPipeTransportzTransport for duplex pipes.cCr)NFrrNrrrrQrz*_ProactorDuplexPipeTransport.can_write_eofcCstrJ)NotImplementedErrorrNrrrrTrz&_ProactorDuplexPipeTransport.write_eofN)r?rprqrrrrrrrrrLs rcsFeZdZdZejjZ  d fdd ZddZ ddZ d d Z Z S) _ProactorSocketTransportz Transport for connected sockets.Ncs$t||||||t|dSrJ)r r!r _set_nodelayr3r:rrr!_sz!_ProactorSocketTransport.__init__cCrrJrrHrrrr"drIz#_ProactorSocketTransport._set_extracCrrrrNrrrrgrz&_ProactorSocketTransport.can_write_eofcCs6|js|jrdSd|_|jdur|jtjdSdSr)r+r-r(r#rgr rrNrrrrjs  z"_ProactorSocketTransport.write_eofro) r?rprqrrr _SendfileMode TRY_NATIVE_sendfile_compatibler!r"rrrurrr:rrXsrcseZdZfddZ  d3ddZ d4dddddddd Z d3d d Z  d5d d Z  d5ddZ  d5ddZ fddZ ddZ ddZ ddZ ddZddZddZd d!Zd"d#Zd$d%Zd4d&d'Zd(d)Z * d6d+d,Zd-d.Zd/d0Zd1d2ZZS)7rcslttd|jj||_||_d|_i|_ | || t t ur4t|jdSdS)NzUsing proactor: %s)r r!r r^r;r?r _selector_self_reading_future_accept_futuresset_loop_make_self_pipe threadingcurrent_thread main_threadsignal set_wakeup_fd_csockrA)r4proactorr:rrr!ts  zBaseProactorEventLoop.__init__NcCt||||||SrJ)r)r4rr6r7r8r9rrr_make_socket_transport z,BaseProactorEventLoop._make_socket_transportF) server_sideserver_hostnamer8r9ssl_handshake_timeoutc Cs0tj||||||| d} t||| ||d| jS)N)rr8r9)r SSLProtocolr_app_transport) r4rawsockr6 sslcontextr7rrr8r9r ssl_protocolrrr_make_ssl_transportsz)BaseProactorEventLoop._make_ssl_transportcCrrJ)r)r4rr6rr7r8rrr_make_datagram_transportrz.BaseProactorEventLoop._make_datagram_transportcCt|||||SrJ)rr4rr6r7r8rrr_make_duplex_pipe_transportsz1BaseProactorEventLoop._make_duplex_pipe_transportcCrrJ)rvrrrr_make_read_pipe_transportsz/BaseProactorEventLoop._make_read_pipe_transportcCrrJ)rrrrr_make_write_pipe_transportsz0BaseProactorEventLoop._make_write_pipe_transportcsj|rtd|rdStturtd|| |j d|_ d|_ t dS)Nz!Cannot close a running event looprh) is_runningr is_closedrrrrr_stop_accept_futures_close_self_piperrTrr rNr:rrrTs  zBaseProactorEventLoop.closec|j||IdHSrJ)rr)r4rnrrr sock_recvzBaseProactorEventLoop.sock_recvcrrJ)rr)r4rbufrrrsock_recv_intorz$BaseProactorEventLoop.sock_recv_intocrrJ)rr)r4rrrrr sock_sendallrz"BaseProactorEventLoop.sock_sendallcrrJ)rconnect)r4rrrrr sock_connectrz"BaseProactorEventLoop.sock_connectcs|j|IdHSrJ)racceptrHrrr sock_acceptsz!BaseProactorEventLoop.sock_acceptc sz|}Wnttjfy}ztdd}~wwzt|j}Wn t y0tdw|r5|n|}|s;dSt |d}|rIt |||n|} t ||}d} z. t | ||}|dkrl| W| dkrk| |SS|j ||||IdH||7}| |7} qT| dkr| |ww)Nznot a regular filerl)rAAttributeErrorioUnsupportedOperationrSendfileNotAvailableErrorosfstatst_sizer]minseekrsendfile) r4rfileoffsetcountrAerrfsize blocksizeend_pos total_sentrrr_sock_sendfile_nativesD         z+BaseProactorEventLoop._sock_sendfile_nativecsn|}||IdHz|j|j|||ddIdHW||r*|SS||r6|ww)NF)fallback)r~rr sock_sendfiler#rr)r4transprrrrrrr_sendfile_natives    z&BaseProactorEventLoop._sendfile_nativecCsL|jdur |jd|_|jd|_|jd|_|jd8_dS)Nr)rrS_ssockrTr _internal_fdsrNrrrrs    z&BaseProactorEventLoop._close_self_pipecCs:t\|_|_|jd|jd|jd7_dS)NFr)r socketpairrr setblockingrrNrrrrs  z%BaseProactorEventLoop._make_self_pipec Csz|dur ||j|urWdS|j|jd}Wn/tjy%YdSttfy.t yI}z| d||dWYd}~dSd}~ww||_| |j dS)Niz.Error on reading from the event loop self pipe)rZr[r5) rrrrrrrrrrr_r_loop_self_reading)r4rrarrrr s( z(BaseProactorEventLoop._loop_self_readingcCsR|j}|dur dSz|dWdSty(|jr%tjdddYdSYdSw)Nz3Fail to write a null byte into the self-pipe socketTr)rrr]_debugr r^)r4csockrrr_write_to_self s  z$BaseProactorEventLoop._write_to_selfdcs(dfdd dS)Nc sJzE|dur7|\}}jrtd||}dur,j||dd|idn j||d|idr>WdSj}WnQt y}z7 dkrd d|t dnjrvtjd dd WYd}~dSWYd}~dSWYd}~dSd}~wtjyYdSw|j <|dS) Nz#%r got a new connection from %r: %rTr)rr8r9rrrhzAccept failed on a socket)rZr[r zAccept failed on socket %rr)rr"r r^rrrrrr]rAr_r rrTrrrr)rconnrr6rar5protocol_factoryr4r9rrrrrr56sR   z2BaseProactorEventLoop._start_serving..looprJ)r/)r4r(rrr9backlogrrr'r_start_serving2s%z$BaseProactorEventLoop._start_servingcCsdSrJr)r4 event_listrrr_process_events]sz%BaseProactorEventLoop._process_eventscCs&|jD]}|q|jdSrJ)rvaluesrSclear)r4futurerrrras z*BaseProactorEventLoop._stop_accept_futurescCs6|j|d}|r||j||dSrJ)rpoprArSr _stop_servingrT)r4rr/rrrr1fs   z#BaseProactorEventLoop._stop_servingrorJr)NNr%N)r?rprqr!rrrrrrrTrrrrrrrrrr r$r*r,rr1rurrr:rrrsP           +r)$rr__all__rr r rsrrrrrrrrr r r logr r_FlowControlMixin BaseTransportr ReadTransportrvWriteTransportrrDatagramTransportr Transportrr BaseEventLooprrrrrsX           n