
    al                     X    d Z ddlZddlZddlZddlZd Z G d d      Z G d de      Zy)z
    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.
    Nc                     t        t        |      d      | j                         k7  r$t        j                  j                         |         G fdd      } |       S )Nwc                   "    e Zd Z fdZ fdZy)$get_unbuffered_io.<locals>.AutoFlushc                 H    j                  |       j                          y N)writeflush)selfdatafs     8/usr/lib/python3/dist-packages/py/_process/forkedfunc.pyr	   z*get_unbuffered_io.<locals>.AutoFlush.write   s    GGDMGGI    c                     t        |      S r   )getattr)r   namer   s     r   __getattr__z0get_unbuffered_io.<locals>.AutoFlush.__getattr__   s    1d##r   N)__name__
__module____qualname__r	   r   )r   s   r   	AutoFlushr      s    		$r   r   )openstrfilenoosdup2)fdfilenamer   r   s      @r   get_unbuffered_ior      sI    S]C A	QXXZ

B$ $ ;r   c                   L    e Zd ZdZ	 	 ddZd Zej                  fdZd Z	d Z
y)	
ForkedFunc   Nc                    |g }|i }|| _         || _        || _        t        j                  j
                  j                         x| _        }|j                  d      | _	        |j                  d      | _
        |j                  d      | _        t        j                         }|r|| _        y d | _        | j                  |||       y )Nretvalstdoutstderr)funargskwargspypathlocalmkdtemptempdirensureRETVALSTDOUTSTDERRr   forkpid_child)	r   r'   r(   r)   
nice_levelchild_on_startchild_on_exitr.   r4   s	            r   __init__zForkedFunc.__init__   s    <D>F	!#!6!6!88wnnX.nnX.nnX.ggiDHDHKK
NMBr   c                    t        d| j                        xt        _        }t        d| j                        xt        _        }| j                  j                  d      }d}	 |rt        j                  |       	 | |         | j                  | j                  i | j                  }|j                  t        j                  |             | |        |j-                          |j-                          |j-                          t        j,                  d       t        j,                  d       t        j.                  |       y #  t         j"                  j%                         }	|j                  t'        |	j)                                      | j*                  }Y xY w# |j-                          |j-                          |j-                          w xY w)N      wbr   )r   r1   sysr%   r2   r&   r0   r   r   nicer'   r(   r)   r	   marshaldumpsr*   codeExceptionInfor   _getreprcrashEXITSTATUS_EXCEPTIONclose_exit)
r   r6   r7   r8   r%   r&   retvalf
EXITSTATUSr$   excinfos
             r   r5   zForkedFunc._child4   sF    04;;??
V/4;;??
V++""4(
	
#
7!-"$!499<<gmmF34 ,!O LLNLLNMMO


7''//1S!6!6!89:!66
LLNLLNMMOs    !F 9AE AFF 2Gc                 H    || j                   d      \  }}|rDt        j                  |      rt        j                  |      dz   }nt        j                  |      }nd}|dz  }|sT|sR| j
                  j                  d      }	 |j                         }|j                          t        j                  |      }nd }| j                  j                         }| j                  j                         }	| j                          t        |||||	      S # |j                          w xY w)Nr         rb)r4   r   WIFSIGNALEDWTERMSIGWEXITSTATUSr0   r   readrF   r@   loadsr1   r2   _removetempResult)
r   waiterr4   systemstatus
exitstatussignalr$   retval_datar%   r&   s
             r   
waitfinishzForkedFunc.waitfinishQ   s    "488Q/\~~l+[[6<
^^L9
J$&[[%%d+F$kkm]];/FF!!#!!#j&&&&AA s   D D!c                 n    | j                   j                         r| j                   j                          y y r   )r.   checkremover   s    r   rT   zForkedFunc._removetempi   s'    <<LL!  r   c                 >    | j                   | j                          y y r   )r4   rT   r_   s    r   __del__zForkedFunc.__del__m   s    88  r   )NNr   NN)r   r   r   rE   r9   r5   r   waitpidr[   rT   ra    r   r   r!   r!      s6     @A48C*: !#

 B0"r   r!   c                       e Zd Zd Zy)rU   c                 J    || _         || _        || _        || _        || _        y r   )rX   rY   r$   outerr)r   rX   rY   r$   r%   r&   s         r   r9   zResult.__init__s   s%    $r   N)r   r   r   r9   rc   r   r   rU   rU   r   s    r   rU   )	__doc__r*   r   r>   r@   r   r!   objectrU   rc   r   r   <module>rj      s6    
 	 
 
T TnV r   