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 #sy@j}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_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)rr4rrO)r*cbrWr/r/r0_callszBaseSubprocessTransport._callcCs'|j|jj|||jdS)N)rZrZpipe_connection_lost _try_finish)r*rFrXr/r/r0_pipe_connection_lostsz-BaseSubprocessTransport._pipe_connection_lostcCs|j|jj||dS)N)rZrZpipe_data_received)r*rFrWr/r/r0_pipe_data_receivedsz+BaseSubprocessTransport._pipe_data_receivedcCs|jjr%tjd||n||_|j|jj|jx-|j D]"}|j sU|j |qUqUWd|_ dS)Nz%r exited with return code %r) rr$rr8rrZrZprocess_exitedr[rrRrS)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._waitcCsX|jdkrdStdd|jjDrTd|_|j|jdndS)Ncss$|]}|dk o|jVqdS)N) disconnected).0pr/r/r0 sz6BaseSubprocessTransport._try_finish..T)rallrr<rrZ_call_connection_lost)r*r/r/r0r[s   z#BaseSubprocessTransport._try_finishc Cs7z|jj|Wdd|_d|_d|_XdS)N)rconnection_lostrr)r*rXr/r/r0rfs   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@sXeZdZddZddZddZddZd d Zd d Zd S)rLcCs(||_||_d|_d|_dS)NF)rTrFr6ra)r*rTrFr/r/r0rs   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|jjjdS)N)rTr pause_writing)r*r/r/r0rjsz&WriteSubprocessPipeProto.pause_writingcCs|jjjdS)N)rTrresume_writing)r*r/r/r0rksz'WriteSubprocessPipeProto.resume_writingN) r3rhrirrPr9rgrjrkr/r/r/r0rLs      rLc@seZdZddZdS)rNcCs|jj|j|dS)N)rTr]rF)r*rWr/r/r0 data_receivedsz%ReadSubprocessPipeProto.data_receivedN)r3rhrirlr/r/r/r0rNs rN)rrr@rrrrZ coroutinesrlogrZSubprocessTransportr Z BaseProtocolrLZProtocolrNr/r/r/r0s