U
    pd"                     @   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	e
j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  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< z"| 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pidZ_extra	get_debug
isinstancebytesstrr   debugZcreate_task_connect_pipes)selfloopprotocolr   r	   r
   r   r   r   waiterZextrakwargsZprogram	__class__ -/usr/lib/python3.8/asyncio/base_subprocess.pyr      sL    






 

 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=Zrunningznot startedr   zstdin=r   r   zstdout=stderr=zstdout=zstderr=z<{}> )r-   __name__r   appendr   r   r   getpipeformatjoin)r'   infor
   r   r   r.   r.   r/   __repr__7   s,    






z BaseSubprocessTransport.__repr__c                 K   s   t d S N)NotImplementedError)r'   r   r	   r
   r   r   r   r+   r.   r.   r/   r   T   s    zBaseSubprocessTransport._startc                 C   s
   || _ d S r:   r   )r'   r)   r.   r.   r/   set_protocolW   s    z$BaseSubprocessTransport.set_protocolc                 C   s   | j S r:   r<   r'   r.   r.   r/   get_protocolZ   s    z$BaseSubprocessTransport.get_protocolc                 C   s   | j S r:   )r   r>   r.   r.   r/   
is_closing]   s    z"BaseSubprocessTransport.is_closingc                 C   s   | j r
d S d| _ | j D ]}|d kr(q|j  q| jd k	r| jd kr| j d kr| j	 rlt
d|  z| j  W n tk
r   Y nX d S )NTz$Close running child process: kill %r)r   r   valuesr5   r   r   r   Zpollr   r!   r   ZwarningkillProcessLookupError)r'   protor.   r.   r/   r   `   s$    

zBaseSubprocessTransport.closec                 C   s&   | j s"|d| t| d |   d S )Nzunclosed transport )source)r   ResourceWarningr   )r'   Z_warnr.   r.   r/   __del__{   s    zBaseSubprocessTransport.__del__c                 C   s   | j S r:   )r   r>   r.   r.   r/   get_pid   s    zBaseSubprocessTransport.get_pidc                 C   s   | j S r:   )r   r>   r.   r.   r/   get_returncode   s    z&BaseSubprocessTransport.get_returncodec                 C   s   || j kr| j | jS d S d S r:   )r   r5   )r'   fdr.   r.   r/   get_pipe_transport   s    
z*BaseSubprocessTransport.get_pipe_transportc                 C   s   | j d krt d S r:   )r   rC   r>   r.   r.   r/   _check_proc   s    
z#BaseSubprocessTransport._check_procc                 C   s   |    | j| d S r:   )rL   r   send_signal)r'   signalr.   r.   r/   rM      s    z#BaseSubprocessTransport.send_signalc                 C   s   |    | j  d S r:   )rL   r   	terminater>   r.   r.   r/   rO      s    z!BaseSubprocessTransport.terminatec                 C   s   |    | j  d S r:   )rL   r   rB   r>   r.   r.   r/   rB      s    zBaseSubprocessTransport.killc           	   
      sp  z 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   jD ]\}}|j
|f|  qd  _W n\ ttfk
r    Y n` tk
rL } z"|d k	r<| s<|| W 5 d }~X Y n X |d k	rl| sl|d  d S )Nc                      s
   t  dS )Nr   )WriteSubprocessPipeProtor.   r>   r.   r/   <lambda>       z8BaseSubprocessTransport._connect_pipes.<locals>.<lambda>r   c                      s
   t  dS )Nr   ReadSubprocessPipeProtor.   r>   r.   r/   rQ      rR   r   c                      s
   t  dS )Nr   rS   r.   r>   r.   r/   rQ      rR   r   )r   r   r
   Zconnect_write_piper   r   Zconnect_read_piper   r   AssertionError	call_soonr   connection_made
SystemExitKeyboardInterruptBaseException	cancelledZset_exception
set_result)	r'   r*   procr(   _r5   callbackdataexcr.   r>   r/   r&      sB    









z&BaseSubprocessTransport._connect_pipesc                 G   s2   | j d k	r| j ||f n| jj|f|  d S r:   )r   r3   r   rV   )r'   cbr`   r.   r.   r/   _call   s    
zBaseSubprocessTransport._callc                 C   s   |  | jj|| |   d S r:   )rc   r   Zpipe_connection_lost_try_finish)r'   rJ   ra   r.   r.   r/   _pipe_connection_lost   s    z-BaseSubprocessTransport._pipe_connection_lostc                 C   s   |  | jj|| d S r:   )rc   r   Zpipe_data_received)r'   rJ   r`   r.   r.   r/   _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
 |   | jD ]}| sr|| qrd | _d S )Nz%r exited with return code %r)rU   r   r   r!   r   r8   r   
returncoderc   r   Zprocess_exitedrd   r   r[   r\   )r'   rg   r*   r.   r.   r/   _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   Zcreate_futurer   r3   )r'   r*   r.   r.   r/   _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 r:   )disconnected).0pr.   r.   r/   	<genexpr>   s   z6BaseSubprocessTransport._try_finish.<locals>.<genexpr>T)r   rU   r   allr   rA   rc   _call_connection_lostr>   r.   r.   r/   rd      s    

z#BaseSubprocessTransport._try_finishc                 C   s*   z| j| W 5 d | _ d | _d | _X d S r:   )r   r   r   connection_lostr'   ra   r.   r.   r/   ro      s
    z-BaseSubprocessTransport._call_connection_lost)NN)r2   
__module____qualname__r   r9   r   r=   r?   r@   r   warningswarnrG   rH   rI   rK   rL   rM   rO   rB   r&   rc   re   rf   rh   ri   rd   ro   __classcell__r.   r.   r,   r/   r   
   s2      +&	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 )rP   c                 C   s   || _ || _d | _d| _d S )NF)r]   rJ   r5   rj   )r'   r]   rJ   r.   r.   r/   r     s    z!WriteSubprocessPipeProto.__init__c                 C   s
   || _ d S r:   )r5   )r'   Z	transportr.   r.   r/   rW     s    z(WriteSubprocessPipeProto.connection_madec                 C   s    d| j j d| j d| jdS )N<z fd=z pipe=>)r-   r2   rJ   r5   r>   r.   r.   r/   r9   
  s    z!WriteSubprocessPipeProto.__repr__c                 C   s    d| _ | j| j| d | _d S )NT)rj   r]   re   rJ   rq   r.   r.   r/   rp     s    z(WriteSubprocessPipeProto.connection_lostc                 C   s   | j j  d S r:   )r]   r   pause_writingr>   r.   r.   r/   ry     s    z&WriteSubprocessPipeProto.pause_writingc                 C   s   | j j  d S r:   )r]   r   resume_writingr>   r.   r.   r/   rz     s    z'WriteSubprocessPipeProto.resume_writingN)	r2   rr   rs   r   rW   r9   rp   ry   rz   r.   r.   r.   r/   rP      s   rP   c                   @   s   e Zd Zdd ZdS )rT   c                 C   s   | j | j| d S r:   )r]   rf   rJ   )r'   r`   r.   r.   r/   data_received  s    z%ReadSubprocessPipeProto.data_receivedN)r2   rr   rs   r{   r.   r.   r.   r/   rT     s   rT   )r   r   rt    r   r   logr   ZSubprocessTransportr   ZBaseProtocolrP   ZProtocolrT   r.   r.   r.   r/   <module>   s    v