Yf]#@sddlZddlZddlZddlmZddlmZddlmZddlmZddl m Z Gdd d ej Z Gd d d ej ZGd d d eejZdS)N)compat) protocols) transports) coroutine)loggercsEeZdZddfddZddZddZdd Zd d Zd d ZddZ e j rddZ ddZ ddZddZddZddZddZddZed d!Zd"d#Zd$d%Zd&d'Zd(d)Zed*d+Zd,d-Zd.d/ZS)0BaseSubprocessTransportNc  stj| d|_||_||_d|_d|_d|_g|_t j |_ i|_ d|_ |tjkrd|j d<|tjkrd|j d<|tjkrd|j d ) r.__name__rappendrrrgetpipejoin)r)infor r rr/r/r0__repr__9s,      z BaseSubprocessTransport.__repr__cKs tdS)N)NotImplementedError)r)r r r r rrr-r/r/r0r VszBaseSubprocessTransport._startcCs ||_dS)N)r)r)r+r/r/r0 set_protocolYsz$BaseSubprocessTransport.set_protocolcCs|jS)N)r)r)r/r/r0 get_protocol\sz$BaseSubprocessTransport.get_protocolcCs|jS)N)r)r)r/r/r0 is_closing_sz"BaseSubprocessTransport.is_closingc Cs|jr dSd|_x3|jjD]"}|dkr;q&|jjq&W|jdk r|jdkr|jjdkr|jj rt j d|y|jj Wnt k rYnXdS)NTz$Close running child process: kill %r)rrvaluesr6r!rrZpollrr#rZwarningkillProcessLookupError)r)protor/r/r0r!bs     zBaseSubprocessTransport.closecCs+|js'tjd|t|jdS)Nzunclosed transport %r)rwarningswarnResourceWarningr!)r)r/r/r0__del__s zBaseSubprocessTransport.__del__cCs|jS)N)r)r)r/r/r0get_pidszBaseSubprocessTransport.get_pidcCs|jS)N)r)r)r/r/r0get_returncodesz&BaseSubprocessTransport.get_returncodecCs%||jkr|j|jSdSdS)N)rr6)r)fdr/r/r0get_pipe_transportsz*BaseSubprocessTransport.get_pipe_transportcCs|jdkrtdS)N)rr@)r)r/r/r0 _check_procsz#BaseSubprocessTransport._check_proccCs|j|jj|dS)N)rJr send_signal)r)signalr/r/r0rKs z#BaseSubprocessTransport.send_signalcCs|j|jjdS)N)rJr terminate)r)r/r/r0rMs z!BaseSubprocessTransport.terminatecCs|j|jjdS)N)rJrr?)r)r/r/r0r?s zBaseSubprocessTransport.killc #sy7j}j}|jdk r]|jfdd|jEdH\}}|jd<|jdk r|jfdd|jEdH\}}|jd<|jdk r|jfdd|jEdH\}}|jd<|jj j x'j D]\}}|j||q Wd_ WnKt k r}z+|dk rr|j rr|j|WYdd}~Xn'X|dk r|j r|jddS)Ncs tdS)Nr)WriteSubprocessPipeProtor/)r)r/r0sz8BaseSubprocessTransport._connect_pipes..rcs tdS)Nr)ReadSubprocessPipeProtor/)r)r/r0rOsrcs tdS)Nr )rPr/)r)r/r0rOsr )rrr Zconnect_write_piperr Zconnect_read_piper call_soonrconnection_mader Exception cancelledZ set_exception set_result) r)r,procr*_r6callbackdataexcr/)r)r0r(s6       z&BaseSubprocessTransport._connect_pipescGs?|jdk r(|jj||fn|jj||dS)N)rr4rrQ)r)cbrYr/r/r0_callszBaseSubprocessTransport._callcCs'|j|jj|||jdS)N)r\rZpipe_connection_lost _try_finish)r)rHrZr/r/r0_pipe_connection_lostsz-BaseSubprocessTransport._pipe_connection_lostcCs|j|jj||dS)N)r\rZpipe_data_received)r)rHrYr/r/r0_pipe_data_receivedsz+BaseSubprocessTransport._pipe_data_receivedcCs|jjr"tjd||||_|jjdkrI||j_|j|jj |j x*|j D]}|j sp|j |qpWd|_ dS)Nz%r exited with return code %r)rr#rr8rr returncoder\rZprocess_exitedr]rrTrU)r)r`r,r/r/r0_process_exiteds      z'BaseSubprocessTransport._process_exitedccs>|jdk r|jS|jj}|jj||EdHS)zdWait until the process exit and return the process return code. This method is a coroutine.N)rrZ create_futurerr4)r)r,r/r/r0_waits zBaseSubprocessTransport._waitcCsU|jdkrdStdd|jjDrQd|_|j|jddS)Ncss$|]}|dk o|jVqdS)N) disconnected).0pr/r/r0 sz6BaseSubprocessTransport._try_finish..T)rallrr>rr\_call_connection_lost)r)r/r/r0r]s   z#BaseSubprocessTransport._try_finishc Cs7z|jj|Wdd|_d|_d|_XdS)N)rconnection_lostrr)r)rZr/r/r0rhs   z-BaseSubprocessTransport._call_connection_lost)r3 __module__ __qualname__rr9r r;r<r=r!rZPY34rErFrGrIrJrKrMr?rr(r\r^r_rarbr]rhr/r/)r.r0r s0 )               %     rc@sXeZdZddZddZddZddZd d Zd d Zd S)rNcCs(||_||_d|_d|_dS)NF)rVrHr6rc)r)rVrHr/r/r0rs   z!WriteSubprocessPipeProto.__init__cCs ||_dS)N)r6)r)Z transportr/r/r0rR sz(WriteSubprocessPipeProto.connection_madecCsd|jj|j|jfS)Nz<%s fd=%s pipe=%r>)r.r3rHr6)r)r/r/r0r9sz!WriteSubprocessPipeProto.__repr__cCs,d|_|jj|j|d|_dS)NT)rcrVr^rH)r)rZr/r/r0ris z(WriteSubprocessPipeProto.connection_lostcCs|jjjdS)N)rVr pause_writing)r)r/r/r0rlsz&WriteSubprocessPipeProto.pause_writingcCs|jjjdS)N)rVrresume_writing)r)r/r/r0rmsz'WriteSubprocessPipeProto.resume_writingN) r3rjrkrrRr9rirlrmr/r/r/r0rNs      rNc@seZdZddZdS)rPcCs|jj|j|dS)N)rVr_rH)r)rYr/r/r0 data_received#sz%ReadSubprocessPipeProto.data_receivedN)r3rjrkrnr/r/r/r0rP s rP)rrrBrrrZ coroutinesrlogrZSubprocessTransportrZ BaseProtocolrNZProtocolrPr/r/r/r0s