B ©Ø1ɨ›ã@sdZdZddlZddlZddlZddlZddlmZddlmZddlm Z ddlm Z dd lm Z dd lm Z dd lm Z dd lmZGd d„de je jƒZGdd„dee jƒZGdd„dee jƒZGdd„deƒZGdd„deee jƒZGdd„deee jƒZGdd„dejƒZdS)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)Úevents)Úfutures)Ú protocols)Ússlproto)Ú transports)Úloggercs|eZdZdZd‡fdd„ Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z ddd„Z dd„Z dd„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_attachÚ_loopÚ call_soonÚ _protocolZconnection_maderZ_set_result_unless_cancelled)ÚselfÚloopÚsockÚprotocolÚwaiterÚextraÚserver)Ú __class__©ú:/opt/alt/python37/lib/python3.7/asyncio/proactor_events.pyrs$     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<{}>ú ) r$Ú__name__rÚappendrÚfilenorrrÚlenrÚformatÚjoin)rÚinfor%r%r&Ú__repr__2s         z#_ProactorBasePipeTransport.__repr__cCs||jd<dS)NÚpipe)Ú_extra)rrr%r%r&rDsz%_ProactorBasePipeTransport._set_extracCs ||_dS)N)r)rr r%r%r&rGsz'_ProactorBasePipeTransport.set_protocolcCs|jS)N)r)rr%r%r&Ú get_protocolJsz'_ProactorBasePipeTransport.get_protocolcCs|jS)N)r)rr%r%r&Ú is_closingMsz%_ProactorBasePipeTransport.is_closingcCs\|jr dSd|_|jd7_|js>|jdkr>|j |jd¡|jdk rX|j ¡d|_dS)NTr) rrrrrrÚ_call_connection_lostrÚcancel)rr%r%r&ÚclosePs  z _ProactorBasePipeTransport.closecCs,|jdk r(tjd|›t|d| ¡dS)Nzunclosed transport )Úsource)rÚwarningsÚwarnÚResourceWarningr8)rr%r%r&Ú__del__[s z"_ProactorBasePipeTransport.__del__úFatal error on pipe transportc CsVzDt|tƒr*|j ¡rBtjd||ddn|j ||||jdœ¡Wd| |¡XdS)Nz%r: %sT)Úexc_info)ÚmessageÚ exceptionZ transportr ) Ú isinstanceÚOSErrorrÚ get_debugr ÚdebugÚcall_exception_handlerrÚ _force_close)rÚexcr@r%r%r&Ú _fatal_erroras  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_exceptionrrrr7rrrrrr6)rrHr%r%r&rGps"   z'_ProactorBasePipeTransport._force_closec Cs^z|j |¡Wdt|jdƒr,|j tj¡|j ¡d|_|j}|dk rX|  ¡d|_XdS)NÚshutdown) rZconnection_lostÚhasattrrrMÚsocketZ SHUT_RDWRr8rZ_detach)rrHr#r%r%r&r6„s  z0_ProactorBasePipeTransport._call_connection_lostcCs"|j}|jdk r|t|jƒ7}|S)N)rrr-)rÚsizer%r%r&Úget_write_buffer_size•s z0_ProactorBasePipeTransport.get_write_buffer_size)NNN)r>)r*Ú __module__Ú __qualname__Ú__doc__rr1rrr4r5r8r=rIrGr6rQÚ __classcell__r%r%)r$r&r s  r csTeZdZdZd‡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Ú_pausedr rrrÚ _loop_reading)rrrr r!r"r#)r$r%r&r s z#_ProactorReadPipeTransport.__init__cCs|j o|j S)N)rXr)rr%r%r&Ú is_reading©sz%_ProactorReadPipeTransport.is_readingcCs0|js |jrdSd|_|j ¡r,t d|¡dS)NTz%r pauses reading)rrXrrDr rE)rr%r%r&Ú 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) rrXrrrrYrWÚ_data_receivedrDr rE)rÚdatar%r%r&Úresume_reading¿s   z)_ProactorReadPipeTransport.resume_readingc Csd|j ¡rt d|¡y|j ¡}Wn.tk rR}z| |d¡dSd}~XYnX|s`| ¡dS)Nz%r received EOFz1Fatal error: protocol.eof_received() call failed.) rrDr rErZ eof_receivedÚ ExceptionrIr8)rZ keep_openrHr%r%r&Ú _eof_receivedÑs  z(_ProactorReadPipeTransport._eof_receivedc Cs|jr|jdkst‚||_dS|s.| ¡dSt|jtjƒr€yt |j|¡WqŒt k r|}z|  |d¡dSd}~XYqŒXn |j  |¡dS)Nz3Fatal error: protocol.buffer_updated() call failed.) rXrWÚAssertionErrorr`rBrrZBufferedProtocolZ_feed_data_to_buffered_protor_rIZ data_received)rr]rHr%r%r&r\ßsz)_ProactorReadPipeTransport._data_receivedc Cs‚d}z`y~|dk rP|j|ks0|jdkr,|js0t‚d|_| ¡rH| ¡}n| ¡|jr^d}dS|dkrjdS|js„|jj  |j d¡|_WnÆt k rÔ}z0|js¬|  |d¡n|j  ¡rÄtjdddWdd}~XYntk rþ}z| |¡Wdd}~XYnftk r,}z|  |d¡Wdd}~XYn8tjk rL|jsH‚YnX|jsd|j |j¡Wd|dk r|| |¡XdS)Nói€z"Fatal read error on pipe transportz*Read error on pipe transport while closingT)r?)rrrarKÚresultr7rXrÚ _proactorÚrecvrÚConnectionAbortedErrorrIrDr rEÚConnectionResetErrorrGrCrÚCancelledErrorÚadd_done_callbackrYr\)rÚfutr]rHr%r%r&rYösB    z(_ProactorReadPipeTransport._loop_reading)NNN)N) r*rRrSrTrrZr[r^r`r\rYrUr%r%)r$r&rVœsrVcs^eZdZdZdZ‡fdd„Zdd„Zddd „Zd d „Zd d „Z dd„Z dd„Z dd„Z ‡Z S)Ú_ProactorBaseWritePipeTransportzTransport for write pipes.Tcstƒj||Žd|_dS)N)r rrJ)rÚargsÚkw)r$r%r&r.sz(_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|ƒ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)r])rBÚbytesÚ bytearrayÚ memoryviewÚ TypeErrorÚtyper*rÚ RuntimeErrorrJrrZ!LOG_THRESHOLD_FOR_CONNLOST_WRITESr ÚwarningrrraÚ _loop_writingÚ_maybe_pause_protocolÚextend)rr]r%r%r&Úwrite2s,       z%_ProactorBaseWritePipeTransport.writeNc Csvy|dk r |jdkr |jr dS||jks.t‚d|_d|_|rF| ¡|dkrZ|j}d|_|s’|jrt|j |jd¡|j rˆ|j   t j ¡| ¡n\|jj |j |¡|_|j ¡sà|jdks¾t‚t|ƒ|_|j |j¡| ¡n|j |j¡|jdk r|jdkr|j d¡Wn\tk rB}z| |¡Wdd}~XYn0tk rp}z| |d¡Wdd}~XYnXdS)Nrz#Fatal write error on pipe transport)rrrarrcrrrr6rrrMrOÚSHUT_WRZ_maybe_resume_protocolrdÚsendrKr-rirurvrJrLrgrGrCrI)rÚfr]rHr%r%r&ruXs<    z-_ProactorBaseWritePipeTransport._loop_writingcCsdS)NTr%)rr%r%r&Ú can_write_eofsz-_ProactorBaseWritePipeTransport.can_write_eofcCs | ¡dS)N)r8)rr%r%r&Ú write_eof„sz)_ProactorBaseWritePipeTransport.write_eofcCs| d¡dS)N)rG)rr%r%r&Úabort‡sz%_ProactorBaseWritePipeTransport.abortcCs:|jdk rtdƒ‚|j ¡|_|jdkr4|j d¡|jS)NzEmpty waiter is already set)rJrsrZ create_futurerrL)rr%r%r&Ú_make_empty_waiterŠs     z2_ProactorBaseWritePipeTransport._make_empty_waitercCs d|_dS)N)rJ)rr%r%r&Ú_reset_empty_waiter’sz3_ProactorBaseWritePipeTransport._reset_empty_waiter)NN)r*rRrSrTZ_start_tls_compatiblerrxrur|r}r~rr€rUr%r%)r$r&rk(s & )rkcs$eZdZ‡fdd„Zdd„Z‡ZS)Ú_ProactorWritePipeTransportcs4tƒj||Ž|jj |jd¡|_|j |j¡dS)Né) r rrrdrerrriÚ _pipe_closed)rrlrm)r$r%r&r—sz$_ProactorWritePipeTransport.__init__cCsv| ¡r dS| ¡dkst‚|jr4|jdks0t‚dS||jksLt||jfƒ‚d|_|jdk rj| tƒ¡n| ¡dS)Nrb) Z cancelledrcrarrrrGÚBrokenPipeErrorr8)rrjr%r%r&rƒœs z(_ProactorWritePipeTransport._pipe_closed)r*rRrSrrƒrUr%r%)r$r&r–s rc@s eZdZdZdd„Zdd„ZdS)Ú_ProactorDuplexPipeTransportzTransport for duplex pipes.cCsdS)NFr%)rr%r%r&r|±sz*_ProactorDuplexPipeTransport.can_write_eofcCst‚dS)N)ÚNotImplementedError)rr%r%r&r}´sz&_ProactorDuplexPipeTransport.write_eofN)r*rRrSrTr|r}r%r%r%r&r…¬sr…csBeZdZdZejjZd ‡fdd„ Zdd„Z dd„Z d d „Z ‡Z S) Ú_ProactorSocketTransportz Transport for connected sockets.Ncs$tƒ ||||||¡t |¡dS)N)r rrZ _set_nodelay)rrrr r!r"r#)r$r%r&r¿sz!_ProactorSocketTransport.__init__c Cs¨||jd<y| ¡|jd<Wn4tjtfk rP|j ¡rLtjd|ddYnXd|jkr¤y|  ¡|jd<Wn4tjtfk r¢|j ¡ržtjd|ddYnXdS)NrOZsocknamezgetsockname() failed on %rT)r?Úpeernamezgetpeername() failed on %r) r3Z getsocknamerOÚerrorÚAttributeErrorrrDr rtZ getpeername)rrr%r%r&rÄs    z#_ProactorSocketTransport._set_extracCsdS)NTr%)rr%r%r&r|Ösz&_ProactorSocketTransport.can_write_eofcCs2|js |jrdSd|_|jdkr.|j tj¡dS)NT)rrrrrMrOry)rr%r%r&r}Ùs   z"_ProactorSocketTransport.write_eof)NNN) r*rRrSrTrZ _SendfileModeZ TRY_NATIVEZ_sendfile_compatiblerrr|r}rUr%r%)r$r&r‡¸sr‡csäeZdZ‡fdd„Zd1dd„Zd2ddddddœdd „Zd3d d „Zd4d d „Zd5dd„Z‡fdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zd d!„Zd"d#„Zd6d$d%„Zd&d'„Zd7d)d*„Zd+d,„Zd-d.„Zd/d0„Z‡ZS)8rcsHtƒ ¡t d|jj¡||_||_d|_i|_ |  |¡|  ¡dS)NzUsing proactor: %s) r rr rEr$r*rdÚ _selectorÚ_self_reading_futureÚ_accept_futuresZset_loopÚ_make_self_pipe)rZproactor)r$r%r&rãs  zBaseProactorEventLoop.__init__NcCst||||||ƒS)N)r‡)rrr r!r"r#r%r%r&Ú_make_socket_transportís z,BaseProactorEventLoop._make_socket_transportF)Ú server_sideÚserver_hostnamer"r#Ússl_handshake_timeoutc Cs0tj||||||| d} t||| ||d| jS)N)r’)r"r#)r Z SSLProtocolr‡Z_app_transport) rZrawsockr Ú sslcontextr!rr‘r"r#r’Z ssl_protocolr%r%r&Ú_make_ssl_transportòs z)BaseProactorEventLoop._make_ssl_transportcCst|||||ƒS)N)r…)rrr r!r"r%r%r&Ú_make_duplex_pipe_transportÿsz1BaseProactorEventLoop._make_duplex_pipe_transportcCst|||||ƒS)N)rV)rrr r!r"r%r%r&Ú_make_read_pipe_transportsz/BaseProactorEventLoop._make_read_pipe_transportcCst|||||ƒS)N)r)rrr r!r"r%r%r&Ú_make_write_pipe_transportsz0BaseProactorEventLoop._make_write_pipe_transportcsP| ¡rtdƒ‚| ¡rdS| ¡| ¡|j ¡d|_d|_tƒ ¡dS)Nz!Cannot close a running event loop) Z is_runningrsÚ is_closedÚ_stop_accept_futuresÚ_close_self_piperdr8r‹r )r)r$r%r&r8s zBaseProactorEventLoop.closecÃs|j ||¡IdHS)N)rdre)rrÚnr%r%r&Ú sock_recv szBaseProactorEventLoop.sock_recvcÃs|j ||¡IdHS)N)rdZ recv_into)rrZbufr%r%r&Úsock_recv_into#sz$BaseProactorEventLoop.sock_recv_intocÃs|j ||¡IdHS)N)rdrz)rrr]r%r%r&Ú sock_sendall&sz"BaseProactorEventLoop.sock_sendallcÃs|j ||¡IdHS)N)rdZconnect)rrZaddressr%r%r&Ú sock_connect)sz"BaseProactorEventLoop.sock_connectcÃs|j |¡IdHS)N)rdÚaccept)rrr%r%r&Ú sock_accept,sz!BaseProactorEventLoop.sock_acceptc Ãs(y | ¡}Wn2ttjfk r>}zt d¡‚Wdd}~XYnXyt |¡j}Wn,t k r|}zt d¡‚Wdd}~XYnX|r†|n|}|s’dSt |dƒ}|r®t |||ƒn|} t ||ƒ}d} zLxFt | ||ƒ}|dkrÞ| S|j   ||||¡IdH||7}| |7} qÄWWd| dkr"|  |¡XdS)Nznot a regular filerlÿÿ)r,rŠÚioÚUnsupportedOperationrZSendfileNotAvailableErrorÚosÚfstatÚst_sizerCÚminrdÚsendfileÚseek) rrÚfileÚoffsetÚcountr,ÚerrZfsizeZ blocksizeZend_posZ total_sentr%r%r&Ú_sock_sendfile_native/s2     z+BaseProactorEventLoop._sock_sendfile_nativecÃsV| ¡}| ¡| ¡IdHz|j|j|||ddIdHS| ¡|rP| ¡XdS)NF)Zfallback)rZr[rZ sock_sendfilerr€r^)rZtransprªr«r¬r^r%r%r&Ú_sendfile_nativeLsz&BaseProactorEventLoop._sendfile_nativecCsL|jdk r|j ¡d|_|j ¡d|_|j ¡d|_|jd8_dS)Nr)rŒr7Ú_ssockr8Ú_csockÚ _internal_fds)rr%r%r&ršXs    z&BaseProactorEventLoop._close_self_pipecCsFt ¡\|_|_|j d¡|j d¡|jd7_| |j¡dS)NFr)rOZ socketpairr°r±Z setblockingr²rÚ_loop_self_reading)rr%r%r&rŽbs   z%BaseProactorEventLoop._make_self_pipec Cs„y$|dk r| ¡|j |jd¡}WnHtjk r:dStk rl}z| d||dœ¡Wdd}~XYnX||_|  |j ¡dS)Niz.Error on reading from the event loop self pipe)r@rAr) rcrdrer°rrhr_rFrŒrir³)rr{rHr%r%r&r³jsz(BaseProactorEventLoop._loop_self_readingcCs>y|j d¡Wn(tk r8|jr4tjdddYnXdS)Nóz3Fail to write a null byte into the self-pipe socketT)r?)r±rzrCÚ_debugr rE)rr%r%r&Ú_write_to_self|s z$BaseProactorEventLoop._write_to_selfédcs(d‡‡‡‡‡‡‡fdd„ ‰ˆ ˆ¡dS)Nc s$yˆ|dk rn| ¡\}}ˆjr,t dˆ||¡ˆƒ}ˆdk rXˆj||ˆdd|iˆˆdnˆj||d|iˆdˆ ¡rzdSˆj ˆ¡}Wn~t k rè}zBˆ  ¡dkrˆ  d|ˆdœ¡ˆ  ¡nˆjrØtjd ˆdd Wdd}~XYn8t jk rˆ  ¡YnX|ˆjˆ  ¡<| ˆ¡dS) Nz#%r got a new connection from %r: %rTrˆ)rr"r#r’)r"r#éÿÿÿÿzAccept failed on a socket)r@rArOzAccept failed on socket %r)r?)rcrµr rEr”rr˜rdr rCr,rFr8rrhrri)r{ZconnZaddrr rH)rÚprotocol_factoryrr#rr’r“r%r&r‰s@      z2BaseProactorEventLoop._start_serving..loop)N)r)rr¹rr“r#Zbacklogr’r%)rr¹rr#rr’r“r&Ú_start_serving…s%z$BaseProactorEventLoop._start_servingcCsdS)Nr%)rZ event_listr%r%r&Ú_process_events°sz%BaseProactorEventLoop._process_eventscCs*x|j ¡D] }| ¡q W|j ¡dS)N)rÚvaluesr7Úclear)rÚfuturer%r%r&r™´s z*BaseProactorEventLoop._stop_accept_futurescCs6|j | ¡d¡}|r| ¡|j |¡| ¡dS)N)rÚpopr,r7rdÚ _stop_servingr8)rrr¾r%r%r&rÀ¹s  z#BaseProactorEventLoop._stop_serving)NNN)N)NN)NN)NN)N)NNr·N)r*rRrSrrr”r•r–r—r8rœrržrŸr¡r®r¯ršrŽr³r¶rºr»r™rÀrUr%r%)r$r&rás<            )r)rTÚ__all__r¢r¤rOr:Úrrrrrr r Úlogr Z_FlowControlMixinZ BaseTransportr Z ReadTransportrVZWriteTransportrkrZ Transportr…r‡Z BaseEventLooprr%r%r%r&Ús:          m  '