a
    "Rîh‹"  ã                   @   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rˆd | jd< z"| jf ||||||dœ|¤Ž W n   |  ¡  ‚ Y n0 | 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   ÚwaiterÚextraÚkwargsZprogram©Ú	__class__© ú?/opt/python-3.9.24/usr/lib/python3.9/asyncio/base_subprocess.pyr      sH    






ÿÿ

ÿz BaseSubprocessTransport.__init__c                 C   s  | j jg}| jr| d¡ | jd ur6| d| j› ¡ | jd urT| d| j› ¡ n | jd urj| d¡ n
| d¡ | j d¡}|d urš| d|j› ¡ | j d¡}| j d	¡}|d urÖ||u rÖ| d
|j› ¡ n6|d urð| 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<{}>ú )r.   Ú__name__r   Úappendr   r   r   ÚgetÚpipeÚformatÚjoin)r'   Úinfor
   r   r   r/   r/   r0   Ú__repr__7   s,    






z BaseSubprocessTransport.__repr__c                 K   s   t ‚d S ©N)ÚNotImplementedError)r'   r   r	   r
   r   r   r   r,   r/   r/   r0   r   T   s    zBaseSubprocessTransport._startc                 C   s
   || _ d S r<   ©r   )r'   r)   r/   r/   r0   Úset_protocolW   s    z$BaseSubprocessTransport.set_protocolc                 C   s   | j S r<   r>   ©r'   r/   r/   r0   Úget_protocolZ   s    z$BaseSubprocessTransport.get_protocolc                 C   s   | j S r<   )r   r@   r/   r/   r0   Ú
is_closing]   s    z"BaseSubprocessTransport.is_closingc                 C   s’   | j r
d S d| _ | j ¡ D ]}|d u r(q|j ¡  q| jd urŽ| jd u rŽ| j ¡ d u rŽ| j 	¡ rlt
 d| ¡ z| j ¡  W n tyŒ   Y n0 d S )NTz$Close running child process: kill %r)r   r   Úvaluesr7   r   r   r   Úpollr   r!   r   ÚwarningÚkillÚProcessLookupError)r'   Úprotor/   r/   r0   r   `   s$    
þû
zBaseSubprocessTransport.closec                 C   s&   | j s"|d| ›t| d |  ¡  d S )Nzunclosed transport )Úsource)r   ÚResourceWarningr   )r'   Ú_warnr/   r/   r0   Ú__del__{   s    zBaseSubprocessTransport.__del__c                 C   s   | j S r<   )r   r@   r/   r/   r0   Úget_pid€   s    zBaseSubprocessTransport.get_pidc                 C   s   | j S r<   )r   r@   r/   r/   r0   Úget_returncodeƒ   s    z&BaseSubprocessTransport.get_returncodec                 C   s   || j v r| j | jS d S d S r<   )r   r7   )r'   Úfdr/   r/   r0   Úget_pipe_transport†   s    
z*BaseSubprocessTransport.get_pipe_transportc                 C   s   | j d u rtƒ ‚d S r<   )r   rG   r@   r/   r/   r0   Ú_check_procŒ   s    
z#BaseSubprocessTransport._check_procc                 C   s   |   ¡  | j |¡ d S r<   )rQ   r   Úsend_signal)r'   Úsignalr/   r/   r0   rR      s    z#BaseSubprocessTransport.send_signalc                 C   s   |   ¡  | j ¡  d S r<   )rQ   r   Ú	terminater@   r/   r/   r0   rT   ”   s    z!BaseSubprocessTransport.terminatec                 C   s   |   ¡  | j ¡  d S r<   )rQ   r   rF   r@   r/   r/   r0   rF   ˜   s    zBaseSubprocessTransport.killc           	   
   ƒ   sr  zòˆ j }ˆ j}|jd urB| ‡ 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rª| ‡ fdd„|j¡I d H \}}|ˆ jd< ˆ jd us¸J ‚| 	ˆ j
jˆ ¡ ˆ jD ]\}}|j	|g|¢R Ž  qÎd ˆ _W n\ ttfy   ‚ Y nb tyN } z*|d ur:| ¡ s:| |¡ W Y d }~n(d }~0 0 |d urn| ¡ sn| d ¡ d S )Nc                      s
   t ˆ dƒS )Nr   )ÚWriteSubprocessPipeProtor/   r@   r/   r0   Ú<lambda>£   ó    z8BaseSubprocessTransport._connect_pipes.<locals>.<lambda>r   c                      s
   t ˆ dƒS )Nr   ©ÚReadSubprocessPipeProtor/   r@   r/   r0   rV   ©   rW   r   c                      s
   t ˆ dƒS )Nr   rX   r/   r@   r/   r0   rV   ¯   rW   r   )r   r   r
   Zconnect_write_piper   r   Zconnect_read_piper   r   Ú	call_soonr   Úconnection_madeÚ
