o
    …9j‹"  ã                   @   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 ¡ r„t|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Ú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__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=Úrunningznot startedr   zstdin=r   r   zstdout=stderr=zstdout=zstderr=z<{}>ú )r2   Ú__name__r   Úappendr   r   r   ÚgetÚpipeÚformatÚjoin)r*   Úinfor
   r   r   r   r   r3   Ú__repr__7   s,   





z BaseSubprocessTransport.__repr__c                 K   s   t ‚©N)ÚNotImplementedError)r*   r   r	   r
   r   r   r   r/   r   r   r3   r   T   s   zBaseSubprocessTransport._startc                 C   ó
   || _ d S r?   ©r   )r*   r,   r   r   r3   Úset_protocolW   ó   
z$BaseSubprocessTransport.set_protocolc                 C   ó   | j S r?   rB   ©r*   r   r   r3   Úget_protocolZ   ó   z$BaseSubprocessTransport.get_protocolc                 C   rE   r?   )r   rF   r   r   r3   Ú
is_closing]   rH   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   Úvaluesr:   r    r   r   Úpollr   r#   r   ÚwarningÚkillÚProcessLookupError)r*   Úprotor   r   r3   r    `   s(   


ÿôzBaseSubprocessTransport.closec                 C   s*   | j s|d| ›�t| d� |  ¡  d S d S )Nzunclosed transport )Úsource)r   ÚResourceWarningr    )r*   Ú_warnr   r   r3   Ú__del__{   s   þzBaseSubprocessTransport.__del__c                 C   rE   r?   )r   rF   r   r   r3   Úget_pid€   rH   zBaseSubprocessTransport.get_pidc                 C   rE   r?   )r   rF   r   r   r3   Úget_returncodeƒ   rH   z&BaseSubprocessTransport.get_returncodec                 C   s   || j v r| j | jS d S r?   )r   r:   )r*   Úfdr   r   r3   Úget_pipe_transport†   s   
z*BaseSubprocessTransport.get_pipe_transportc                 C   s   | j d u rtƒ ‚d S r?   )r   rN   rF   r   r   r3   Ú_check_procŒ   s   
ÿz#BaseSubprocessTransport._check_procc                 C   s   |   ¡  | j |¡ d S r?   )rX   r   Úsend_signal)r*   Úsignalr   r   r3   rY   �   s   z#BaseSubprocessTransport.send_signalc                 C   ó   |   ¡  | j ¡  d S r?   )rX   r   Ú	terminaterF   r   r   r3   r\   ”   ó   z!BaseSubprocessTransport.terminatec                 C   r[   r?   )rX   r   rM   rF   r   r   r3   rM   ˜   r]   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   rF   r   r3   Ú<lambda>£   ó   
 z8BaseSubprocessTransport._connect_pipes.<locals>.<lambda>r   c                      r^   )Nr   ©ÚReadSubprocessPipeProtor   rF   r   r3   r`   ©   ra   r   c                      r^   )Nr   rb   r   rF   r   r3   r`   ¯   ra   r   )r   r   r
   Úconnect_write_piper   r   Úconnect_read_piper   r   Ú	call_soonr   Úconnection_madeÚ
SystemExitÚKeyboardInterruptÚBaseExceptionÚ	cancelledÚset_exceptionÚ
set_result)	r*   r-   Úprocr+   Ú_r:   ÚcallbackÚdataÚexcr   rF   r3   r)   œ   sL   €

þ


þ


þ

ÿ€ÿÿz&BaseSubprocessTransport._connect_pipesc                 G   s6   | j d ur| j  ||f¡ d S | jj|g|¢R Ž  d S r?   )r   r8   r   rf   )r*   Úcbrq   r   r   r3   Ú_callÂ   s   
zBaseSubprocessTransport._callc                 C   s   |   | jj||¡ |  ¡  d S r?   )rt   r   Úpipe_connection_lostÚ_try_finish)r*   rV   rr   r   r   r3   Ú_pipe_connection_lostÈ   s   z-BaseSubprocessTransport._pipe_connection_lostc                 C   s   |   | jj||¡ d S r?   )rt   r   Úpipe_data_received)r*   rV   rq   r   r   r3   Ú_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   r=   r   Ú
returncodert   r   Úprocess_exitedrv   r   rk   rm   )r*   rz   r-   r   r   r3   Ú_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   Úcreate_futurer   r8   )r*   r-   r   r   r3   Ú_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   r3   Ú	<genexpr>ñ   s   € ÿz6BaseSubprocessTransport._try_finish.<locals>.<genexpr>T)r   r   Úallr   rJ   rt   Ú_call_connection_lostrF   r   r   r3   rv   í   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*   rr   r   r   r3   r„   ö   s   
þz-BaseSubprocessTransport._call_connection_lost)NN)r7   Ú
__module__Ú__qualname__r   r>   r   rC   rG   rI   r    ÚwarningsÚwarnrS   rT   rU   rW   rX   rY   r\   rM   r)   rt   rw   ry   r|   r~   rv   r„   Ú__classcell__r   r   r1   r3   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 )r_   c                 C   s   || _ || _d | _d| _d S )NF)rn   rV   r:   r   )r*   rn   rV   r   r   r3   r     s   
z!WriteSubprocessPipeProto.__init__c                 C   rA   r?   )r:   )r*   Ú	transportr   r   r3   rg     rD   z(WriteSubprocessPipeProto.connection_madec                 C   s    d| j j› d| j› d| j›d�S )Nú<z fd=z pipe=ú>)r2   r7   rV   r:   rF   r   r   r3   r>   
  s    z!WriteSubprocessPipeProto.__repr__c                 C   s    d| _ | j | j|¡ d | _d S )NT)r   rn   rw   rV   r†   r   r   r3   r…     s   
z(WriteSubprocessPipeProto.connection_lostc                 C   ó   | j j ¡  d S r?   )rn   r   Úpause_writingrF   r   r   r3   r�     ó   z&WriteSubprocessPipeProto.pause_writingc                 C   r�   r?   )rn   r   Úresume_writingrF   r   r   r3   r’     r‘   z'WriteSubprocessPipeProto.resume_writingN)	r7   r‡   rˆ   r   rg   r>   r…   r�   r’   r   r   r   r3   r_   ÿ   s    r_   c                   @   s   e Zd Zdd„ ZdS )rc   c                 C   s   | j  | j|¡ d S r?   )rn   ry   rV   )r*   rq   r   r   r3   Údata_received  s   z%ReadSubprocessPipeProto.data_receivedN)r7   r‡   rˆ   r“   r   r   r   r3   rc     s    rc   )r   r   r‰   Ú r   r   Úlogr   ÚSubprocessTransportr   ÚBaseProtocolr_   ÚProtocolrc   r   r   r   r3   Ú<module>   s     vÿ