
\[\                 @   s   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 Gd d   d e j	  Z
 Gd	 d
   d
 e j  Z Gd d   d e e j  Z d S)    N   )	protocols)
transports)	coroutine)loggerc                   s  e  Z d  Z d   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 e d d    Z d d   Z d d   Z d  d!   Z d" d#   Z d$ d%   Z d& d'   Z   S)(BaseSubprocessTransportNc
                sV  t    j |	  | |  _ | |  _ d  |  _ i  |  _ | t j k rS d  |  j d <n  | t j k rr d  |  j d <n  | t j k r d  |  j d <n  t j	   |  _
 d |  _ d  |  _ |  j d | d | d | d | d	 | d
 | |
  |  j j |  _ |  j |  j d <|  j j   rRt | t t f  r/| } n
 | d } t j d | |  j  n  d  S)Nr   r      Fargsshellstdinstdoutstderrbufsize
subprocesszprocess %r created: pid %s)super__init__	_protocol_loop_pid_pipesr   PIPEcollectionsdeque_pending_calls	_finished_returncode_start_procpidZ_extra	get_debug
isinstancebytesstrr   debug)selfloopZprotocolr	   r
   r   r   r   r   ZextrakwargsZprogram)	__class__ -/usr/lib/python3.4/asyncio/base_subprocess.pyr      s0    						!	
	z BaseSubprocessTransport.__init__c             C   s  |  j  j d |  j g } |  j d  k	 r? | j d |  j  n  |  j j d  } | d  k	 rt | j d | j  n  |  j j d  } |  j j d  } | d  k	 r | | k r | j d | j  nF | d  k	 r | j d | j  n  | d  k	 r| j d	 | j  n  d
 d j |  S)Nzpid=%szreturncode=%sr   zstdin=%sr   r   zstdout=stderr=%sz	stdout=%sz	stderr=%sz<%s> )	r'   __name__r   r   appendr   getpipejoin)r$   infor   r   r   r(   r(   r)   __repr__*   s    z BaseSubprocessTransport.__repr__c             K   s
   t   d  S)N)NotImplementedError)r$   r	   r
   r   r   r   r   r&   r(   r(   r)   r   ?   s    zBaseSubprocessTransport._startc             C   s
   t   d  S)N)r2   )r$   fdr(   r(   r)   !_make_write_subprocess_pipe_protoB   s    z9BaseSubprocessTransport._make_write_subprocess_pipe_protoc             C   s
   t   d  S)N)r2   )r$   r3   r(   r(   r)    _make_read_subprocess_pipe_protoE   s    z8BaseSubprocessTransport._make_read_subprocess_pipe_protoc             C   sG   x$ |  j  j   D] } | j j   q W|  j d  k rC |  j   n  d  S)N)r   valuesr.   closer   	terminate)r$   protor(   r(   r)   r7   H   s    zBaseSubprocessTransport.closec             C   s   |  j  S)N)r   )r$   r(   r(   r)   get_pidN   s    zBaseSubprocessTransport.get_pidc             C   s   |  j  S)N)r   )r$   r(   r(   r)   get_returncodeQ   s    z&BaseSubprocessTransport.get_returncodec             C   s%   | |  j  k r |  j  | j Sd  Sd  S)N)r   r.   )r$   r3   r(   r(   r)   get_pipe_transportT   s    z*BaseSubprocessTransport.get_pipe_transportc             C   s   |  j  j |  d  S)N)r   send_signal)r$   signalr(   r(   r)   r=   Z   s    z#BaseSubprocessTransport.send_signalc             C   s   |  j  j   d  S)N)r   r8   )r$   r(   r(   r)   r8   ]   s    z!BaseSubprocessTransport.terminatec             C   s   |  j  j   d  S)N)r   kill)r$   r(   r(   r)   r?   `   s    zBaseSubprocessTransport.killc             #   s[    j  }   j } | j d  k	 r] | j   f d d   | j  Dd  H\ } } |   j d <n  | j d  k	 r | j   f d d   | j  Dd  H\ } } |   j d <n  | j d  k	 r | j   f d d   | j  Dd  H\ } } |   j d <n    j d  k	 st	    j j
   j j    x*   j D] \ } }   j j
 | |  q+Wd    _ d  S)Nc                  s   t    d  S)Nr   )WriteSubprocessPipeProtor(   )r$   r(   r)   <lambda>i   s    z4BaseSubprocessTransport._post_init.<locals>.<lambda>r   c                  s   t    d  S)Nr   )ReadSubprocessPipeProtor(   )r$   r(   r)   rA   n   s    r   c                  s   t    d  S)Nr   )rB   r(   )r$   r(   r)   rA   s   s    r   )r   r   r   Zconnect_write_piper   r   Zconnect_read_piper   r   AssertionError	call_soonr   connection_made)r$   procr%   _r.   callbackdatar(   )r$   r)   
