ñÕYf]#ã@sÆddlZddlZddlZddlmZddlmZddlmZddlmZddl m Z Gdd „d ej ƒZ Gd d „d ej ƒZGd d „d eejƒZdS)éNé)Úcompat)Ú protocols)Ú transports)Ú coroutine)ÚloggercsEeZdZdd‡fdd†Zdd„Zdd„Zdd „Zd d „Zd d „Zdd„Z e j r�dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zed d!„ƒZd"d#„Zd$d%„Zd&d'„Zd(d)„Zed*d+„ƒZd,d-„Zd.d/„Z‡S)0ÚBaseSubprocessTransportNc  sštƒj| ƒd|_||_||_d|_d|_d|_g|_t j ƒ|_ i|_ d|_ |tjkrŒd|j d<|tjkr¨d|j d<|tjkrÄd|j dú ) r.Ú__name__rÚappendrrrÚgetÚpipeÚjoin)r)Úinfor r rr/r/r0Ú__repr__9s,      z BaseSubprocessTransport.__repr__cKs t‚dS)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|jjƒD]"}|dkr;q&|jjƒq&W|jdk rÄ|jdkrÄ|jjƒdkrÄ|jj ƒržt j d|ƒy|jj ƒWnt k rÃYnXdS)NTz$Close running child process: kill %r)rrÚvaluesr6r!rrZpollrr#rZwarningÚkillÚProcessLookupError)r)Úprotor/r/r0r!bs     zBaseSubprocessTransport.closecCs+|js'tjd|tƒ|jƒdS)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ƒ‚dS)N)rr@)r)r/r/r0Ú _check_proc‘sz#BaseSubprocessTransport._check_proccCs|jƒ|jj|ƒdS)N)rJrÚ send_signal)r)Úsignalr/r/r0rK•s z#BaseSubprocessTransport.send_signalcCs|jƒ|jjƒdS)N)rJrÚ terminate)r)r/r/r0rM™s z!BaseSubprocessTransport.terminatecCs|jƒ|jjƒdS)N)rJrr?)r)r/r/r0r?�s zBaseSubprocessTransport.killc #sÄyLˆj}ˆj}|jdk r]|j‡fdd†|jƒEdH\}}|ˆjd<|jdk r¥|j‡fdd†|jƒEdH\}}|ˆjd<|jdk rí|j‡fdd†|jƒEdH\}}|ˆjd<ˆjdk st ‚|j ˆj j ˆƒx'ˆjD]\}}|j ||Œq"Wdˆ_WnKt k r™}z+|dk r‡|jƒ r‡|j|ƒWYdd}~Xn'X|dk rÀ|jƒ rÀ|jdƒdS)Ncs tˆdƒS)Nr)ÚWriteSubprocessPipeProtor/)r)r/r0Ú©sz8BaseSubprocessTransport._connect_pipes..rcs tˆdƒS)Nr)ÚReadSubprocessPipeProtor/)r)r/r0rO¯srcs tˆdƒS)Nr )rPr/)r)r/r0rOµsr )rrr Zconnect_write_piperr Zconnect_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)rr4rrR)r)ÚcbrZr/r/r0Ú_callÆszBaseSubprocessTransport._callcCs'|j|jj||ƒ|jƒdS)N)r]rZpipe_connection_lostÚ _try_finish)r)rHr[r/r/r0Ú_pipe_connection_lostÌsz-BaseSubprocessTransport._pipe_connection_lostcCs|j|jj||ƒdS)N)r]rZpipe_data_received)r)rHrZr/r/r0Ú_pipe_data_receivedÐsz+BaseSubprocessTransport._pipe_data_receivedcCsÖ|dk st|ƒ‚|jdks6t|jƒ‚|jjƒrXtjd||ƒ||_|jjdkr||j_|j|j j ƒ|j ƒx*|j D]}|j ƒs¦|j|ƒq¦Wd|_ dS)Nz%r exited with return code %r)rQrrr#rr8rÚ returncoder]rZprocess_exitedr^rrUrV)r)rar,r/r/r0Ú_process_exitedÓs      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Ú_waitçs zBaseSubprocessTransport._waitcCse|j st‚|jdkr#dStdd„|jjƒDƒƒrad|_|j|jdƒdS)Ncss$|]}|dk o|jVqdS)N)Ú disconnected)Ú.0Úpr/r/r0ú ÷sz6BaseSubprocessTransport._try_finish..T)rrQrÚ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)r[r/r/r0riüs   z-BaseSubprocessTransport._call_connection_lost)r3Ú __module__Ú __qualname__rr9r r;r<r=r!rZPY34rErFrGrIrJrKrMr?rr(r]r_r`rbrcr^rir/r/)r.r0r s0 )               %     rc@sXeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd S)rNcCs(||_||_d|_d|_dS)NF)rWrHr6rd)r)rWrHr/r/r0rs   z!WriteSubprocessPipeProto.__init__cCs ||_dS)N)r6)r)Z transportr/r/r0rS 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)rdrWr_rH)r)r[r/r/r0rjs z(WriteSubprocessPipeProto.connection_lostcCs|jjjƒdS)N)rWrÚ pause_writing)r)r/r/r0rmsz&WriteSubprocessPipeProto.pause_writingcCs|jjjƒdS)N)rWrÚresume_writing)r)r/r/r0rnsz'WriteSubprocessPipeProto.resume_writingN) r3rkrlrrSr9rjrmrnr/r/r/r0rNs      rNc@seZdZdd„ZdS)rPcCs|jj|j|ƒdS)N)rWr`rH)r)rZr/r/r0Ú data_received#sz%ReadSubprocessPipeProto.data_receivedN)r3rkrlror/r/r/r0rP s rP)rrrBÚrrrZ coroutinesrÚlogrZSubprocessTransportrZ BaseProtocolrNZProtocolrPr/r/r/r0Ús   ù