
    Dgl                     f    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dS )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          |                                 k    r't          j                                        |             G fdd          } |            S )Nwc                   $    e Zd Z fdZ fdZdS )$get_unbuffered_io.<locals>.AutoFlushc                 Z                         |                                            d S N)writeflush)selfdatafs     K/var/www/sysmax/venv/lib/python3.11/site-packages/py/_process/forkedfunc.pyr	   z*get_unbuffered_io.<locals>.AutoFlush.write   s#    GGDMMMGGIIIII    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      sG        	 	 	 	 		$ 	$ 	$ 	$ 	$ 	$ 	$r   r   )openstrfilenoosdup2)fdfilenamer   r   s      @r   get_unbuffered_ior      s    S]]C  A	QXXZZ


B$ $ $ $ $ $ $ $ $ $ 9;;r   c                   D    e Zd ZdZ	 	 d	dZd Zej        fdZd Z	d Z
dS )

ForkedFunc   Nr   c                    |g }|i }|| _         || _        || _        t          j        j                                        x| _        }|                    d          | _	        |                    d          | _
        |                    d          | _        t          j                    }|r	|| _        d S d | _        |                     |||           d S )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8wnnX..nnX..nnX..gii 	CDHHHDHKK
NMBBBBBr   c                    t          d| j                  xt          _        }t          d| j                  xt          _        }| j                            d          }d}	 |rt          j	        |           	 |
 |              | j
        | j        i | j        }|                    t          j        |                     |
 |             n`#  t           j                                        }	|                    t'          |	                                                     | j        }Y nxY w|                                 |                                 |                                 nA# |                                 |                                 |                                 w xY wt          j        d           t          j        d           t          j        |           d S )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   s    04;???
V/4;???
V+""4((
	 $
###
7!-"N$$$!49<<<gmF33444 ,!MOOO7'//11S!6!6!8!899:::!6


LLNNNLLNNNMMOOOO LLNNNLLNNNMMOOOO


s&    E+ 7AC E+ AD+)E+ +>F)c                 `    || j         d          \  }}|rAt          j        |          rt          j        |          dz   }nt          j        |          }nd}|dz  }|st|sr| j                            d          }	 |                                }|                                 n# |                                 w xY wt          j
        |          }nd }| j                                        }| j                                        }	|                                  t          |||||	          S )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%   "F48Q//\ 	~l++ :[66<

^L99

J$ 	& 	[%%d++F$kkmm];//FFF!!##!!##j&&&&AAAs   >B' 'B=c                 n    | j                                         r| j                                          d S d S r   )r.   checkremover   s    r   rT   zForkedFunc._removetempi   s<    < 	"L!!!!!	" 	"r   c                 @    | j         |                                  d S d S r   )r4   rT   r_   s    r   __del__zForkedFunc.__del__m   s*    8  r   )NNr   NN)r   r   r   rE   r9   r5   r   waitpidr[   rT   ra    r   r   r!   r!      s         @A48C C C C*  : !#
 B B B B0" " "    r   r!   c                       e Zd Zd ZdS )rU   c                 L    || _         || _        || _        || _        || _        d S 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      s     
			 				 



 
 
 
T T T T T T T Tn    V     r   