_post_initc   s,    		z"BaseSubprocessTransport._post_initc             G   s?   |  j  d  k	 r( |  j  j | | f  n |  j j | |  d  S)N)r   r,   r   rD   )r$   cbrI   r(   r(   r)   _call~   s    zBaseSubprocessTransport._callc             C   s'   |  j  |  j j | |  |  j   d  S)N)rL   r   Zpipe_connection_lost_try_finish)r$   r3   excr(   r(   r)   _pipe_connection_lost   s    z-BaseSubprocessTransport._pipe_connection_lostc             C   s   |  j  |  j j | |  d  S)N)rL   r   Zpipe_data_received)r$   r3   rI   r(   r(   r)   _pipe_data_received   s    z+BaseSubprocessTransport._pipe_data_receivedc             C   s   | d  k	 s t  |   |  j d  k s6 t  |  j   |  j j   r[ t j d |  |  n  | |  _ |  j |  j j  |  j	   d  S)Nz%r exited with return code %r)
rC   r   r   r   r   r0   rL   r   Zprocess_exitedrM   )r$   
returncoder(   r(   r)   _process_exited   s    		z'BaseSubprocessTransport._process_exitedc             C   sk   |  j  s t  |  j d  k r# d  St d d   |  j j   D  rg d |  _  |  j j |  j d   n  d  S)Nc             s   s$   |  ] } | d  k	 o | j  Vq d  S)N)disconnected).0pr(   r(   r)   	<genexpr>   s   z6BaseSubprocessTransport._try_finish.<locals>.<genexpr>T)	r   rC   r   allr   r6   r   rD   _call_connection_lost)r$   r(   r(   r)   rM      s    	z#BaseSubprocessTransport._try_finishc             C   s7   z |  j  j |  Wd  d  |  _ d  |  _  d  |  _ Xd  S)N)r   connection_lostr   r   )r$   rN   r(   r(   r)   rX      s
    		z-BaseSubprocessTransport._call_connection_lost)r+   
__module____qualname__r   r1   r   r4   r5   r7   r:   r;   r<   r=   r8   r?   r   rJ   rL   rO   rP   rR   rM   rX   r(   r(   )r'   r)   r   
   s&   
	r   c               @   sX   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)rF   r3   r.   rS   )r$   rF   r3   r(   r(   r)   r      s    			z!WriteSubprocessPipeProto.__init__c             C   s   | |  _  d  S)N)r.   )r$   Z	transportr(   r(   r)   rE      s    z(WriteSubprocessPipeProto.connection_madec             C   s   d |  j  j |  j |  j f S)Nz<%s fd=%s pipe=%r>)r'   r+   r3   r.   )r$   r(   r(   r)   r1      s    z!WriteSubprocessPipeProto.__repr__c             C   s#   d |  _  |  j j |  j |  d  S)NT)rS   rF   rO   r3   )r$   rN   r(   r(   r)   rY      s    	z(WriteSubprocessPipeProto.connection_lostc             C   s   |  j  j j   d  S)N)rF   r   pause_writing)r$   r(   r(   r)   r\      s    z&WriteSubprocessPipeProto.pause_writingc             C   s   |  j  j j   d  S)N)rF   r   resume_writing)r$   r(   r(   r)   r]      s    z'WriteSubprocessPipeProto.resume_writingN)	r+   rZ   r[   r   rE   r1   rY   r\   r]   r(   r(   r(   r)   r@      s   r@   c               @   s   e  Z d  Z d d   Z d S)rB   c             C   s   |  j  j |  j |  d  S)N)rF   rP   r3   )r$   rI   r(   r(   r)   data_received   s    z%ReadSubprocessPipeProto.data_receivedN)r+   rZ   r[   r^   r(   r(   r(   r)   rB      s   rB   )r   r    r   r   Z
coroutinesr   logr   ZSubprocessTransportr   ZBaseProtocolr@   ZProtocolrB   r(   r(   r(   r)   <module>   s   