ñÕ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¯y7ˆj}ˆj}|jdk r]|j‡fdd†|jƒEdH\}}|ˆjd<|jdk r¥|j‡fdd†|jƒEdH\}}|ˆjd<|jdk rí|j‡fdd†|jƒEdH\}}|ˆjd<|jˆj j ˆƒx'ˆj D]\}}|j||Œq Wdˆ_ WnKt k r„}z+|dk rr|j ƒ rr|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_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)rr4rrQ)r)ÚcbrYr/r/r0Ú_callÆszBaseSubprocessTransport._callcCs'|j|jj||ƒ|jƒdS)N)r\rZpipe_connection_lostÚ _try_finish)r)rHrZr/r/r0Ú_pipe_connection_lostÌsz-BaseSubprocessTransport._pipe_connection_lostcCs|j|jj||ƒdS)N)r\rZpipe_data_received)r)rHrYr/r/r0Ú_pipe_data_receivedÐsz+BaseSubprocessTransport._pipe_data_receivedcCs |jjƒr"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_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._waitcCsU|jdkrdStdd„|jjƒDƒƒrQd|_|j|jdƒdS)Ncss$|]}|dk o|jVqdS)N)Ú disconnected)Ú.0Úpr/r/r0ú ÷sz6BaseSubprocessTransport._try_finish..T)rÚallrr>rr\Ú_call_connection_lost)r)r/r/r0r]ós   z#BaseSubprocessTransport._try_finishc Cs7z|jj|ƒWdd|_d|_d|_XdS)N)rÚconnection_lostrr)r)rZr/r/r0rhüs   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@sXeZdZdd„Zdd„Zdd„Zdd„Zd 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|jjjƒdS)N)rVrÚ pause_writing)r)r/r/r0rlsz&WriteSubprocessPipeProto.pause_writingcCs|jjjƒdS)N)rVrÚresume_writing)r)r/r/r0rmsz'WriteSubprocessPipeProto.resume_writingN) r3rjrkrrRr9rirlrmr/r/r/r0rNs      rNc@seZdZdd„ZdS)rPcCs|jj|j|ƒdS)N)rVr_rH)r)rYr/r/r0Ú data_received#sz%ReadSubprocessPipeProto.data_receivedN)r3rjrkrnr/r/r/r0rP s rP)rrrBÚrrrZ coroutinesrÚlogrZSubprocessTransportrZ BaseProtocolrNZProtocolrPr/r/r/r0Ús   ù