B
    18\R"                 @   sx   d dl Z d dlZd dlZddlmZ ddlmZ ddlmZ G dd dejZ	G dd	 d	ej
ZG d
d deejZdS )    N   )	protocols)
transports)loggerc                   s   e Zd Zd0 fdd	Zdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Z  ZS )1BaseSubprocessTransportNc          	      s&  t  |
 d| _|| _|| _d | _d | _d | _g | _t	
 | _i | _d| _|tjkr`d | jd< |tjkrtd | jd< |tjkrd | jd< y"| jf ||||||d| W n   |    Y nX | jj| _| j| jd< | j rt|ttfr|}n|d }td|| j | j| |	 d S )NFr   r      )argsshellstdinstdoutstderrbufsize
subprocesszprocess %r created: pid %s)super__init___closed	_protocol_loop_proc_pid_returncode_exit_waiterscollectionsdeque_pending_calls_pipes	_finishedr   PIPE_startclosepid_extra	get_debug
isinstancebytesstrr   debugcreate_task_connect_pipes)selfloopprotocolr   r	   r
   r   r   r   waiterextrakwargsprogram)	__class__ [/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/asyncio/base_subprocess.pyr      s@    








z BaseSubprocessTransport.__init__c             C   s  | j jg}| jr|d | jd k	r6|d| j  | jd k	rT|d| j  n | jd k	rj|d n
|d | jd}|d k	r|d|j  | jd}| jd	}|d k	r||kr|d
|j  n6|d k	r|d|j  |d k	r|d|j  d	d
|S )Nclosedzpid=zreturncode=runningznot startedr   zstdin=r   r   zstdout=stderr=zstdout=zstderr=z<{}> )r0   __name__r   appendr   r   r   getpipeformatjoin)r)   infor
   r   r   r1   r1   r2   __repr__7   s,    






z BaseSubprocessTransport.__repr__c             K   s   t d S )N)NotImplementedError)r)   r   r	   r
   r   r   r   r.   r1   r1   r2   r   T   s    zBaseSubprocessTransport._startc             C   s
   || _ d S )N)r   )r)   r+   r1   r1   r2   set_protocolW   s    z$BaseSubprocessTransport.set_protocolc             C   s   | j S )N)r   )r)   r1   r1   r2   get_protocolZ   s    z$BaseSubprocessTransport.get_protocolc             C   s   | j S )N)r   )r)   r1   r1   r2   
is_closing]   s    z"BaseSubprocessTransport.is_closingc             C   s   | j r
d S d| _ x&| j D ]}|d kr*q|j  qW | jd k	r| jd kr| j d kr| j	 rpt
d|  y| j  W n tk
r   Y nX d S )NTz$Close running child process: kill %r)r   r   valuesr9   r   r   r   pollr   r"   r   warningkillProcessLookupError)r)   protor1   r1   r2   r   `   s     


zBaseSubprocessTransport.closec             C   s(   | j s$tjd| t| d |   d S )Nzunclosed transport )source)r   warningswarnResourceWarningr   )r)   r1   r1   r2   __del__{   s    zBaseSubprocessTransport.__del__c             C   s   | j S )N)r   )r)   r1   r1   r2   get_pid   s    zBaseSubprocessTransport.get_pidc             C   s   | j S )N)r   )r)   r1   r1   r2   get_returncode   s    z&BaseSubprocessTransport.get_returncodec             C   s   || j kr| j | jS d S d S )N)r   r9   )r)   fdr1   r1   r2   get_pipe_transport   s    
z*BaseSubprocessTransport.get_pipe_transportc             C   s   | j d krt d S )N)r   rF   )r)   r1   r1   r2   _check_proc   s    
z#BaseSubprocessTransport._check_procc             C   s   |    | j| d S )N)rQ   r   send_signal)r)   signalr1   r1   r2   rR      s    z#BaseSubprocessTransport.send_signalc             C   s   |    | j  d S )N)rQ   r   	terminate)r)   r1   r1   r2   rT      s    z!BaseSubprocessTransport.terminatec             C   s   |    | j  d S )N)rQ   r   rE   )r)   r1   r1   r2   rE      s    zBaseSubprocessTransport.killc       	   
      sZ  y j } j}|jd k	rB| fdd|jI d H \}}| jd< |jd k	rv| fdd|jI d H \}}| jd< |jd k	r| fdd|jI d H \}}| jd<  jd k	st	|
 jj  x" jD ]\}}|j