SystemExitÚKeyboardInterruptÚBaseExceptionÚ	cancelledÚset_exceptionÚ
set_result)	r'   r*   Úprocr(   Ú_r7   ÚcallbackÚdataÚexcr/   r@   r0   r&   œ   sB    

þ


þ


þ

 z&BaseSubprocessTransport._connect_pipesc                 G   s4   | j d ur| j  ||f¡ n| jj|g|¢R Ž  d S r<   )r   r5   r   rZ   )r'   Úcbre   r/   r/   r0   Ú_callÂ   s    
zBaseSubprocessTransport._callc                 C   s   |   | jj||¡ |  ¡  d S r<   )rh   r   Zpipe_connection_lostÚ_try_finish)r'   rO   rf   r/   r/   r0   Ú_pipe_connection_lostÈ   s    z-BaseSubprocessTransport._pipe_connection_lostc                 C   s   |   | jj||¡ d S r<   )rh   r   Zpipe_data_received)r'   rO   re   r/   r/   r0   Ú_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 rV|| j_|  | jj	¡ |  
¡  | jD ]}| ¡ sr| |¡ qrd | _d S )Nz%r exited with return code %r)r   r   r!   r   r:   r   Ú
returncoderh   r   Zprocess_exitedri   r   r_   ra   )r'   rl   r*   r/   r/   r0   Ú_process_exitedÏ   s    

z'BaseSubprocessTransport._process_exitedc                 Ã   s0   | 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   r5   )r'   r*   r/   r/   r0   Ú_waitâ   s
    

zBaseSubprocessTransport._waitc                 C   sH   | j r
J ‚| jd u rd S tdd„ | j ¡ D ƒƒrDd| _ |  | jd ¡ d S )Nc                 s   s   | ]}|d uo|j V  qd S r<   )Údisconnected)Ú.0Úpr/   r/   r0   Ú	<genexpr>ñ   s   ÿz6BaseSubprocessTransport._try_finish.<locals>.<genexpr>T)r   r   Úallr   rC   rh   Ú_call_connection_lostr@   r/   r/   r0   ri   í   s    

ÿz#BaseSubprocessTransport._try_finishc                 C   s<   z"| j  |¡ W d | _d | _d | _ nd | _d | _d | _ 0 d S r<   )r   Úconnection_lostr   r   ©r'   rf   r/   r/   r0   rt   ö   s    þz-BaseSubprocessTransport._call_connection_lost)NN)r4   Ú
__module__Ú__qualname__r   r;   r   r?   rA   rB   r   ÚwarningsÚwarnrL   rM   rN   rP   rQ   rR   rT   rF   r&   rh   rj   rk   rm   rn   ri   rt   Ú__classcell__r/   r/   r-   r0   r   
   s0    þ+&	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   r7   ro   )r'   rb   rO   r/   r/   r0   r     s    z!WriteSubprocessPipeProto.__init__c                 C   s
   || _ d S r<   )r7   )r'   Z	transportr/   r/   r0   r[     s    z(WriteSubprocessPipeProto.connection_madec                 C   s    d| j j› d| j› d| j›dS )Nú<z fd=z pipe=ú>)r.   r4   rO   r7   r@   r/   r/   r0   r;   
  s    z!WriteSubprocessPipeProto.__repr__c                 C   s    d| _ | j | j|¡ d | _d S )NT)ro   rb   rj   rO   rv   r/   r/   r0   ru     s    z(WriteSubprocessPipeProto.connection_lostc                 C   s   | j j ¡  d S r<   )rb   r   Úpause_writingr@   r/   r/   r0   r~     s    z&WriteSubprocessPipeProto.pause_writingc                 C   s   | j j ¡  d S r<   )rb   r   Úresume_writingr@   r/   r/   r0   r     s    z'WriteSubprocessPipeProto.resume_writingN)	r4   rw   rx   r   r[   r;   ru   r~   r   r/   r/   r/   r0   rU   ÿ   s   rU   c                   @   s   e Zd Zdd„ ZdS )rY   c                 C   s   | j  | j|¡ d S r<   )rb   rk   rO   )r'   re   r/   r/   r0   Údata_received  s    z%ReadSubprocessPipeProto.data_receivedN)r4   rw   rx   r€   r/   r/   r/   r0   rY     s   rY   )r   r   ry   Ú r   r   Úlogr   ZSubprocessTransportr   ZBaseProtocolrU   ÚProtocolrY   r/   r/   r/   r0   Ú<module>   s    vÿ