o
    Hb"                     @   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r0d | jd< |tjkr:d | jd< |tjkrDd | jd< z| jd||||||d| W n   |    | jj| _| j| jd< | j rt|ttfrx|}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__r   ./usr/lib/python3.10/asyncio/base_subprocess.pyr      sH   









z BaseSubprocessTransport.__init__c                 C   s  | j jg}| jr|d | jd ur|d| j  | jd ur*|d| j  n| jd ur5|d n|d | jd}|d urM|d|j  | jd}| jd	}|d urk||u rk|d
|j  n|d urx|d|j  |d u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 N)NotImplementedError)r(   r   r	   r
   r   r   r   r,   r   r   r/   r   T   s   zBaseSubprocessTransport._startc                 C   
   || _ d S r:   r   )r(   r*   r   r   r/   set_protocolW      
z$BaseSubprocessTransport.set_protocolc                 C      | j S r:   r=   r(   r   r   r/   get_protocolZ      z$BaseSubprocessTransport.get_protocolc                 C   r@   r:   )r   rA   r   r   r/   
is_closing]   rC   z"BaseSubprocessTransport.is_closingc                 C   s   | j rd S d| _ | j D ]}|d u rq|j  q| jd urI| jd u rK| j d u rM| j	 r6t
d|  z| j  W d S  tyH   Y d S w d S d S 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 d S )Nzunclosed transport )source)r   ResourceWarningr    )r(   Z_warnr   r   r/   __del__{   s   zBaseSubprocessTransport.__del__c                 C   r@   r:   )r   rA   r   r   r/   get_pid   rC   zBaseSubprocessTransport.get_pidc                 C   r@   r:   )r   rA   r   r   r/   get_returncode   rC   z&BaseSubprocessTransport.get_returncodec                 C   s   || j v r| j | jS d S r:   )r   r5   )r(   fdr   r   r/   get_pipe_transport   s   
z*BaseSubprocessTransport.get_pipe_transportc                 C   s   | j d u rt d S r:   )r   rG   rA   r   r   r/   _check_proc   s   
z#BaseSubprocessTransport._check_procc                 C   s   |    | j| d S r:   )rP   r   send_signal)r(   signalr   r   r/   rQ      s   z#BaseSubprocessTransport.send_signalc                 C      |    | j  d S r:   )rP   r   	terminaterA   r   r   r/   rT         z!BaseSubprocessTransport.terminatec                 C   rS   r:   )rP   r   rF   rA   r   r   r/   rF      rU   zBaseSubprocessTransport.killc           	   
      s  zy j } j}|jd ur"| fdd|jI d H \}}| jd< |jd ur<| fdd|jI d H \}}| jd< |jd urV| fdd|jI d H \}}| jd<  jd us]J |	 j
j   jD ]\}}|j	|g|R   qhd  _W n7 ttfy     ty } z"|d ur| s|| W Y d }~d S W Y d }~d S W Y d }~d S d }~ww |d ur| s|d  d S d S d S )Nc                      
   t  dS )Nr   )WriteSubprocessPipeProtor   rA   r   r/   <lambda>      
 z8BaseSubprocessTransport._connect_pipes.<locals>.<lambda>r   c                      rV   )Nr   ReadSubprocessPipeProtor   rA   r   r/   rX      rY   r   c                      rV   )Nr   rZ   r   rA   r   r/   rX      rY   r   )r   r   r
   Zconnect_write_piper   r   Zconnect_read_piper   r   	call_soonr   connection_made
SystemExitKeyboardInterruptBaseException	cancelledZset_exception
set_result)	r(   r+   procr)   _r5   callbackdataexcr   rA   r/   r'      sL   









z&BaseSubprocessTransport._connect_pipesc                 G   s6   | j d ur| j ||f d S | jj|g|R   d S r:   )r   r3   r   r\   )r(   cbrf   r   r   r/   _call   s   
zBaseSubprocessTransport._callc                 C   s   |  | jj|| |   d S r:   )ri   r   Zpipe_connection_lost_try_finish)r(   rN   rg   r   r   r/   _pipe_connection_lost   s   z-BaseSubprocessTransport._pipe_connection_lostc                 C   s   |  | jj|| d S r:   )ri   r   Zpipe_data_received)r(   rN   rf   r   r   r/   _pipe_data_received   s   z+BaseSubprocessTransport._pipe_data_receivedc                 C   s   |d usJ || j d u sJ | j | j rtd| | || _ | jjd u r+|| j_| | jj	 | 
  | jD ]}| sD|| q9d | _d S )Nz%r exited with return code %r)r   r   r"   r   r8   r   
returncoderi   r   Zprocess_exitedrj   r   ra   rb   )r(   rm   r+   r   r   r/   _process_exited   s   



z'BaseSubprocessTransport._process_exitedc                    s2   | j du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   sL   | j rJ | jd u rd S tdd | j D r$d| _ | | jd  d S d S )Nc                 s   s    | ]
}|d uo
|j V  qd S r:   )disconnected).0pr   r   r/   	<genexpr>   s    z6BaseSubprocessTransport._try_finish.<locals>.<genexpr>T)r   r   allr   rE   ri   _call_connection_lostrA   r   r   r/   rj      s   

z#BaseSubprocessTransport._try_finishc                 C   s:   z| j | W d | _d | _d | _ d S d | _d | _d | _ w r:   )r   connection_lostr   r   r(   rg   r   r   r/   ru      s   
z-BaseSubprocessTransport._call_connection_lost)NN)r2   
__module____qualname__r   r9   r   r>   rB   rD   r    warningswarnrK   rL   rM   rO   rP   rQ   rT   rF   r'   ri   rk   rl   rn   ro   rj   ru   __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 )rW   c                 C   s   || _ || _d | _d| _d S )NF)rc   rN   r5   rp   )r(   rc   rN   r   r   r/   r     s   
z!WriteSubprocessPipeProto.__init__c                 C   r<   r:   )r5   )r(   Z	transportr   r   r/   r]     r?   z(WriteSubprocessPipeProto.connection_madec                 C   s    d| j j d| j d| jdS )N<z fd=z pipe=>)r.   r2   rN   r5   rA   r   r   r/   r9   
  s    z!WriteSubprocessPipeProto.__repr__c                 C   s    d| _ | j| j| d | _d S )NT)rp   rc   rk   rN   rw   r   r   r/   rv     s   
z(WriteSubprocessPipeProto.connection_lostc                 C      | j j  d S r:   )rc   r   pause_writingrA   r   r   r/   r        z&WriteSubprocessPipeProto.pause_writingc                 C   r   r:   )rc   r   resume_writingrA   r   r   r/   r     r   z'WriteSubprocessPipeProto.resume_writingN)	r2   rx   ry   r   r]   r9   rv   r   r   r   r   r   r/   rW      s    rW   c                   @   s   e Zd Zdd ZdS )r[   c                 C   s   | j | j| d S r:   )rc   rl   rN   )r(   rf   r   r   r/   data_received  s   z%ReadSubprocessPipeProto.data_receivedN)r2   rx   ry   r   r   r   r   r/   r[     s    r[   )r   r   rz    r   r   logr   ZSubprocessTransportr   ZBaseProtocolrW   ZProtocolr[   r   r   r   r/   <module>   s     v