a ÕDOg’}ã@sXdZdZddlZddlZddlZddlZddlZddlZddlZddl 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„deejƒZGdd„deeejƒZ Gdd„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<Wn.tjyP|j ¡rLtj d|ddYn0d|jvrŽz|  ¡|jd<WntjyŒd|jd<Yn0dS)NÚsocketZsocknamezgetsockname() failed on %rT©Úexc_infoÚpeername) r ÚTransportSocketÚ_extraZ getsocknamer ÚerrorÚ_loopÚ get_debugr ÚwarningZ getpeername)Ú transportÚsock©rúú ) 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>|jdur>|j |jd¡|jdurX|j ¡d|_dS)NTr) r(r'r#r%rr*Ú_call_connection_lostr$ÚcancelrDrrrÚclosefs  z _ProactorBasePipeTransport.closecCs*|jdur&|d|›t|d| ¡dS)Nzunclosed transport )Úsource)r ÚResourceWarningrI)r-Z_warnrrrÚ__del__qs z"_ProactorBasePipeTransport.__del__úFatal error on pipe transportc Cs`zNt|tƒr*|j ¡rBtjd||ddn|j ||||jdœ¡W| |¡n | |¡0dS)Nz%r: %sTr)ÚmessageÚ exceptionrr/) Ú isinstanceÚOSErrorrrr ÚdebugÚcall_exception_handlerr+Ú _force_close)r-ÚexcrNrrrÚ _fatal_errorvs  ü z'_ProactorBasePipeTransport._fatal_errorcCs |jdur6|j ¡s6|dur*|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-rUrrrrT…s"   z'_ProactorBasePipeTransport._force_closec CsÀzd|j |¡Wt|jdƒr8|j ¡dkr8|j tj¡|j ¡d|_|j }|dur¼|  ¡d|_ nVt|jdƒrŽ|j ¡dkrŽ|j tj¡|j ¡d|_|j }|durº|  ¡d|_ 0dS)NÚshutdownéÿÿÿÿ) r+Zconnection_lostÚhasattrr r:rZr Z SHUT_RDWRrIr"Z_detach)r-rUr2rrrrG™s$ ù z0_ProactorBasePipeTransport._call_connection_lostcCs"|j}|jdur|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ÚwarnrLrVrTrGr^Ú __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)rgr(rDrrrÚ is_reading¾sz%_ProactorReadPipeTransport.is_readingcCs0|js |jrdSd|_|j ¡r,t d|¡dS)NTz%r pauses reading)r(rgrrr rRrDrrrÚ pause_readingÁs   z(_ProactorReadPipeTransport.pause_readingcCsn|js |jsdSd|_|jdur0|j |jd¡|j}d|_|durT|j |j|¡|j ¡rjt   d|¡dS)NFz%r resumes reading) r(rgr$rr*rhrfÚ_data_receivedrr rR©r-ÚdatarrrÚresume_readingÔs   z)_ProactorReadPipeTransport.resume_readingc Cs~|j ¡rt d|¡z|j ¡}WnHttfy<‚Yn2tyl}z|  |d¡WYd}~dSd}~00|sz|  ¡dS)Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.) rrr rRr+Z eof_receivedÚ SystemExitÚKeyboardInterruptÚ BaseExceptionrVrI)r-Z keep_openrUrrrÚ _eof_receivedæs  ÿz(_ProactorReadPipeTransport._eof_receivedc Csœ|jr||_dS|s | ¡dSt|jtjƒrŒzt |j|¡Wq˜tt fyX‚Yq˜t yˆ}z|  |d¡WYd}~dSd}~00n |j  |¡dS)Nz3Fatal error: protocol.buffer_updated() call failed.) rgrfrrrPr+rZBufferedProtocolZ_feed_data_to_buffered_protororprqrVZ data_received)r-rmrUrrrrkös"ÿz)_ProactorReadPipeTransport._data_receivedc Csªd}zˆzŒ|dur2d|_| ¡r*| ¡}n| ¡|jrVd}WW|durR| |¡dS|dkrxWW|durt| |¡dS|js’|jj  |j d¡|_WnÌt yä}z8|js¸|  |d¡n|j  ¡rÐtjdddWYd}~nœd}~0ty}z| |¡WYd}~nnd}~0tyB}z|  |d¡WYd}~n>d}~0tjy`|js\‚Yn0|jsx|j |j¡W|dur¦| |¡n|dur¤| |¡0dS)Nói€z"Fatal read error on pipe transportz*Read error on pipe transport while closingTr)r$rXÚresultrHr(rkrgrÚ _proactorÚrecvr ÚConnectionAbortedErrorrVrr rRÚConnectionResetErrorrTrQrÚCancelledErrorÚadd_done_callbackrh)r-ÚfutrmrUrrrrhsP  â æ ÿ   ÿ z(_ProactorReadPipeTransport._loop_reading)NNN)N) r8r_r`rarrirjrnrrrkrhrdrrr3rre±sÿ recs^eZdZdZdZ‡fdd„Zdd„Zddd „Zd d „Zd d „Z dd„Z dd„Z dd„Z ‡Z S)Ú_ProactorBaseWritePipeTransportzTransport for write pipes.Tcstƒj|i|¤Žd|_dSrB)rrrW©r-ÚargsÚkwr3rrrGsz(_ProactorBaseWritePipeTransport.__init__cCsÈt|tttfƒs$tdt|ƒj›ƒ‚|jr2tdƒ‚|j durDtdƒ‚|sLdS|j rz|j t j krht  d¡|j d7_ dS|jdur–|jt|ƒdn.|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)rm)rPÚbytesÚ bytearrayÚ memoryviewÚ TypeErrorÚtyper8r)Ú RuntimeErrorrWr'rÚ!LOG_THRESHOLD_FOR_CONNLOST_WRITESr rr%Ú _loop_writingr#Ú_maybe_pause_protocolÚextendrlrrrÚwriteKs0ÿÿ       z%_ProactorBaseWritePipeTransport.writeNc CsZzô|dur |jdur |jr WdSd|_d|_|r8| ¡|durL|j}d|_|s„|jrf|j |jd¡|jrz|j   t j ¡|  ¡nN|jj |j |¡|_|j ¡sÄt|ƒ|_|j |j¡| ¡n|j |j¡|jdurò|jdurò|j d¡Wn`ty$}z| |¡WYd}~n:d}~0tyT}z| |d¡WYd}~n d}~00dS)Nrz#Fatal write error on pipe transport)r%r(r&rtr#rr*rGr)r rZr ÚSHUT_WRÚ_maybe_resume_protocolruÚsendrXr;rzr‡rˆrWrYrxrTrQrV)r-ÚfrmrUrrrr‡qs8    z-_ProactorBaseWritePipeTransport._loop_writingcCsdS©NTrrDrrrÚ can_write_eofšsz-_ProactorBaseWritePipeTransport.can_write_eofcCs | ¡dSrB)rIrDrrrÚ write_eofsz)_ProactorBaseWritePipeTransport.write_eofcCs| d¡dSrB©rTrDrrrÚabort sz%_ProactorBaseWritePipeTransport.abortcCs:|jdurtdƒ‚|j ¡|_|jdur4|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`raZ_start_tls_compatiblerrŠr‡rr‘r“r”r•rdrrr3rr|As & )r|cs$eZdZ‡fdd„Zdd„Z‡ZS)Ú_ProactorWritePipeTransportcs8tƒj|i|¤Ž|jj |jd¡|_|j |j¡dS)Né) rrrrurvr r$rzÚ _pipe_closedr}r3rrr°sz$_ProactorWritePipeTransport.__init__cCs@| ¡r dS|jrdSd|_|jdur4| tƒ¡n| ¡dSrB)Z cancelledr(r$r%rTÚBrokenPipeErrorrI)r-r{rrrr˜µs z(_ProactorWritePipeTransport._pipe_closed)r8r_r`rr˜rdrrr3rr–¯s r–csXeZdZdZd‡fdd„ Zdd„Zdd„Zd d „Zdd d „Zdd d„Z ddd„Z ‡Z S)Ú_ProactorDatagramTransportiNcs>||_d|_tƒj|||||dt ¡|_|j |j ¡dS)N)r0r1) Ú_addressrWrrÚ collectionsÚdequer#rr*rh)r-r.rr/Úaddressr0r1r3rrrÈs  z#_ProactorDatagramTransport.__init__cCst||ƒdSrB©rrArrrrÔsz%_ProactorDatagramTransport._set_extracCstdd„|jDƒƒS)Ncss|]\}}t|ƒVqdSrB)r;)Ú.0rmÚ_rrrÚ ØrszC_ProactorDatagramTransport.get_write_buffer_size..)Úsumr#rDrrrr^×sz0_ProactorDatagramTransport.get_write_buffer_sizecCs| d¡dSrBr’rDrrrr“Úsz _ProactorDatagramTransport.abortcCs´t|tttfƒstdt|ƒƒ‚|s&dS|jdurN|d|jfvrNtd|j›ƒ‚|jr‚|jr‚|jt j krpt   d¡|jd7_dS|j  t|ƒ|f¡|jdur¨| ¡| ¡dS)Nz,data argument must be bytes-like object (%r)z!Invalid address: must be None or z!socket.sendto() raised exception.r)rPr€rr‚rƒr„r›Ú ValueErrorr'rr†r rr#r9r%r‡rˆ)r-rmÚaddrrrrÚsendtoÝs&ÿ ÿ    z!_ProactorDatagramTransport.sendtoc Csz–|jrWdSd|_|r | ¡|jr2|jrN|jrN|jrH|j |jd¡WdS|j  ¡\}}|jdur||jj   |j |¡|_n|jj j |j ||d|_Wn^tyÆ}z|j |¡WYd}~nNd}~0tyô}z| |d¡WYd}~n d}~00|j |j¡| ¡dS)N)r¥z'Fatal write error on datagram transport)r'r%rtr#r›r(rr*rGÚpopleftrurr r¦rQr+Úerror_receivedÚ ExceptionrVrzr‡rŒ)r-r{rmr¥rUrrrr‡ùs2  ÿ þ  "z(_ProactorDatagramTransport._loop_writingc Cs|d}zZzÖ|jr*WW|r&|j ||¡dSd|_|dur„| ¡}|jrdd}WW|r`|j ||¡dS|jdur|||j}}n|\}}|jr¤WW|r |j ||¡dS|jdurÆ|jj  |j |j ¡|_n|jj  |j |j ¡|_WnPt y}z|j |¡WYd}~nBd}~0tjy.|js*‚Yn0|jdurJ|j |j¡W|rx|j ||¡n|rv|j ||¡0dSrB)r'r+Zdatagram_receivedr$rtr(r›rrurvr Úmax_sizeZrecvfromrQr¨rryrzrh)r-r{rmr¥ÚresrUrrrrhsT$Ûç ï  ÿ ÿ   ÿz(_ProactorDatagramTransport._loop_reading)NNN)N)N)N) r8r_r`rªrrr^r“r¦r‡rhrdrrr3rršÅsÿ   !ršc@s eZdZdZdd„Zdd„ZdS)Ú_ProactorDuplexPipeTransportzTransport for duplex pipes.cCsdS)NFrrDrrrrKsz*_ProactorDuplexPipeTransport.can_write_eofcCst‚dSrB)ÚNotImplementedErrorrDrrrr‘Nsz&_ProactorDuplexPipeTransport.write_eofN)r8r_r`rarr‘rrrrr¬Fsr¬csBeZdZdZejjZd ‡fdd„ Zdd„Z dd„Z d d „Z ‡Z S) Ú_ProactorSocketTransportz Transport for connected sockets.Ncs$tƒ ||||||¡t |¡dSrB)rrrZ _set_nodelayr,r3rrrYsz!_ProactorSocketTransport.__init__cCst||ƒdSrBrŸrArrrr^sz#_ProactorSocketTransport._set_extracCsdSrrrDrrrrasz&_ProactorSocketTransport.can_write_eofcCs2|js |jrdSd|_|jdur.|j tj¡dSr)r(r)r%r rZr r‹rDrrrr‘ds   z"_ProactorSocketTransport.write_eof)NNN) r8r_r`rarZ _SendfileModeZ TRY_NATIVEZ_sendfile_compatiblerrrr‘rdrrr3rr®Rsÿ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  ¡urdt |j ¡¡dS)NzUsing proactor: %s)rrr rRr4r8ruÚ _selectorÚ_self_reading_futureÚ_accept_futuresZset_loopÚ_make_self_pipeÚ threadingÚcurrent_threadÚ main_threadÚsignalÚ set_wakeup_fdÚ_csockr:)r-Zproactorr3rrrns  zBaseProactorEventLoop.__init__NcCst||||||ƒSrB)r®)r-rr/r0r1r2rrrÚ_make_socket_transport{s ÿ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_transport€sýÿz)BaseProactorEventLoop._make_ssl_transportcCst||||||ƒSrB)rš)r-rr/ržr0r1rrrÚ_make_datagram_transports ÿz.BaseProactorEventLoop._make_datagram_transportcCst|||||ƒSrB)r¬©r-rr/r0r1rrrÚ_make_duplex_pipe_transport’sÿz1BaseProactorEventLoop._make_duplex_pipe_transportcCst|||||ƒSrB)rerÁ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 ¡ur6t d¡| ¡|  ¡|j   ¡d|_ d|_ t ƒ  ¡dS)Nz!Cannot close a running event loopr[)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-rrmrrrÚ 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 | ¡}Wn4ttjfy@}zt d¡‚WYd}~n d}~00zt |¡j}Wnt ynt d¡‚Yn0|rx|n|}|s„dSt |dƒ}|r t |||ƒn|} t ||ƒ}d} zpt | ||ƒ}|dkrâ| W| dkrà|  |¡S|j   ||||¡IdH||7}| |7} q´W| dkr:|  |¡n| dkr8|  |¡0dS)Nznot a regular filerlÿÿ)r:ÚAttributeErrorÚioÚUnsupportedOperationrZSendfileNotAvailableErrorÚosÚfstatÚst_sizerQÚminÚseekruÚsendfile) r-rÚfileÚoffsetÚcountr:ÚerrZfsizeZ blocksizeZend_posZ total_sentrrrÚ_sock_sendfile_nativeÄs:       ú   ÿ z+BaseProactorEventLoop._sock_sendfile_nativecÃsn| ¡}| ¡| ¡IdHz4|j|j|||ddIdHW| ¡|rP| ¡Sn| ¡|rh| ¡0dS)NF)Zfallback)rirjr”Z sock_sendfiler r•rn)r-ZtransprØrÙrÚrnrrrÚ_sendfile_nativeás"ÿ ûþz&BaseProactorEventLoop._sendfile_nativecCsL|jdur|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|dur| ¡|j|ur"WdS|j |jd¡}Wn`tjyJYdSttfy`‚YnHt y”}z|  d||dœ¡WYd}~nd}~00||_|  |j ¡dS)Niz.Error on reading from the event loop self pipe)rNrOr.) rtr°rurvrÞrryrorprqrSrzÚ_loop_self_reading)r-rŽrUrrrràþs$ ýz(BaseProactorEventLoop._loop_self_readingcCsL|j}|durdSz| d¡Wn&tyF|jrBtjdddYn0dS)Nóz3Fail to write a null byte into the self-pipe socketTr)r¸rrQÚ_debugr rR)r-ZcsockrrrÚ_write_to_selfs þz$BaseProactorEventLoop._write_to_selfédcs(d‡‡‡‡‡‡‡fdd„ ‰ˆ ˆ¡dS)Nc s,zŠ|durn| ¡\}}ˆjr,t dˆ||¡ˆƒ}ˆdurXˆj||ˆdd|iˆˆdnˆj||d|iˆdˆ ¡r|WdSˆj ˆ¡}Wn„t yò}zPˆ  ¡dkrȈ  d|t   ˆ¡dœ¡ˆ ¡nˆjrÞtjd ˆdd WYd}~n>d}~0tjyˆ ¡Yn0|ˆ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 rRr¿r¹rÅrurÍrQr:rSr rrIrryr±rz)rŽZconnr¥r/rU©r.Úprotocol_factoryr-r2rr¼r¾rrr.0sJ ÿýþ ý ÿz2BaseProactorEventLoop._start_serving..loop)N)r*)r-rærr¾r2Zbacklogr¼rrårÚ_start_serving,s%z$BaseProactorEventLoop._start_servingcCsdSrBr)r-Z event_listrrrÚ_process_eventsWsz%BaseProactorEventLoop._process_eventscCs&|j ¡D] }| ¡q |j ¡dSrB)r±ÚvaluesrHÚclear)r-ÚfuturerrrrÆ[s 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írdrrr3rrlsN ÿ ÿü ÿ ÿ ÿ ÿ     þ +r)$raÚ__all__rÐrÒr rbr¶r³rœÚrrrrrr r r Úlogr rZ_FlowControlMixinZ BaseTransportrZ ReadTransportreZWriteTransportr|r–ZDatagramTransportršZ Transportr¬r®Z BaseEventLooprrrrrÚsV         ÿ ÿ ÿn ÿ þ þ