U e5d<}ã@sTdZdZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl m Z ddl m Z ddl m Z dd l mZdd l mZdd l mZdd l mZdd lmZdd„ZGdd„dejejƒZGdd„deejƒZGdd„deejƒZGdd„deƒZGdd„deƒZGdd„deeejƒZGdd„deeejƒZ Gdd„de j!ƒZ"dS) z¦Event 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)ÚloggercCs–t |¡|jd<z| ¡|jd<Wn0tjk rR|j ¡rNtj d|dd�YnXd|jkr’z|  ¡|jd<Wn tjk r�d|jd<YnXdS)NÚsocketZsocknamezgetsockname() failed on %rT©Úexc_infoÚpeername) r ÚTransportSocketÚ_extraZ getsocknamer ÚerrorÚ_loopÚ get_debugr ÚwarningZ getpeername)Ú transportÚsock©rú//usr/lib64/python3.8/asyncio/proactor_events.pyÚ_set_socket_extras ÿ  rcs‚eZdZdZd‡fdd„ Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z e j fdd„Z ddd„Zdd„Zdd„Zdd„Z‡ZS)Ú_ProactorBasePipeTransportz*Base class for pipe and socket transports.Ncsœtƒ ||¡| |¡||_| |¡||_d|_d|_d|_d|_ d|_ d|_ d|_ |jdk rl|j  ¡|j |jj|¡|dk r˜|j tj|d¡dS)NrF)ÚsuperÚ__init__Ú _set_extraÚ_sockÚ set_protocolÚ_serverÚ_bufferÚ _read_futÚ _write_futÚ_pending_writeÚ _conn_lostÚ_closingÚ _eof_writtenZ_attachrÚ call_soonÚ _protocolZconnection_maderZ_set_result_unless_cancelled©ÚselfÚlooprÚprotocolÚwaiterÚextraÚserver©Ú __class__rrr2s(     ÿz#_ProactorBasePipeTransport.__init__cCsÄ|jjg}|jdkr | d¡n|jr0| d¡|jdk rP| d|j ¡›�¡|jdk rl| d|j›�¡|jdk rˆ| d|j›�¡|jr¤| dt |jƒ›�¡|j r´| d¡d  d   |¡¡S) NÚclosedÚclosingzfd=zread=zwrite=zwrite_bufsize=z EOF writtenz<{}>ú ) r4Ú__name__r Úappendr(Úfilenor$r%r#Úlenr)ÚformatÚjoin)r-ÚinforrrÚ__repr__Hs         z#_ProactorBasePipeTransport.__repr__cCs||jd<dS)NÚpipe)r©r-rrrrrZsz%_ProactorBasePipeTransport._set_extracCs ||_dS©N©r+)r-r/rrrr!]sz'_ProactorBasePipeTransport.set_protocolcCs|jSrBrC©r-rrrÚ get_protocol`sz'_ProactorBasePipeTransport.get_protocolcCs|jSrB)r(rDrrrÚ is_closingcsz%_ProactorBasePipeTransport.is_closingcCs\|jr dSd|_|jd7_|js>|jdkr>|j |jd¡|jdk rX|j ¡d|_dS)NTr) r(r'r#r%rr*Ú_call_connection_lostr$ÚcancelrDrrrÚclosefs  z _ProactorBasePipeTransport.closecCs*|jdk r&|d|›�t|d�| ¡dS)Nzunclosed transport )Úsource)r ÚResourceWarningrI)r-Z_warnrrrÚ__del__qs z"_ProactorBasePipeTransport.__del__úFatal error on pipe transportc CsVzDt|tƒr*|j ¡rBtjd||dd�n|j ||||jdœ¡W5| |¡XdS)Nz%r: %sTr)ÚmessageÚ exceptionrr/) Ú _force_closeÚ isinstanceÚOSErrorrrr ÚdebugÚcall_exception_handlerr+)r-ÚexcrNrrrÚ _fatal_errorvs  ü z'_ProactorBasePipeTransport._fatal_errorcCs |jdk r6|j ¡s6|dkr*|j d¡n |j |¡|jr@dSd|_|jd7_|jrj|j ¡d|_|jr€|j ¡d|_d|_ d|_ |j   |j |¡dS)NTrr)Ú _empty_waiterÚdoneÚ set_resultZ set_exceptionr(r'r%rHr$r&r#rr*rG)r-rUrrrrP…s"   z'_ProactorBasePipeTransport._force_closec Cs^z|j  |¡W5t|jdƒr,|j tj¡|j ¡d|_|j}|dk rX| ¡d|_XdS)NÚshutdown) Úhasattrr rZr Z SHUT_RDWRrIr"Z_detachr+Zconnection_lost)r-rUr2rrrrG™s  z0_ProactorBasePipeTransport._call_connection_lostcCs"|j}|jdk r|t|jƒ7}|SrB)r&r#r;)r-ÚsizerrrÚget_write_buffer_sizeªs z0_ProactorBasePipeTransport.get_write_buffer_size)NNN)rM)r8Ú __module__Ú __qualname__Ú__doc__rr?rr!rErFrIÚwarningsÚwarnrLrVrPrGr]Ú __classcell__rrr3rr.s ÿ  rcsTeZdZdZd‡fdd„ Zdd„Zdd„Zd d „Zd d „Zd d„Z ddd„Z ‡Z S)Ú_ProactorReadPipeTransportzTransport for read pipes.Ncs:d|_d|_tƒ ||||||¡|j |j¡d|_dS)NTF)Ú _pending_dataÚ_pausedrrrr*Ú _loop_readingr,r3rrrµs z#_ProactorReadPipeTransport.__init__cCs|j o|j SrB)rfr(rDrrrÚ is_reading¾sz%_ProactorReadPipeTransport.is_readingcCs0|js |jrdSd|_|j ¡r,t d|¡dS)NTz%r pauses reading)r(rfrrr rSrDrrrÚ pause_readingÁs   z(_ProactorReadPipeTransport.pause_readingcCsn|js |jsdSd|_|jdkr0|j |jd¡|j}d|_|dk rT|j |j|¡|j ¡rjt   d|¡dS)NFz%r resumes reading) r(rfr$rr*rgreÚ_data_receivedrr rS©r-ÚdatarrrÚresume_readingÔs   z)_ProactorReadPipeTransport.resume_readingc Cs‚|j ¡rt d|¡z|j ¡}WnLttfk r>‚Yn4tk rp}z|  |d¡WY¢dSd}~XYnX|s~|  ¡dS)Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.) rrr rSr+Z eof_receivedÚ SystemExitÚKeyboardInterruptÚ BaseExceptionrVrI)r-Z keep_openrUrrrÚ _eof_receivedæs  ÿz(_ProactorReadPipeTransport._eof_receivedc Cs®|jr|jdkst‚||_dS|s.| ¡dSt|jtjƒržzt |j|¡Wqªt t fk rh‚Yqªt k rš}z|  |d¡WY¢dSd}~XYqªXn |j  |¡dS)Nz3Fatal error: protocol.buffer_updated() call failed.)rfreÚAssertionErrorrqrQr+rZBufferedProtocolZ_feed_data_to_buffered_protornrorprVZ data_received)r-rlrUrrrrjös$ÿz)_ProactorReadPipeTransport._data_receivedc Cs”d}�zrzŽ|dk rP|j|ks0|jdkr,|js0t‚d|_| ¡rH| ¡}n| ¡|jrfd}WW�¢dS|dkrzWW�¢dS|js”|jj   |j d¡|_WnÈt k rä}z0|js¼|  |d¡n|j ¡rÔtjddd�W5d}~XYn’tk �r}z| |¡W5d}~XYnftk �r>}z|  |d¡W5d}~XYn8tjk �r^|j�sZ‚YnX|j�sv|j |j¡W5|dk �rŽ| |¡XdS)Nói€z"Fatal read error on pipe transportz*Read error on pipe transport while closingTr)rjr$r(rrrXÚresultrHrfrÚ _proactorÚrecvr ÚConnectionAbortedErrorrVrr rSÚConnectionResetErrorrPrRrÚCancelledErrorÚadd_done_callbackrg)r-ÚfutrlrUrrrrgsFÿ    ÿ z(_ProactorReadPipeTransport._loop_reading)NNN)N) r8r^r_r`rrhrirmrqrjrgrcrrr3rrd±sÿ rdcs^eZdZdZdZ‡fdd„Zdd„Zddd „Zd d „Zd d „Z dd„Z dd„Z dd„Z ‡Z S)Ú_ProactorBaseWritePipeTransportzTransport for write pipes.Tcstƒj||Žd|_dSrB)rrrW©r-ÚargsÚkwr3rrrGsz(_ProactorBaseWritePipeTransport.__init__cCsÖt|tttfƒs$tdt|ƒj›�ƒ‚|jr2tdƒ‚|j dk rDtdƒ‚|sLdS|j rz|j t j krht  d¡|j d7_ dS|jdkr¤|jdks’t‚|jt|ƒd�n.|js¾t|ƒ|_| ¡n|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)rl)rQÚbytesÚ bytearrayÚ memoryviewÚ TypeErrorÚtyper8r)Ú RuntimeErrorrWr'rÚ!LOG_THRESHOLD_FOR_CONNLOST_WRITESr rr%r#rrÚ _loop_writingÚ_maybe_pause_protocolÚextendrkrrrÚwriteKs.ÿ       z%_ProactorBaseWritePipeTransport.writeNc Csx�z|dk r"|jdkr"|jr"WdS||jks0t‚d|_d|_|rH| ¡|dkr\|j}d|_|s”|jrv|j |jd¡|j rŠ|j   t j ¡| ¡n\|jj |j |¡|_|j ¡sâ|jdksÀt‚t|ƒ|_|j |j¡| ¡n|j |j¡|jdk �r|jdk�r|j d¡Wn\tk �rD}z| |¡W5d}~XYn0tk �rr}z| |d¡W5d}~XYnXdS)Nrz#Fatal write error on pipe transport)r%r(rrr&rtr#rr*rGr)r rZr ÚSHUT_WRÚ_maybe_resume_protocolruÚsendrXr;rzr‡rˆrWrYrxrPrRrV)r-ÚfrlrUrrrr‡qs<    z-_ProactorBaseWritePipeTransport._loop_writingcCsdS©NTrrDrrrÚ can_write_eofšsz-_ProactorBaseWritePipeTransport.can_write_eofcCs | ¡dSrB)rIrDrrrÚ write_eof�sz)_ProactorBaseWritePipeTransport.write_eofcCs| d¡dSrB©rPrDrrrÚabort sz%_ProactorBaseWritePipeTransport.abortcCs:|jdk rtdƒ‚|j ¡|_|jdkr4|j d¡|jS)NzEmpty waiter is already set)rWr…rZ create_futurer%rYrDrrrÚ_make_empty_waiter£s     z2_ProactorBaseWritePipeTransport._make_empty_waitercCs d|_dSrB)rWrDrrrÚ_reset_empty_waiter«sz3_ProactorBaseWritePipeTransport._reset_empty_waiter)NN)r8r^r_r`Z_start_tls_compatiblerrŠr‡r�r‘r“r”r•rcrrr3rr|As & )r|cs$eZdZ‡fdd„Zdd„Z‡ZS)Ú_ProactorWritePipeTransportcs4tƒj||Ž|jj |jd¡|_|j |j¡dS)Né) rrrrurvr r$rzÚ _pipe_closedr}r3rrr°sz$_ProactorWritePipeTransport.__init__cCsv| ¡r dS| ¡dkst‚|jr4|jdks0t‚dS||jksLt||jfƒ‚d|_|jdk rj| tƒ¡n| ¡dS)Nrs) Z cancelledrtrrr(r$r%rPÚBrokenPipeErrorrI)r-r{rrrr˜µs z(_ProactorWritePipeTransport._pipe_closed)r8r^r_rr˜rcrrr3rr–¯s r–csXeZdZdZd‡fdd„ Zdd„Zdd„Zd d „Zdd d „Zdd d„Z ddd„Z ‡Z S)Ú_ProactorDatagramTransportiNcs>||_d|_tƒj|||||d�t ¡|_|j |j ¡dS)N)r0r1) Ú_addressrWrrÚ collectionsÚdequer#rr*rg)r-r.rr/Úaddressr0r1r3rrrÇs  z#_ProactorDatagramTransport.__init__cCst||ƒdSrB©rrArrrrÓsz%_ProactorDatagramTransport._set_extracCstdd„|jDƒƒS)Ncss|]\}}t|ƒVqdSrB)r;)Ú.0rlÚ_rrrÚ ×szC_ProactorDatagramTransport.get_write_buffer_size..)Úsumr#rDrrrr]Ösz0_ProactorDatagramTransport.get_write_buffer_sizecCs| d¡dSrBr’rDrrrr“Ùsz _ProactorDatagramTransport.abortcCs´t|tttfƒstdt|ƒƒ‚|s&dS|jdk rN|d|jfkrNtd|j›�ƒ‚|jr‚|jr‚|jt j krpt   d¡|jd7_dS|j  t|ƒ|f¡|jdkr¨| ¡| ¡dS)Nz,data argument must be bytes-like object (%r)z!Invalid address: must be None or z!socket.sendto() raised exception.r)rQr€r�r‚rƒr„r›Ú ValueErrorr'rr†r rr#r9r%r‡rˆ)r-rlÚaddrrrrÚsendtoÜs&ÿ ÿ    z!_ProactorDatagramTransport.sendtoc Csz¤|jrWdS||jkst‚d|_|r.| ¡|jr@|jr\|jr\|jrV|j |j d¡WdS|j  ¡\}}|jdk rŠ|jj   |j |¡|_n|jj j|j ||d�|_WnZtk rÒ}z|j |¡W5d}~XYnDtk rþ}z| |d¡W5d}~XYnX|j |j¡| ¡dS)N)r¥z'Fatal write error on datagram transport)r'r%rrrtr#r›r(rr*rGÚpopleftrur�r r¦rRr+Úerror_receivedÚ ExceptionrVrzr‡rŒ)r-r{rlr¥rUrrrr‡øs4  ÿ þ z(_ProactorDatagramTransport._loop_writingc CsVd}�z4zÆ|jrWW�¢$dS|j|ks:|jdkr6|js:t‚d|_|dk r„| ¡}|jrdd}WW¢ÜdS|jdk r|||j}}n|\}}|jr”WW¢¬dS|jdk r¶|jj   |j |j ¡|_n|jj   |j |j ¡|_WnNtk rü}z|j |¡W5d}~XYn<tjk �r|j�s‚YnX|jdk �r8|j |j¡W5|�rP|j ||¡XdSrB)r+Zdatagram_receivedr'r$r(rrrtr›rrurvr Úmax_sizeZrecvfromrRr¨rryrzrg)r-r{rlr¥ÚresrUrrrrgsD ÿ     ÿ ÿ  z(_ProactorDatagramTransport._loop_reading)NNN)N)N)N) r8r^r_rªrrr]r“r¦r‡rgrcrrr3rršÅsÿ   !ršc@s eZdZdZdd„Zdd„ZdS)Ú_ProactorDuplexPipeTransportzTransport for duplex pipes.cCsdS)NFrrDrrrr�Jsz*_ProactorDuplexPipeTransport.can_write_eofcCst‚dSrB)ÚNotImplementedErrorrDrrrr‘Msz&_ProactorDuplexPipeTransport.write_eofN)r8r^r_r`r�r‘rrrrr¬Esr¬csBeZdZdZejjZd ‡fdd„ Zdd„Z dd„Z d d „Z ‡Z S) Ú_ProactorSocketTransportz Transport for connected sockets.Ncs$tƒ ||||||¡t |¡dSrB)rrrZ _set_nodelayr,r3rrrXsz!_ProactorSocketTransport.__init__cCst||ƒdSrBrŸrArrrr]sz#_ProactorSocketTransport._set_extracCsdSr�rrDrrrr�`sz&_ProactorSocketTransport.can_write_eofcCs2|js |jrdSd|_|jdkr.|j tj¡dSr�)r(r)r%r rZr r‹rDrrrr‘cs   z"_ProactorSocketTransport.write_eof)NNN) r8r^r_r`rZ _SendfileModeZ TRY_NATIVEZ_sendfile_compatiblerrr�r‘rcrrr3rr®Qsÿr®csîeZdZ‡fdd„Zd3dd„Zd4ddddddœdd „Zd5d d „Zd6d d „Zd7dd„Zd8dd„Z ‡fdd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd9d&d'„Zd(d)„Zd:d+d,„Zd-d.„Zd/d0„Zd1d2„Z‡ZS);rcshtƒ ¡t d|jj¡||_||_d|_i|_ |  |¡|  ¡t   ¡t  ¡krdt |j ¡¡dS)NzUsing proactor: %s)rrr rSr4r8ruÚ _selectorÚ_self_reading_futureÚ_accept_futuresZset_loopÚ_make_self_pipeÚ threadingÚcurrent_threadÚ main_threadÚsignalÚ set_wakeup_fdÚ_csockr:)r-Zproactorr3rrrms  zBaseProactorEventLoop.__init__NcCst||||||ƒSrB)r®)r-rr/r0r1r2rrrÚ_make_socket_transportzs ÿz,BaseProactorEventLoop._make_socket_transportF)Ú server_sideÚserver_hostnamer1r2Ússl_handshake_timeoutc Cs0tj||||||| d�} t||| ||d�| jS)N)r¼©r1r2)r Z SSLProtocolr®Z_app_transport) r-Zrawsockr/Ú sslcontextr0rºr»r1r2r¼Z ssl_protocolrrrÚ_make_ssl_transportsýÿz)BaseProactorEventLoop._make_ssl_transportcCst||||||ƒSrB)rš)r-rr/ržr0r1rrrÚ_make_datagram_transportŒs ÿz.BaseProactorEventLoop._make_datagram_transportcCst|||||ƒSrB)r¬©r-rr/r0r1rrrÚ_make_duplex_pipe_transport‘s ÿz1BaseProactorEventLoop._make_duplex_pipe_transportcCst|||||ƒSrB)rdrÁrrrÚ_make_read_pipe_transport–sz/BaseProactorEventLoop._make_read_pipe_transportcCst|||||ƒSrB)r–rÁrrrÚ_make_write_pipe_transportšs ÿz0BaseProactorEventLoop._make_write_pipe_transportcsj| ¡rtdƒ‚| ¡rdSt ¡t ¡kr6t d¡| ¡|  ¡|j   ¡d|_ d|_ t ƒ  ¡dS)Nz!Cannot close a running event loopéÿÿÿÿ)Z is_runningr…Ú is_closedr³r´rµr¶r·Ú_stop_accept_futuresÚ_close_self_piperurIr¯rrDr3rrrI s  zBaseProactorEventLoop.closecÃs|j ||¡IdHSrB)rurv)r-rÚnrrrÚ sock_recv´szBaseProactorEventLoop.sock_recvcÃs|j ||¡IdHSrB)ruZ recv_into)r-rZbufrrrÚsock_recv_into·sz$BaseProactorEventLoop.sock_recv_intocÃs|j ||¡IdHSrB)rur�)r-rrlrrrÚ sock_sendallºsz"BaseProactorEventLoop.sock_sendallcÃs|j ||¡IdHSrB)ruZconnect)r-rržrrrÚ sock_connect½sz"BaseProactorEventLoop.sock_connectcÃs|j |¡IdHSrB)ruÚacceptrArrrÚ sock_acceptÀsz!BaseProactorEventLoop.sock_acceptc Ãs(z | ¡}Wn2ttjfk r>}zt d¡‚W5d}~XYnXzt |¡j}Wn,t k r|}zt d¡‚W5d}~XYnX|r†|n|}|s’dSt |dƒ}|r®t |||ƒn|} t ||ƒ}d} zLt | ||ƒ}|dkrà| W¢0S|j   ||||¡IdH||7}| |7} qÂW5| dk�r"|  |¡XdS)Nznot a regular filerlÿÿ)r:ÚAttributeErrorÚioÚUnsupportedOperationrZSendfileNotAvailableErrorÚosÚfstatÚst_sizerRÚminÚseekruÚsendfile) r-rÚfileÚoffsetÚcountr:ÚerrZfsizeZ blocksizeZend_posZ total_sentrrrÚ_sock_sendfile_nativeÃs0     z+BaseProactorEventLoop._sock_sendfile_nativecÃsZ| ¡}| ¡| ¡IdHz |j|j|||dd�IdHW¢S| ¡|rT| ¡XdS)NF)Zfallback)rhrir”r•rmZ sock_sendfiler )r-ZtransprÙrÚrÛrmrrrÚ_sendfile_nativeàsÿz&BaseProactorEventLoop._sendfile_nativecCsL|jdk r|j ¡d|_|j ¡d|_|j ¡d|_|jd8_dS)Nr)r°rHÚ_ssockrIr¸Ú _internal_fdsrDrrrrÈìs    z&BaseProactorEventLoop._close_self_pipecCs:t ¡\|_|_|j d¡|j d¡|jd7_dS)NFr)r Z socketpairrßr¸Z setblockingràrDrrrr²ös  z%BaseProactorEventLoop._make_self_pipec Cs®z4|dk r| ¡|j|k r"WdS|j |jd¡}Wnbtjk rLYdSttfk rd‚YnFt k r–}z|  d||dœ¡W5d}~XYnX||_|  |j ¡dS)Niz.Error on reading from the event loop self pipe)rNrOr.) rtr°rurvrßrryrnrorprTrzÚ_loop_self_reading)r-rŽrUrrrráýs$ ýz(BaseProactorEventLoop._loop_self_readingcCsN|j}|dkrdSz| d¡Wn(tk rH|jrDtjddd�YnXdS)Nóz3Fail to write a null byte into the self-pipe socketTr)r¸r�rRÚ_debugr rS)r-ZcsockrrrÚ_write_to_selfsþz$BaseProactorEventLoop._write_to_selfédcs(d‡‡‡‡‡‡‡fdd„ ‰ˆ ˆ¡dS)Nc s,zŠ|dk rn| ¡\}}ˆjr,t dˆ||¡ˆƒ}ˆdk rXˆj||ˆdd|iˆˆd�nˆj||d|iˆd�ˆ ¡r|WdSˆj ˆ¡}Wn„t k rð}zHˆ  ¡dkrʈ  d|t   ˆ¡dœ¡ˆ ¡nˆjràtjd ˆdd �W5d}~XYn8tjk �rˆ ¡YnX|ˆjˆ  ¡<| ˆ¡dS) Nz#%r got a new connection from %r: %rTr)rºr1r2r¼r½rÅzAccept failed on a socket)rNrOr zAccept failed on socket %rr)rtrãr rSr¿r¹rÆrurÎrRr:rTr rrIrryr±rz)rŽZconnr¥r/rU©r.Úprotocol_factoryr-r2rr¼r¾rrr./s\ ÿýþ ý ÿz2BaseProactorEventLoop._start_serving..loop)N)r*)r-rçrr¾r2Zbacklogr¼rrærÚ_start_serving+s%z$BaseProactorEventLoop._start_servingcCsdSrBr)r-Z event_listrrrÚ_process_eventsVsz%BaseProactorEventLoop._process_eventscCs&|j ¡D] }| ¡q |j ¡dSrB)r±ÚvaluesrHÚclear)r-ÚfuturerrrrÇZs z*BaseProactorEventLoop._stop_accept_futurescCs6|j | ¡d¡}|r| ¡|j |¡| ¡dSrB)r±Úpopr:rHruÚ _stop_servingrI)r-rrìrrrrî_s  z#BaseProactorEventLoop._stop_serving)NNN)N)NNN)NN)NN)NN)N)NNråN)r8r^r_rr¹r¿rÀrÂrÃrÄrIrÊrËrÌrÍrÏrÝrÞrÈr²rárärèrérÇrîrcrrr3rrks\ ÿ ÿü ÿ ÿ ÿ ÿ     þ +r)#r`Ú__all__rÑrÓr rar¶r³rœÚrrrrrr r r Úlogr rZ_FlowControlMixinZ BaseTransportrZ ReadTransportrdZWriteTransportr|r–ršZ Transportr¬r®Z BaseEventLooprrrrrÚsR         ÿ ÿ ÿn þ þ