|f|  qW d  _W nB tk
r6 } z"|d k	r&| s&|| W d d }~X Y n X |d k	rV| sV|d  d S )Nc                  s
   t  dS )Nr   )WriteSubprocessPipeProtor1   )r)   r1   r2   <lambda>       z8BaseSubprocessTransport._connect_pipes.<locals>.<lambda>r   c                  s
   t  dS )Nr   )ReadSubprocessPipeProtor1   )r)   r1   r2   rV      rW   r   c                  s
   t  dS )Nr   )rX   r1   )r)   r1   r2   rV      rW   r   )r   r   r
   connect_write_piper   r   connect_read_piper   r   AssertionError	call_soonr   connection_made	Exception	cancelledset_exception
set_result)	r)   r,   procr*   _r9   callbackdataexcr1   )r)   r2   r(      s8    









z&BaseSubprocessTransport._connect_pipesc             G   s2   | j d k	r| j ||f n| jj|f|  d S )N)r   r7   r   r\   )r)   cbre   r1   r1   r2   _call   s    
zBaseSubprocessTransport._callc             C   s   |  | jj|| |   d S )N)rh   r   pipe_connection_lost_try_finish)r)   rO   rf   r1   r1   r2   _pipe_connection_lost   s    z-BaseSubprocessTransport._pipe_connection_lostc             C   s   |  | jj|| d S )N)rh   r   pipe_data_received)r)   rO   re   r1   r1   r2   _pipe_data_received   s    z+BaseSubprocessTransport._pipe_data_receivedc             C   s   |d k	st || jd ks$t | j| j r<td| | || _| jjd krV|| j_| | j	j
 |   x | jD ]}| st|| qtW d | _d S )Nz%r exited with return code %r)r[   r   r   r"   r   r<   r   
returncoderh   r   process_exitedrj   r   r_   ra   )r)   rn   r,   r1   r1   r2   _process_exited   s    
z'BaseSubprocessTransport._process_exitedc                s0   | j dk	r| j S | j }| j| |I dH S )zdWait until the process exit and return the process return code.

        This method is a coroutine.N)r   r   create_futurer   r7   )r)   r,   r1   r1   r2   _wait   s
    

zBaseSubprocessTransport._waitc             C   sH   | j r
t| jd krd S tdd | j D rDd| _ | | jd  d S )Nc             s   s   | ]}|d k	o|j V  qd S )N)disconnected).0pr1   r1   r2   	<genexpr>   s   z6BaseSubprocessTransport._try_finish.<locals>.<genexpr>T)r   r[   r   allr   rB   rh   _call_connection_lost)r)   r1   r1   r2   rj      s    

z#BaseSubprocessTransport._try_finishc             C   s*   z| j | W d d | _d | _d | _ X d S )N)r   connection_lostr   r   )r)   rf   r1   r1   r2   rx      s
    z-BaseSubprocessTransport._call_connection_lost)NN)r6   
__module____qualname__r   r=   r   r?   r@   rA   r   rL   rM   rN   rP   rQ   rR   rT   rE   r(   rh   rk   rm   rp   rr   rj   rx   __classcell__r1   r1   )r0   r2   r   
   s.   )$	r   c               @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )rU   c             C   s   || _ || _d | _d| _d S )NF)rb   rO   r9   rs   )r)   rb   rO   r1   r1   r2   r      s    z!WriteSubprocessPipeProto.__init__c             C   s
   || _ d S )N)r9   )r)   	transportr1   r1   r2   r]     s    z(WriteSubprocessPipeProto.connection_madec             C   s    d| j j d| j d| jdS )N<z fd=z pipe=>)r0   r6   rO   r9   )r)   r1   r1   r2   r=   	  s    z!WriteSubprocessPipeProto.__repr__c             C   s    d| _ | j| j| d | _d S )NT)rs   rb   rk   rO   )r)   rf   r1   r1   r2   ry     s    z(WriteSubprocessPipeProto.connection_lostc             C   s   | j j  d S )N)rb   r   pause_writing)r)   r1   r1   r2   r     s    z&WriteSubprocessPipeProto.pause_writingc             C   s   | j j  d S )N)rb   r   resume_writing)r)   r1   r1   r2   r     s    z'WriteSubprocessPipeProto.resume_writingN)	r6   rz   r{   r   r]   r=   ry   r   r   r1   r1   r1   r2   rU      s   rU   c               @   s   e Zd Zdd ZdS )rX   c             C   s   | j | j| d S )N)rb   rm   rO   )r)   re   r1   r1   r2   data_received  s    z%ReadSubprocessPipeProto.data_receivedN)r6   rz   r{   r   r1   r1   r1   r2   rX     s   rX   )r   r   rI    r   r   logr   SubprocessTransportr   BaseProtocolrU   ProtocolrX   r1   r1   r1   r2   <module>   s    u