ó
A¾^Yc           @   sl   d  Z  d d l Z d d l Z d d l Z d d l Z d „  Z d d d „  ƒ  YZ d e f d „  ƒ  YZ d S(	   s¨   
    ForkedFunc provides a way to run a function in a forked process
    and get at its return value, stdout and stderr output as well
    as signals and exitstatusus.
iÿÿÿÿNc            s`   t  t | ƒ d ƒ ‰  |  ˆ  j ƒ  k r@ t j ˆ  j ƒ  |  ƒ n  d d ‡  f d †  ƒ  Y} | ƒ  S(   Nt   wt	   AutoFlushc              s&   e  Z ‡  f d  †  Z ‡  f d †  Z RS(   c            s   ˆ  j  | ƒ ˆ  j ƒ  d  S(   N(   t   writet   flush(   t   selft   data(   t   f(    s2   /tmp/pip-build-UnxK1c/py/py/_process/forkedfunc.pyR      s    c            s   t  ˆ  | ƒ S(   N(   t   getattr(   R   t   name(   R   (    s2   /tmp/pip-build-UnxK1c/py/py/_process/forkedfunc.pyt   __getattr__   s    (   t   __name__t
   __module__R   R	   (    (   R   (    s2   /tmp/pip-build-UnxK1c/py/py/_process/forkedfunc.pyR      s   (    (   t   opent   strt   filenot   ost   dup2(   t   fdt   filenameR   (    (   R   s2   /tmp/pip-build-UnxK1c/py/py/_process/forkedfunc.pyt   get_unbuffered_io   s
    t
   ForkedFuncc           B   sP   e  Z d  Z d d d d d d „ Z d „  Z e j d „ Z d „  Z	 d „  Z
 RS(   i   i    c   	      C   sÒ   | d  k r g  } n  | d  k r* i  } n  | |  _ | |  _ | |  _ t j j j ƒ  |  _ } | j	 d ƒ |  _
 | j	 d ƒ |  _ | j	 d ƒ |  _ t j ƒ  } | r² | |  _ n d  |  _ |  j | | | ƒ d  S(   Nt   retvalt   stdoutt   stderr(   t   Nonet   funt   argst   kwargst   pyt   patht   localt   mkdtempt   tempdirt   ensuret   RETVALt   STDOUTt   STDERRR   t   forkt   pidt   _child(	   R   R   R   R   t
   nice_levelt   child_on_startt   child_on_exitR    R&   (    (    s2   /tmp/pip-build-UnxK1c/py/py/_process/forkedfunc.pyt   __init__   s     						c   
      C   sJ  t  d |  j ƒ t _ } t  d |  j ƒ t _ } |  j j d ƒ } d } z³ | rc t j	 | ƒ n  y^ | d  k	 r| | ƒ  n  |  j |  j |  j Ž  } | j t j | ƒ ƒ | d  k	 rÀ | ƒ  n  Wn8 t j j ƒ  }	 | j t |	 j ƒ  ƒ ƒ |  j } n XWd  | j ƒ  | j ƒ  | j ƒ  Xt j d ƒ t j d ƒ t j | ƒ d  S(   Ni   i   t   wbi    (   R   R#   t   sysR   R$   R   R"   R   R   t   niceR   R   R   R   R   t   marshalt   dumpsR   t   codet   ExceptionInfoR   t   _getreprcrasht   EXITSTATUS_EXCEPTIONt   closet   _exit(
   R   R(   R)   R*   R   R   t   retvalft
   EXITSTATUSR   t   excinfo(    (    s2   /tmp/pip-build-UnxK1c/py/py/_process/forkedfunc.pyR'   4   s0    


c   
      C   sù   | |  j  d ƒ \ } } | rU t j | ƒ rC t j | ƒ d } q[ t j | ƒ } n d } | d @} | rµ | rµ |  j j d ƒ } z | j ƒ  } Wd  | j ƒ  Xt	 j
 | ƒ } n d  } |  j j ƒ  } |  j j ƒ  }	 |  j ƒ  t | | | | |	 ƒ S(   Ni    i€   i   t   rb(   R&   R   t   WIFSIGNALEDt   WTERMSIGt   WEXITSTATUSR"   R   t   readR5   R/   t   loadsR   R#   R$   t   _removetempt   Result(
   R   t   waiterR&   t   systemstatust
   exitstatust   signalR   t   retval_dataR   R   (    (    s2   /tmp/pip-build-UnxK1c/py/py/_process/forkedfunc.pyt
   waitfinishQ   s$    

c         C   s#   |  j  j ƒ  r |  j  j ƒ  n  d  S(   N(   R    t   checkt   remove(   R   (    (    s2   /tmp/pip-build-UnxK1c/py/py/_process/forkedfunc.pyR@   i   s    c         C   s    |  j  d  k	 r |  j ƒ  n  d  S(   N(   R&   R   R@   (   R   (    (    s2   /tmp/pip-build-UnxK1c/py/py/_process/forkedfunc.pyt   __del__m   s    N(   R
   R   R4   R   R+   R'   R   t   waitpidRG   R@   RJ   (    (    (    s2   /tmp/pip-build-UnxK1c/py/py/_process/forkedfunc.pyR      s   			RA   c           B   s   e  Z d  „  Z RS(   c         C   s1   | |  _  | |  _ | |  _ | |  _ | |  _ d  S(   N(   RD   RE   R   t   outt   err(   R   RD   RE   R   R   R   (    (    s2   /tmp/pip-build-UnxK1c/py/py/_process/forkedfunc.pyR+   s   s
    				(   R
   R   R+   (    (    (    s2   /tmp/pip-build-UnxK1c/py/py/_process/forkedfunc.pyRA   r   s   (    (	   t   __doc__R   R   R-   R/   R   R   t   objectRA   (    (    (    s2   /tmp/pip-build-UnxK1c/py/py/_process/forkedfunc.pyt   <module>   s   	W