î j f"ã@sÖddlZddlZddlZddlmZddlmZddlmZddlmZddlm Z ddl m Z Gd d „d ej ƒZ Gd d „d ejƒZGd d„deejƒZdS)éNé)Úcompat)Úfutures)Ú protocols)Ú transports)Ú coroutine)Úloggercs0eZdZdd‡fdd†Zdd„Zdd„Zdd „Zd d „Zej rld d „Z ndd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zedd„ƒZdd„Zd d!„Zd"d#„Zd$d%„Zed&d'„ƒZd(d)„Zd*d+„Z‡S),ÚBaseSubprocessTransportNc  s¦tƒj| ƒd|_||_||_d|_d|_d|_g|_t j ƒ|_ i|_ d|_ |tjkr�d|j dú ) r.Ú__name__rÚappendrrrÚgetÚpipeÚjoin)r*Úinfor rrr/r/r0Ú__repr__:s,     z BaseSubprocessTransport.__repr__cKs t‚dS)N)ÚNotImplementedError)r*r r r rrrr-r/r/r0r!WszBaseSubprocessTransport._startcCs|jS)N)r)r*r/r/r0Ú is_closingZsz"BaseSubprocessTransport.is_closingc CsÑ|jr dSd|_x6|jjƒD]%}|dkr>q&n|jjƒq&W|jdk rÍ|jdkrÍ|jjƒdkrÍ|jj ƒr¤t j d|ƒny|jj ƒWqÍt k rÉYqÍXndS)NTz$Close running child process: kill %r)rrÚvaluesr6r"rrZpollrr$rZwarningÚkillÚProcessLookupError)r*Úprotor/r/r0r"]s     zBaseSubprocessTransport.closecCs.|js*tjd|tƒ|jƒndS)Nzunclosed transport %r)rÚwarningsÚwarnÚResourceWarningr")r*r/r/r0Ú__del__{s zBaseSubprocessTransport.__del__cCs|jS)N)r)r*r/r/r0Úget_pid€szBaseSubprocessTransport.get_pidcCs|jS)N)r)r*r/r/r0Úget_returncodeƒsz&BaseSubprocessTransport.get_returncodecCs%||jkr|j|jSdSdS)N)rr6)r*Úfdr/r/r0Úget_pipe_transport†sz*BaseSubprocessTransport.get_pipe_transportcCs|jdkrtƒ‚ndS)N)rr>)r*r/r/r0Ú _check_procŒsz#BaseSubprocessTransport._check_proccCs|jƒ|jj|ƒdS)N)rHrÚ send_signal)r*Úsignalr/r/r0rI�s z#BaseSubprocessTransport.send_signalcCs|jƒ|jjƒdS)N)rHrÚ terminate)r*r/r/r0rK”s z!BaseSubprocessTransport.terminatecCs|jƒ|jjƒdS)N)rHrr=)r*r/r/r0r=˜s zBaseSubprocessTransport.killc #sÓyUˆj}ˆj}|jdk r`|j‡fdd†|jƒDdH\}}|ˆjd¤sz8BaseSubprocessTransport._connect_pipes..rcs tˆdƒS)Nr)ÚReadSubprocessPipeProtor/)r*r/r0rMªsrcs tˆdƒS)Nr )rNr/)r*r/r0rM°sr )rrr Zconnect_write_piperrZconnect_read_piperrÚAssertionErrorÚ call_soonrÚconnection_madeÚ ExceptionÚ cancelledZ set_exceptionÚ set_result) r*r,Úprocr+Ú_r6ÚcallbackÚdataÚexcr/)r*r0r)œs8   #z&BaseSubprocessTransport._connect_pipescGs?|jdk r(|jj||fƒn|jj||ŒdS)N)rr4rrP)r*ÚcbrXr/r/r0Ú_callÁszBaseSubprocessTransport._callcCs'|j|jj||ƒ|jƒdS)N)r[rZpipe_connection_lostÚ _try_finish)r*rFrYr/r/r0Ú_pipe_connection_lostÇsz-BaseSubprocessTransport._pipe_connection_lostcCs|j|jj||ƒdS)N)r[rZpipe_data_received)r*rFrXr/r/r0Ú_pipe_data_receivedËsz+BaseSubprocessTransport._pipe_data_receivedcCs¾|dk st|ƒ‚|jdks6t|jƒ‚|jjƒr[tjd||ƒn||_|j|jjƒ|j ƒx-|j D]"}|j ƒs‹|j |ƒq‹q‹Wd|_ dS)Nz%r exited with return code %r) rOrrr$rr8r[rZprocess_exitedr\rrSrT)r*Ú returncoder,r/r/r0Ú_process_exitedÎs     z'BaseSubprocessTransport._process_exitedccsD|jdk r|jStjd|jƒ}|jj|ƒ|DdHS)zdWait until the process exit and return the process return code. This method is a coroutine.Nr+)rrZFuturerrr4)r*r,r/r/r0Ú_waitÞs zBaseSubprocessTransport._waitcCsh|j st‚|jdkr#dStdd„|jjƒDƒƒrdd|_|j|jdƒndS)Ncss$|]}|dk o|jVqdS)N)Ú disconnected)Ú.0Úpr/r/r0ú îsz6BaseSubprocessTransport._try_finish..T)rrOrÚallrr<r[Ú_call_connection_lost)r*r/r/r0r\ês  z#BaseSubprocessTransport._try_finishc Cs7z|jj|ƒWdd|_d|_d|_XdS)N)rÚconnection_lostrr)r*rYr/r/r0rgós   z-BaseSubprocessTransport._call_connection_lost)r3Ú __module__Ú __qualname__rr9r!r;r"rZPY34rCrDrErGrHrIrKr=rr)r[r]r^r`rar\rgr/r/)r.r0r s, )            %     r c@sXeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd S)rLcCs(||_||_d|_d|_dS)NF)rUrFr6rb)r*rUrFr/r/r0rþs   z!WriteSubprocessPipeProto.__init__cCs ||_dS)N)r6)r*Z transportr/r/r0rQsz(WriteSubprocessPipeProto.connection_madecCsd|jj|j|jfS)Nz<%s fd=%s pipe=%r>)r.r3rFr6)r*r/r/r0r9sz!WriteSubprocessPipeProto.__repr__cCs,d|_|jj|j|ƒd|_dS)NT)rbrUr]rF)r*rYr/r/r0rh s z(WriteSubprocessPipeProto.connection_lostcCs|jjjƒdS)N)rUrÚ pause_writing)r*r/r/r0rksz&WriteSubprocessPipeProto.pause_writingcCs|jjjƒdS)N)rUrÚresume_writing)r*r/r/r0rlsz'WriteSubprocessPipeProto.resume_writingN) r3rirjrrQr9rhrkrlr/r/r/r0rLüs      rLc@seZdZdd„ZdS)rNcCs|jj|j|ƒdS)N)rUr^rF)r*rXr/r/r0Ú data_receivedsz%ReadSubprocessPipeProto.data_receivedN)r3rirjrmr/r/r/r0rNs rN)rrr@ÚrrrrZ coroutinesrÚlogrZSubprocessTransportr Z BaseProtocolrLZProtocolrNr/r/r/r0Ús   ï