U Å:âe‹"ã@sxddlZddlZddlZddlmZddlmZddlmZGdd„dejƒZ Gdd „d ej ƒZ Gd d „d e ej ƒZ dS) éNé)Ú protocols)Ú transports)ÚloggercsÔeZdZd0‡fdd„ Zdd„Zdd„Zdd „Zd d „Zd d „Zdd„Z e j fdd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„Z‡ZS)1ÚBaseSubprocessTransportNc s&tƒ | ¡d|_||_||_d|_d|_d|_g|_t   ¡|_ i|_ d|_ |tjkr`d|j d<|tjkrtd|j d<|tjkrˆd|j d<z"|jf||||||dœ| —ŽWn| ¡‚YnX|jj|_|j|jd<|j ¡rt|ttfƒrø|} n|d} t d| |j¡|j | | ¡¡dS)NFrré)ÚargsÚshellÚstdinÚstdoutÚstderrÚbufsizeÚ subprocesszprocess %r created: pid %s)ÚsuperÚ__init__Ú_closedÚ _protocolÚ_loopÚ_procÚ_pidÚ _returncodeÚ _exit_waitersÚ collectionsÚdequeÚ_pending_callsÚ_pipesÚ _finishedrÚPIPEÚ_startÚcloseÚpidZ_extraÚ get_debugÚ isinstanceÚbytesÚstrrÚdebugZ create_taskÚ_connect_pipes) ÚselfÚloopÚprotocolrr r r r r ÚwaiterÚextraÚkwargsZprogram©Ú __class__©úú ) r.Ú__name__rÚappendrrrÚgetÚpipeÚformatÚjoin)r'Úinfor r r r/r/r0Ú__repr__7s,           z BaseSubprocessTransport.__repr__cKst‚dS©N)ÚNotImplementedError)r'rr r r r r r,r/r/r0rTszBaseSubprocessTransport._startcCs ||_dSr<©r)r'r)r/r/r0Ú set_protocolWsz$BaseSubprocessTransport.set_protocolcCs|jSr<r>©r'r/r/r0Ú get_protocolZsz$BaseSubprocessTransport.get_protocolcCs|jSr<)rr@r/r/r0Ú is_closing]sz"BaseSubprocessTransport.is_closingcCs”|jr dSd|_|j ¡D]}|dkr(q|j ¡q|jdk r|jdkr|j ¡dkr|j  ¡rlt   d|¡z|j  ¡Wnt k rŽYnXdS)NTz$Close running child process: kill %r)rrÚvaluesr7rrrÚpollrr!rÚwarningÚkillÚProcessLookupError)r'Úprotor/r/r0r`s$  þ û  zBaseSubprocessTransport.closecCs&|js"|d|›t|d| ¡dS)Nzunclosed transport )Úsource)rÚResourceWarningr)r'Ú_warnr/r/r0Ú__del__{szBaseSubprocessTransport.__del__cCs|jSr<)rr@r/r/r0Úget_pid€szBaseSubprocessTransport.get_pidcCs|jSr<)rr@r/r/r0Úget_returncodeƒsz&BaseSubprocessTransport.get_returncodecCs||jkr|j|jSdSdSr<)rr7)r'Úfdr/r/r0Úget_pipe_transport†s  z*BaseSubprocessTransport.get_pipe_transportcCs|jdkrtƒ‚dSr<)rrGr@r/r/r0Ú _check_procŒs z#BaseSubprocessTransport._check_proccCs| ¡|j |¡dSr<)rQrÚ send_signal)r'Úsignalr/r/r0rRsz#BaseSubprocessTransport.send_signalcCs| ¡|j ¡dSr<)rQrÚ terminater@r/r/r0rT”sz!BaseSubprocessTransport.terminatecCs| ¡|j ¡dSr<)rQrrFr@r/r/r0rF˜szBaseSubprocessTransport.killc ƒs`zâˆj}ˆj}|jdk rB| ‡fdd„|j¡IdH\}}|ˆjd<|jdk rv| ‡fdd„|j¡IdH\}}|ˆjd<|jdk rª| ‡fdd„|j¡IdH\}}|ˆjd<| ˆj j ˆ¡ˆj D]\}}|j|f|žŽqÀdˆ_ WnZt t fk rü‚Yn`tk r<}z"|dk r,| ¡s,| |¡W5d}~XYn X|dk r\| ¡s\| d¡dS)Ncs tˆdƒS)Nr)ÚWriteSubprocessPipeProtor/r@r/r0Ú£óz8BaseSubprocessTransport._connect_pipes..rcs tˆdƒS)Nr©ÚReadSubprocessPipeProtor/r@r/r0rV©rWrcs tˆdƒS)NrrXr/r@r/r0rV¯rWr)rrr Zconnect_write_piperr Zconnect_read_piper Ú call_soonrÚconnection_maderÚ SystemExitÚKeyboardInterruptÚ BaseExceptionÚ cancelledÚ set_exceptionÚ set_result) r'r*Úprocr(Ú_r7ÚcallbackÚdataÚexcr/r@r0r&œs@  þ   þ   þ  z&BaseSubprocessTransport._connect_pipescGs2|jdk r|j ||f¡n|jj|f|žŽdSr<)rr5rrZ)r'Úcbrer/r/r0Ú_callÂs zBaseSubprocessTransport._callcCs| |jj||¡| ¡dSr<)rhrZpipe_connection_lostÚ _try_finish)r'rOrfr/r/r0Ú_pipe_connection_lostÈsz-BaseSubprocessTransport._pipe_connection_lostcCs| |jj||¡dSr<)rhrZpipe_data_received)r'rOrer/r/r0Ú_pipe_data_receivedÌsz+BaseSubprocessTransport._pipe_data_receivedcCsp|j ¡rt d||¡||_|jjdkr2||j_| |jj ¡|  ¡|j D]}|  ¡sN|  |¡qNd|_ dS)Nz%r exited with return code %r)rr!rr:rrÚ returncoderhrZprocess_exitedrirr_ra)r'rlr*r/r/r0Ú_process_exitedÏs    z'BaseSubprocessTransport._process_exitedcÃs0|jdk r|jS|j ¡}|j |¡|IdHS)zdWait until the process exit and return the process return code. This method is a coroutine.N)rrZ create_futurerr5)r'r*r/r/r0Ú_waitâs    zBaseSubprocessTransport._waitcCs>|jdkrdStdd„|j ¡Dƒƒr:d|_| |jd¡dS)Ncss|]}|dk o|jVqdSr<)Ú disconnected)Ú.0Úpr/r/r0Ú ñsÿz6BaseSubprocessTransport._try_finish..T)rÚallrrCrrhÚ_call_connection_lostr@r/r/r0riís ÿz#BaseSubprocessTransport._try_finishcCs*z|j |¡W5d|_d|_d|_XdSr<)rrrÚconnection_lost©r'rfr/r/r0rtös z-BaseSubprocessTransport._call_connection_lost)NN)r4Ú __module__Ú __qualname__rr;rr?rArBrÚwarningsÚwarnrLrMrNrPrQrRrTrFr&rhrjrkrmrnrirtÚ __classcell__r/r/r-r0r s2þ+&  rc@s<eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd S)rUcCs||_||_d|_d|_dS)NF)rbrOr7ro)r'rbrOr/r/r0rsz!WriteSubprocessPipeProto.__init__cCs ||_dSr<)r7)r'Z transportr/r/r0r[sz(WriteSubprocessPipeProto.connection_madecCs d|jj›d|j›d|j›dS)Nú)r.r4rOr7r@r/r/r0r; sz!WriteSubprocessPipeProto.__repr__cCs d|_|j |j|¡d|_dS)NT)rorbrjrOrvr/r/r0ru sz(WriteSubprocessPipeProto.connection_lostcCs|jj ¡dSr<)rbrÚ pause_writingr@r/r/r0r~sz&WriteSubprocessPipeProto.pause_writingcCs|jj ¡dSr<)rbrÚresume_writingr@r/r/r0rsz'WriteSubprocessPipeProto.resume_writingN) r4rwrxrr[r;rur~rr/r/r/r0rUÿs rUc@seZdZdd„ZdS)rYcCs|j |j|¡dSr<)rbrkrO)r'rer/r/r0Ú data_receivedsz%ReadSubprocessPipeProto.data_receivedN)r4rwrxr€r/r/r/r0rYsrY)rrryÚrrÚlogrZSubprocessTransportrZ BaseProtocolrUZProtocolrYr/r/r/r0Ús   v ÿ