grthtrhthjhtyjytjytkergtrhtrjytjerhrfh3 \³Oã@sþdZdgZddlZddlZddlmZddlmZddlmZddlmZdd lm Z dd lm Z dd l m Z Gd d „d e j e 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)Úcompat)Ú constants)Úfutures)Ússlproto)Ú transports)Úloggercs‚eZdZdZd‡fdd„ Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z e j rXdd„Z ddd„Zdd„Zdd„Zdd„Z‡ZS)Ú_ProactorBasePipeTransportz*Base class for pipe and socket transports.Ncs˜tƒj||ƒ|j|ƒ||_||_||_d|_d|_d|_d|_ d|_ d|_ d|_ |jdk rh|jj ƒ|jj|jj|ƒ|dk r”|jjtj|dƒdS)NrF)ÚsuperÚ__init__Ú _set_extraÚ_sockÚ _protocolÚ_serverÚ_bufferÚ _read_futÚ _write_futÚ_pending_writeÚ _conn_lostÚ_closingÚ _eof_writtenZ_attachÚ_loopÚ call_soonZconnection_maderZ_set_result_unless_cancelled)ÚselfÚloopÚsockÚprotocolÚwaiterÚextraÚserver)Ú __class__©ú//usr/lib64/python3.6/asyncio/proactor_events.pyr s$    z#_ProactorBasePipeTransport.__init__cCs¾|jjg}|jdkr |jdƒn|jr0|jdƒ|jdk rN|jd|jjƒƒ|jdk rh|jd|jƒ|jdk r‚|jd|jƒ|jr t |jƒ}|jd|ƒ|j r°|jdƒdd j |ƒS) NÚclosedÚclosingzfd=%szread=%szwrite=%rzwrite_bufsize=%sz EOF writtenz<%s>ú ) r"Ú__name__rÚappendrÚfilenorrrÚlenrÚjoin)rÚinfoÚbufsizer#r#r$Ú__repr__/s"         z#_ProactorBasePipeTransport.__repr__cCs||jd<dS)NÚpipe)Ú_extra)rrr#r#r$rBsz%_ProactorBasePipeTransport._set_extracCs ||_dS)N)r)rrr#r#r$Ú set_protocolEsz'_ProactorBasePipeTransport.set_protocolcCs|jS)N)r)rr#r#r$Ú get_protocolHsz'_ProactorBasePipeTransport.get_protocolcCs|jS)N)r)rr#r#r$Ú is_closingKsz%_ProactorBasePipeTransport.is_closingcCs^|jr dSd|_|jd7_|j r@|jdkr@|jj|jdƒ|jdk rZ|jjƒd|_dS)NTr) rrrrrrÚ_call_connection_lostrÚcancel)rr#r#r$ÚcloseNs  z _ProactorBasePipeTransport.closecCs*|jdk r&tjd|t|d�|jƒdS)Nzunclosed transport %r)Úsource)rÚwarningsÚwarnÚResourceWarningr7)rr#r#r$Ú__del__]s  z"_ProactorBasePipeTransport.__del__úFatal error on pipe transportcCsPt|tjƒr*|jjƒrBtjd||dd�n|jj||||jdœƒ|j |ƒdS)Nz%r: %sT)Úexc_info)ÚmessageÚ exceptionZ transportr) Ú isinstancerZ_FATAL_ERROR_IGNORErÚ get_debugr ÚdebugÚcall_exception_handlerrÚ _force_close)rÚexcr?r#r#r$Ú _fatal_errorcs   z'_ProactorBasePipeTransport._fatal_errorcCsj|jr dSd|_|jd7_|jr4|jjƒd|_|jrJ|jjƒd|_d|_d|_|jj|j |ƒdS)NTrr) rrrr6rrrrrr5)rrFr#r#r$rEps  z'_ProactorBasePipeTransport._force_closec Cs^z|jj|ƒWdt|jdƒr,|jjtjƒ|jjƒd|_|j}|dk rX|j ƒd|_XdS)NÚshutdown) rZconnection_lostÚhasattrrrHÚsocketZ SHUT_RDWRr7rZ_detach)rrFr!r#r#r$r5s  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__r r/rr2r3r4r7rZPY34r<rGrEr5rLÚ __classcell__r#r#)r"r$r s r cs<eZdZdZd ‡fdd„ Zdd„Zdd„Zd d d „Z‡ZS) Ú_ProactorReadPipeTransportzTransport for read pipes.Ncs4tƒj||||||ƒd|_d|_|jj|jƒdS)NF)r r Ú_pausedÚ_reschedule_on_resumerrÚ _loop_reading)rrrrrr r!)r"r#r$r ›sz#_ProactorReadPipeTransport.__init__cCs0|js |jrdSd|_|jjƒr,tjd|ƒdS)NTz%r pauses reading)rrRrrBr rC)rr#r#r$Ú pause_reading¢s   z(_ProactorReadPipeTransport.pause_readingcCsP|js|j rdSd|_|jr6|jj|j|jƒd|_|jjƒrLtj d|ƒdS)NFz%r resumes reading) rrRrSrrrTrrBr rC)rr#r#r$Úresume_reading©s z)_ProactorReadPipeTransport.resume_readingcCs¬|jrd|_dSd}�z@yf|dk rN|j|ks@|jdkr<|js@t‚d|_|jƒ}|jr\d}dS|dkrhdS|jjj|j dƒ|_WnÆt k rÌ}z2|js¤|j |dƒn|jj ƒr¼t jddd�WYdd}~Xnˆtk rö}z|j|ƒWYdd}~Xn^tk �r$}z|j |dƒWYdd}~Xn0tjk �rD|j�s@‚YnX|jj|jƒWd|�rl|jj|ƒn:|dk �r¦|jj ƒ�rŽt jd|ƒ|jjƒ}|�s¦|jƒXdS)NTóiz"Fatal read error on pipe transportz*Read error on pipe transport while closing)r>z%r received EOF)rRrSrrÚAssertionErrorÚresultrÚ _proactorÚrecvrÚConnectionAbortedErrorrGrBr rCÚConnectionResetErrorrEÚOSErrorrÚCancelledErrorÚadd_done_callbackrTrZ data_receivedZ eof_receivedr7)rÚfutÚdatarFZ keep_openr#r#r$rT³sL      z(_ProactorReadPipeTransport._loop_reading)NNN)N) r(rMrNrOr rUrVrTrPr#r#)r"r$rQ—s  rQc@s:eZdZdZdd„Zd dd„Zdd„Zd d „Zd d „ZdS)Ú_ProactorBaseWritePipeTransportzTransport for write pipes.cCsÆt|tttfƒs&dt|ƒj}t|ƒ‚|jr4tdƒ‚|sÚpeernamezgetpeername() failed on %r) r1Z getsocknamerJÚerrorÚAttributeErrorrrBr rjZ getpeername)rrr#r#r$rfs    z#_ProactorSocketTransport._set_extracCsdS)NTr#)rr#r#r$rtvsz&_ProactorSocketTransport.can_write_eofcCs2|js |jrdSd|_|jdkr.|jjtjƒdS)NT)rrrrrHrJrp)rr#r#r$ruys   z"_ProactorSocketTransport.write_eof)NNN) r(rMrNrOr rrtrurPr#r#)r"r$r\s rcsÒeZdZ‡fdd„Zd-dd„Zd.dddddœdd „Zd/d d „Zd0d d „Zd1dd„Z‡fdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zd2d d!„Zd"d#„Zd3d%d&„Zd'd(„Zd)d*„Zd+d,„Z‡ZS)4rcsHtƒjƒtjd|jjƒ||_||_d|_i|_ |j |ƒ|j ƒdS)NzUsing proactor: %s) r r r rCr"r(rZÚ _selectorÚ_self_reading_futureÚ_accept_futuresZset_loopÚ_make_self_pipe)rZproactor)r"r#r$r ƒs  zBaseProactorEventLoop.__init__NcCst||||||ƒS)N)r)rrrrr r!r#r#r$Ú_make_socket_transport�s z,BaseProactorEventLoop._make_socket_transportF)Ú server_sideÚserver_hostnamer r!c Cs<tjƒstdƒ‚tj||||||ƒ} t||| ||d�| jS)NzOProactor event loop requires Python 3.5 or newer (ssl.MemoryBIO) to support SSL)r r!)rZ_is_sslproto_availabler~Z SSLProtocolrZ_app_transport) rZrawsockrÚ sslcontextrrˆr‰r r!Z ssl_protocolr#r#r$Ú_make_ssl_transport’s  z)BaseProactorEventLoop._make_ssl_transportcCst|||||ƒS)N)r})rrrrr r#r#r$Ú_make_duplex_pipe_transport sz1BaseProactorEventLoop._make_duplex_pipe_transportcCst|||||ƒS)N)rQ)rrrrr r#r#r$Ú_make_read_pipe_transport¥sz/BaseProactorEventLoop._make_read_pipe_transportcCst|||||ƒS)N)rw)rrrrr r#r#r$Ú_make_write_pipe_transport©sz0BaseProactorEventLoop._make_write_pipe_transportcsP|jƒrtdƒ‚|jƒrdS|jƒ|jƒ|jjƒd|_d|_tƒjƒdS)Nz!Cannot close a running event loop) Z is_runningriÚ is_closedÚ_stop_accept_futuresÚ_close_self_piperZr7rƒr )r)r"r#r$r7¯s zBaseProactorEventLoop.closecCs|jj||ƒS)N)rZr[)rrÚnr#r#r$Ú sock_recvÁszBaseProactorEventLoop.sock_recvcCs|jj||ƒS)N)rZrq)rrrbr#r#r$Ú sock_sendallÄsz"BaseProactorEventLoop.sock_sendallcCs|jj||ƒS)N)rZZconnect)rrZaddressr#r#r$Ú sock_connectÇsz"BaseProactorEventLoop.sock_connectcCs |jj|ƒS)N)rZÚaccept)rrr#r#r$Ú sock_acceptÊsz!BaseProactorEventLoop.sock_acceptcCst‚dS)N)r~)rr#r#r$Ú _socketpairÍsz!BaseProactorEventLoop._socketpaircCsL|jdk r|jjƒd|_|jjƒd|_|jjƒd|_|jd8_dS)Nr)r„r6Ú_ssockr7Ú_csockÚ _internal_fds)rr#r#r$r‘Ðs    z&BaseProactorEventLoop._close_self_pipecCsF|jƒ\|_|_|jjdƒ|jjdƒ|jd7_|j|jƒdS)NFr)r˜r™ršZ setblockingr›rÚ_loop_self_reading)rr#r#r$r†Ús   z%BaseProactorEventLoop._make_self_pipecCs„y$|dk r|jƒ|jj|jdƒ}WnHtjk r:dStk rl}z|jd||dœƒWYdd}~XnX||_|j |j ƒdS)Niz.Error on reading from the event loop self pipe)r?r@r) rYrZr[r™rr_Ú ExceptionrDr„r`rœ)rrsrFr#r#r$rœâsz(BaseProactorEventLoop._loop_self_readingcCs|jjdƒdS)Nó)ršrq)rr#r#r$Ú_write_to_selfôsz$BaseProactorEventLoop._write_to_selfédcs&d‡‡‡‡‡‡fdd„ ‰ˆjˆƒdS)Ncs"y†|dk rl|jƒ\}}ˆjr,tjdˆ||ƒˆƒ}ˆdk rVˆj||ˆdd|iˆd�nˆj||d|iˆd�ˆjƒrxdSˆjjˆƒ}Wn~t k ræ}zDˆj ƒd krÀˆj d|ˆdœƒˆj ƒnˆjrÖtjd ˆdd �WYdd}~Xn8t jk �rˆj ƒYnX|ˆjˆj ƒ<|jˆƒdS) Nz#%r got a new connection from %r: %rTr€)rˆr r!)r r!rzAccept failed on a socket)r?r@rJzAccept failed on socket %r)r>éÿÿÿÿ)rYZ_debugr rCr‹r‡r�rZr–r^r*rDr7rr_r…r`)rsZconnZaddrrrF)rÚprotocol_factoryrr!rrŠr#r$rús>     z2BaseProactorEventLoop._start_serving..loop)N)r)rr¢rrŠr!Zbacklogr#)rr¢rr!rrŠr$Ú_start_serving÷s$z$BaseProactorEventLoop._start_servingcCsdS)Nr#)rZ event_listr#r#r$Ú_process_events sz%BaseProactorEventLoop._process_eventscCs*x|jjƒD] }|jƒq W|jjƒdS)N)r…Úvaluesr6Úclear)rZfuturer#r#r$r�$s z*BaseProactorEventLoop._stop_accept_futurescCs |jƒ|jj|ƒ|jƒdS)N)r�rZÚ _stop_servingr7)rrr#r#r$r§)s z#BaseProactorEventLoop._stop_serving)NNN)N)NN)NN)NN)N)NNr )r(rMrNr r‡r‹rŒr�rŽr7r“r”r•r—r˜r‘r†rœrŸr£r¤r�r§rPr#r#)r"r$r�s4          ()rOÚ__all__rJr9Úrrrrrr Úlogr Z_FlowControlMixinZ BaseTransportr Z ReadTransportrQZWriteTransportrcrwZ Transportr}rZ BaseEventLooprr#r#r#r$Ús2        M T  #