î 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¾y@ˆ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_piperÚ call_soonrÚconnection_maderÚ ExceptionÚ cancelledZ set_exceptionÚ set_result) r*r,Úprocr+Ú_r6ÚcallbackÚdataÚexcr/)r*r0r)œs6   #z&BaseSubprocessTransport._connect_pipescGs?|jdk r(|jj||fƒn|jj||ŒdS)N)rr4rrO)r*ÚcbrWr/r/r0Ú_callÁszBaseSubprocessTransport._callcCs'|j|jj||ƒ|jƒdS)N)rZrZpipe_connection_lostÚ _try_finish)r*rFrXr/r/r0Ú_pipe_connection_lostÇsz-BaseSubprocessTransport._pipe_connection_lostcCs|j|jj||ƒdS)N)rZrZpipe_data_received)r*rFrWr/r/r0Ú_pipe_data_receivedËsz+BaseSubprocessTransport._pipe_data_receivedcCsˆ|jjƒr%tjd||ƒn||_|j|jjƒ|jƒx-|j D]"}|j ƒsU|j |ƒqUqUWd|_ dS)Nz%r exited with return code %r) rr$rr8rrZrZprocess_exitedr[rrRrS)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._waitcCsX|jdkrdStdd„|jjƒDƒƒrTd|_|j|jdƒndS)Ncss$|]}|dk o|jVqdS)N)Ú disconnected)Ú.0Úpr/r/r0ú îsz6BaseSubprocessTransport._try_finish..T)rÚallrr<rrZÚ_call_connection_lost)r*r/r/r0r[ês   z#BaseSubprocessTransport._try_finishc Cs7z|jj|ƒWdd|_d|_d|_XdS)N)rÚconnection_lostrr)r*rXr/r/r0rfós   z-BaseSubprocessTransport._call_connection_lost)r3Ú __module__Ú __qualname__rr9r!r;r"rZPY34rCrDrErGrHrIrKr=rr)rZr\r]r_r`r[rfr/r/)r.r0r s, )            %     r c@sXeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd S)rLcCs(||_||_d|_d|_dS)NF)rTrFr6ra)r*rTrFr/r/r0rþs   z!WriteSubprocessPipeProto.__init__cCs ||_dS)N)r6)r*Z transportr/r/r0rPsz(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)rarTr\rF)r*rXr/r/r0rg s z(WriteSubprocessPipeProto.connection_lostcCs|jjjƒdS)N)rTrÚ pause_writing)r*r/r/r0rjsz&WriteSubprocessPipeProto.pause_writingcCs|jjjƒdS)N)rTrÚresume_writing)r*r/r/r0rksz'WriteSubprocessPipeProto.resume_writingN) r3rhrirrPr9rgrjrkr/r/r/r0rLüs      rLc@seZdZdd„ZdS)rNcCs|jj|j|ƒdS)N)rTr]rF)r*rWr/r/r0Ú data_receivedsz%ReadSubprocessPipeProto.data_receivedN)r3rhrirlr/r/r/r0rNs rN)rrr@ÚrrrrZ coroutinesrÚlogrZSubprocessTransportr Z BaseProtocolrLZProtocolrNr/r/r/r0Ús   ï