
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3

  \ˆ#  ã               @   s�   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 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é   )Úcompat)Ú	protocols)Ú
transports)Ú	coroutine)Ú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rTdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zed d!„ ƒZd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zed*d+„ ƒZd,d-„ Zd.d/„ Z‡  ZS )1ÚBaseSubprocessTransportNc                s&  t ƒ j|
ƒ d| _|| _|| _d | _d | _d | _g | _t	j
ƒ | _i | _d| _|tjkr`d | jd< |tjkrtd | jd< |tjkrˆd | jd< y"| jf ||||||dœ|—Ž W n   | jƒ  ‚ Y nX | jj| _| j| jd< | jjƒ �rt|ttfƒrø|}n|d }tjd|| jƒ | j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/lib64/python3.6/asyncio/base_subprocess.pyr      s@    








z BaseSubprocessTransport.__init__c             C   s  | j jg}| jr|jdƒ | jd k	r4|jd| j ƒ | jd k	rP|jd| j ƒ n | jd k	rf|jdƒ n
|jdƒ | jjdƒ}|d k	r”|jd|j ƒ | jjdƒ}| jjd	ƒ}|d k	rÎ||krÎ|jd
|j ƒ n0|d k	ræ|jd|j ƒ |d k	rþ|jd|j ƒ ddj	|ƒ S )NÚclosedzpid=%szreturncode=%sZrunningznot startedr   zstdin=%sr   r	   zstdout=stderr=%sz	stdout=%sz	stderr=%sz<%s>ú )
r.   Ú__name__r   Úappendr   r   r   ÚgetÚpipeÚjoin)r)   Úinfor   r   r   r/   r/   r0   Ú__repr__9   s,    





z BaseSubprocessTransport.__repr__c             K   s   t ‚d S )N)ÚNotImplementedError)r)   r
   r   r   r   r   r   r-   r/   r/   r0   r    V   s    zBaseSubprocessTransport._startc             C   s
   || _ d S )N)r   )r)   r+   r/   r/   r0   Úset_protocolY   s    z$BaseSubprocessTransport.set_protocolc             C   s   | j S )N)r   )r)   r/   r/   r0   Úget_protocol\   s    z$BaseSubprocessTransport.get_protocolc             C   s   | j S )N)r   )r)   r/   r/   r0   Ú
is_closing_   s    z"BaseSubprocessTransport.is_closingc             C   s˜   | j r
d S d| _ x&| jjƒ D ]}|d kr*q|jjƒ  qW | jd k	r”| jd kr”| jjƒ d kr”| jj	ƒ rpt
jd| ƒ y| jjƒ  W n tk
r’   Y nX d S )NTz$Close running child process: kill %r)r   r   Úvaluesr6   r!   r   r   Zpollr   r#   r   ZwarningÚkillÚProcessLookupError)r)   Úprotor/   r/   r0   r!   b   s     


zBaseSubprocessTransport.closec             C   s&   | j s"tjd|  t| d� | jƒ  d S )Nzunclosed transport %r)Úsource)r   ÚwarningsÚwarnÚResourceWarningr!   )r)   r/   r/   r0   Ú__del__€   s    zBaseSubprocessTransport.__del__c             C   s   | j S )N)r   )r)   r/   r/   r0   Úget_pid†   s    zBaseSubprocessTransport.get_pidc             C   s   | j S )N)r   )r)   r/   r/   r0   Úget_returncode‰   s    z&BaseSubprocessTransport.get_returncodec             C   s   || j kr| j | jS d S d S )N)r   r6   )r)   Úfdr/   r/   r0   Úget_pipe_transportŒ   s    
z*BaseSubprocessTransport.get_pipe_transportc             C   s   | j d krtƒ ‚d S )N)r   r@   )r)   r/   r/   r0   Ú_check_proc’   s    
z#BaseSubprocessTransport._check_procc             C   s   | j ƒ  | jj|ƒ d S )N)rK   r   Úsend_signal)r)   Úsignalr/   r/   r0   rL   –   s    z#BaseSubprocessTransport.send_signalc             C   s   | j ƒ  | jjƒ  d S )N)rK   r   Ú	terminate)r)   r/   r/   r0   rN   š   s    z!BaseSubprocessTransport.terminatec             C   s   | j ƒ  | jjƒ  d S )N)rK   r   r?   )r)   r/   r/   r0   r?   ž   s    zBaseSubprocessTransport.killc       	      #   sP  yæˆ j }ˆ j}|jd k	rB|j‡ fdd„|jƒE d H \}}|ˆ jd< |jd k	rv|j‡ fdd„|jƒE d H \}}|ˆ jd< |jd k	rª|j‡ fdd„|jƒE d H \}}|ˆ jd< |jˆ j	j
ˆ ƒ x"ˆ jD ]\}}|j|f|žŽ  qÂW d ˆ _W nD tk
�r* } z&|d k	�r|jƒ  �r|j|ƒ W Y d d }~X n"X |d k	�rL|jƒ  �rL|jd ƒ d S )Nc                  s
   t ˆ dƒS )Nr   )ÚWriteSubprocessPipeProtor/   )r)   r/   r0   Ú<lambda>ª   s    z8BaseSubprocessTransport._connect_pipes.<locals>.<lambda>r   c                  s
   t ˆ dƒS )Nr   )ÚReadSubprocessPipeProtor/   )r)   r/   r0   rP   °   s    r   c                  s
   t ˆ dƒS )Nr	   )rQ   r/   )r)   r/   r0   rP   ¶   s    r	   )r   r   r   Zconnect_write_piper   r   Zconnect_read_piper   Ú	call_soonr   Úconnection_mader   Ú	ExceptionÚ	cancelledZset_exceptionÚ
set_result)	r)   r,   Úprocr*   Ú_r6   ÚcallbackÚdataÚexcr/   )r)   r0   r(   ¢   s6    









z&BaseSubprocessTransport._connect_pipesc             G   s2   | j d k	r| j j||fƒ n| jj|f|žŽ  d S )N)r   r4   r   rR   )r)   ÚcbrZ   r/   r/   r0   Ú_callÇ   s    
zBaseSubprocessTransport._callc             C   s   | j | jj||ƒ | jƒ  d S )N)r]   r   Zpipe_connection_lostÚ_try_finish)r)   rI   r[   r/   r/   r0   Ú_pipe_connection_lostÍ   s    z-BaseSubprocessTransport._pipe_connection_lostc             C   s   | j | jj||ƒ d S )N)r]   r   Zpipe_data_received)r)   rI   rZ   r/   r/   r0   Ú_pipe_data_receivedÑ   s    z+BaseSubprocessTransport._pipe_data_receivedc             C   st   | j jƒ rtjd| |ƒ || _| jjd kr2|| j_| j| jj	ƒ | j
ƒ  x | jD ]}|jƒ sP|j|ƒ qPW d | _d S )Nz%r exited with return code %r)r   r#   r   r8   r   r   Ú
returncoder]   r   Zprocess_exitedr^   r   rU   rV   )r)   ra   r,   r/   r/   r0   Ú_process_exitedÔ   s    
z'BaseSubprocessTransport._process_exitedc             c   s0   | j dk	r| j S | jjƒ }| jj|ƒ |E 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   r4   )r)   r,   r/   r/   r0   Ú_waitè   s
    

zBaseSubprocessTransport._waitc             C   s>   | j d krd S tdd„ | jjƒ D ƒƒr:d| _| j| jd ƒ d S )Nc             s   s   | ]}|d k	o|j V  qd S )N)Údisconnected)Ú.0Úpr/   r/   r0   ú	<genexpr>ø   s   z6BaseSubprocessTransport._try_finish.<locals>.<genexpr>T)r   Úallr   r>   r   r]   Ú_call_connection_lost)r)   r/   r/   r0   r^   ô   s    
z#BaseSubprocessTransport._try_finishc             C   s*   z| j j|ƒ W d d | _d | _d | _ X d S )N)r   Úconnection_lostr   r   )r)   r[   r/   r/   r0   ri   ý   s
    z-BaseSubprocessTransport._call_connection_lost)NN)r3   Ú
__module__Ú__qualname__r   r9   r    r;   r<   r=   r!   r   ZPY34rF   rG   rH   rJ   rK   rL   rN   r?   r   r(   r]   r_   r`   rb   rc   r^   ri   Ú__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 )rO   c             C   s   || _ || _d | _d| _d S )NF)rW   rI   r6   rd   )r)   rW   rI   r/   r/   r0   r     s    z!WriteSubprocessPipeProto.__init__c             C   s
   || _ d S )N)r6   )r)   Z	transportr/   r/   r0   rS     s    z(WriteSubprocessPipeProto.connection_madec             C   s   d| j j| j| jf S )Nz<%s fd=%s pipe=%r>)r.   r3   rI   r6   )r)   r/   r/   r0   r9     s    z!WriteSubprocessPipeProto.__repr__c             C   s    d| _ | jj| j|ƒ d | _d S )NT)rd   rW   r_   rI   )r)   r[   r/   r/   r0   rj     s    z(WriteSubprocessPipeProto.connection_lostc             C   s   | j jjƒ  d S )N)rW   r   Úpause_writing)r)   r/   r/   r0   rn     s    z&WriteSubprocessPipeProto.pause_writingc             C   s   | j jjƒ  d S )N)rW   r   Úresume_writing)r)   r/   r/   r0   ro     s    z'WriteSubprocessPipeProto.resume_writingN)	r3   rk   rl   r   rS   r9   rj   rn   ro   r/   r/   r/   r0   rO     s   rO   c               @   s   e Zd Zdd„ ZdS )rQ   c             C   s   | j j| j|ƒ d S )N)rW   r`   rI   )r)   rZ   r/   r/   r0   Údata_received$  s    z%ReadSubprocessPipeProto.data_receivedN)r3   rk   rl   rp   r/   r/   r/   r0   rQ   !  s   rQ   )r   r   rC   Ú r   r   r   Z
coroutinesr   Úlogr   ZSubprocessTransportr   ZBaseProtocolrO   ZProtocolrQ   r/   r/   r/   r0   Ú<module>   s    {