j f"@sddlZddlZddlZddlmZddlmZddlmZddlmZddlm Z ddl m Z Gd d d ej Z Gd d d ejZGd ddeejZdS)N)compat)futures) protocols) transports) coroutine)loggercs0eZdZddfddZddZddZdd Zd d Zej rld d Z nddZ ddZ ddZ ddZddZddZddZeddZddZd d!Zd"d#Zd$d%Zed&d'Zd(d)Zd*d+ZS),BaseSubprocessTransportNc  stj| d|_||_||_d|_d|_d|_g|_t j |_ i|_ d|_ |tjkrd|j d ) r.__name__rappendrrrgetpipejoin)r*infor rrr/r/r0__repr__:s,     z BaseSubprocessTransport.__repr__cKs tdS)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|jjD]%}|dkr>q&n|jjq&W|jdk r|jdkr|jjdkr|jj rt j d|ny|jj Wqt k rYqXndS)NTz$Close running child process: kill %r)rrvaluesr6r"rrZpollrr$rZwarningkillProcessLookupError)r*protor/r/r0r"]s     zBaseSubprocessTransport.closecCs.|js*tjd|t|jndS)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|jdkrtndS)N)rr>)r*r/r/r0 _check_procsz#BaseSubprocessTransport._check_proccCs|j|jj|dS)N)rHr send_signal)r*signalr/r/r0rIs z#BaseSubprocessTransport.send_signalcCs|j|jjdS)N)rHr terminate)r*r/r/r0rKs z!BaseSubprocessTransport.terminatecCs|j|jjdS)N)rHrr=)r*r/r/r0r=s zBaseSubprocessTransport.killc #syUj}j}|jdk r`|jfdd|jDdH\}}|jdsz8BaseSubprocessTransport._connect_pipes..rcs tdS)Nr)ReadSubprocessPipeProtor/)r*r/r0rMsrcs tdS)Nr )rNr/)r*r/r0rMsr )rrr Zconnect_write_piperrZconnect_read_piperrAssertionError call_soonrconnection_made Exception cancelledZ set_exception set_result) r*r,procr+_r6callbackdataexcr/)r*r0r)s8   #z&BaseSubprocessTransport._connect_pipescGs?|jdk r(|jj||fn|jj||dS)N)rr4rrP)r*cbrXr/r/r0_callszBaseSubprocessTransport._callcCs'|j|jj|||jdS)N)r[rZpipe_connection_lost _try_finish)r*rFrYr/r/r0_pipe_connection_lostsz-BaseSubprocessTransport._pipe_connection_lostcCs|j|jj||dS)N)r[rZpipe_data_received)r*rFrXr/r/r0_pipe_data_receivedsz+BaseSubprocessTransport._pipe_data_receivedcCs|dk st||jdks6t|j|jjr[tjd||n||_|j|jj|j x-|j D]"}|j s|j |qqWd|_ dS)Nz%r exited with return code %r) rOrrr$rr8r[rZprocess_exitedr\rrSrT)r* returncoder,r/r/r0_process_exiteds     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_waits zBaseSubprocessTransport._waitcCsh|j st|jdkr#dStdd|jjDrdd|_|j|jdndS)Ncss$|]}|dk o|jVqdS)N) disconnected).0pr/r/r0 sz6BaseSubprocessTransport._try_finish..T)rrOrallrr<r[_call_connection_lost)r*r/r/r0r\s  z#BaseSubprocessTransport._try_finishc Cs7z|jj|Wdd|_d|_d|_XdS)N)rconnection_lostrr)r*rYr/r/r0rgs   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@sXeZdZddZddZddZddZd d Zd d Zd S)rLcCs(||_||_d|_d|_dS)NF)rUrFr6rb)r*rUrFr/r/r0rs   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|jjjdS)N)rUr pause_writing)r*r/r/r0rksz&WriteSubprocessPipeProto.pause_writingcCs|jjjdS)N)rUrresume_writing)r*r/r/r0rlsz'WriteSubprocessPipeProto.resume_writingN) r3rirjrrQr9rhrkrlr/r/r/r0rLs      rLc@seZdZddZdS)rNcCs|jj|j|dS)N)rUr^rF)r*rXr/r/r0 data_receivedsz%ReadSubprocessPipeProto.data_receivedN)r3rirjrmr/r/r/r0rNs rN)rrr@rrrrZ coroutinesrlogrZSubprocessTransportr Z BaseProtocolrLZProtocolrNr/r/r/r0s