
    =Ogk/                     &   g d Z ddlZddlZddlZddlZddlZddlmZ 	 ej        	                     ej
                              Zn# e$ r dZY nw xY wd Zd Zd Zd Z G d d	e          Z G d
 de          Z G d de          Z G d de          Zda e            a ej        d          a e            a[i Z eej                                                   D ] \  Z!Z"e!dd         dk    rde!vr	de! ee" <   ![![" e            Z#dS ))BaseProcesscurrent_processactive_childrenparent_process    N)WeakSetc                      t           S )z@
    Return process object representing the current process
    )_current_process     0/usr/lib64/python3.11/multiprocessing/process.pyr   r   %   s
     r   c                  F    t                       t          t                    S )zN
    Return list of process objects corresponding to live child processes
    )_cleanuplist	_childrenr
   r   r   r   r   +   s     JJJ	??r   c                      t           S )z?
    Return process object representing the parent process
    )_parent_processr
   r   r   r   r   3   s
     r   c                      t          t                    D ]9} | j        x}r.|                                t                              |            :d S N)r   r   _popenpolldiscard)pchild_popens     r   r   r   =   sV    )__ ! !8#K 	!)9)9););)Ga   ! !r   c                   n   e Zd ZdZd Zddddi fdddZd Zd Zd	 Zd
 Z	d Z
ddZd Zd Zed             Zej        d             Zed             Zej        d             Zed             Zej        d             Zed             Zed             ZeZed             Zd ZddZed             ZdS )r   z
    Process objects represent activity that is run in a separate process

    The class is analogous to `threading.Thread`
    c                     t           r   )NotImplementedErrorselfs    r   _PopenzBaseProcess._PopenM   s    !!r   Nr
   )daemonc                6   t          t                    }t          j        |fz   | _        t          j                                        | _        t          j                    | _        t          j	        | _
        d | _        d| _        || _        t          |          | _        t!          |          | _        |p;t%          |           j        dz   d                    d | j        D                       z   | _        ||| _        t.                              |            d S )NF-:c              3   4   K   | ]}t          |          V  d S r   )str).0is     r   	<genexpr>z'BaseProcess.__init__.<locals>.<genexpr>^   s(      ==c!ff======r   )next_process_counterr	   	_identity_configcopyosgetpid_parent_pidname_parent_namer   _closed_targettuple_argsdict_kwargstype__name__join_namer    	_danglingadd)r   grouptargetr1   argskwargsr    counts           r   __init__zBaseProcess.__init__P   s     %&&)3uh>'/44669;;,14[[
F|| >T$ZZ036XX==dn=====>
 DKdr   c                 2    | j         rt          d          d S )Nzprocess object is closed)r3   
ValueErrorr   s    r   _check_closedzBaseProcess._check_closedc   s%    < 	97888	9 	9r   c                 F    | j         r | j         | j        i | j         dS dS )zQ
        Method to be run in sub-process; can be overridden in sub-class
        N)r4   r6   r8   r   s    r   runzBaseProcess.rung   s9     < 	6DL$*555555	6 	6r   c                     |                                   t                       |                     |           | _        | j        j        | _        | `| `| `t          
                    |            dS )z%
        Start child process
        N)rG   r   r   r   sentinel	_sentinelr4   r6   r8   r   r>   r   s    r   startzBaseProcess.startn   sg     	 	


kk$''- L$*dldr   c                 `    |                                   | j                                         dS )zT
        Terminate process; sends SIGTERM signal or uses TerminateProcess()
        N)rG   r   	terminater   s    r   rO   zBaseProcess.terminate   s0     	r   c                 `    |                                   | j                                         dS )zT
        Terminate process; sends SIGKILL signal or uses TerminateProcess()
        N)rG   r   killr   s    r   rQ   zBaseProcess.kill   s0     	r   c                     |                                   | j                            |          }|t                              |            dS dS )z5
        Wait until child process terminates
        N)rG   r   waitr   r   )r   timeoutress      r   r;   zBaseProcess.join   sS     	 kw''?d##### ?r   c                     |                                   | t          u rdS | j        dS | j                                        }|dS t                              |            dS )z1
        Return whether process is alive
        TNF)rG   r	   r   r   r   r   )r   
returncodes     r   is_alivezBaseProcess.is_alive   sm     	###4 ;5[%%''
4d###5r   c                     | j         d| j                                         t          d          | j                                          d| _         | `t
                              |            d| _        dS )z
        Close the Process object.

        This method releases resources held by the Process object.  It is
        an error to call this method if the child process is still running.
        Nz^Cannot close a process while it is still running. You should first call join() or terminate().T)r   r   rF   closerL   r   r   r3   r   s    r   rZ   zBaseProcess.close   sz     ;"{!!)  "P Q Q QKDKd###r   c                     | j         S r   r<   r   s    r   r1   zBaseProcess.name   s
    zr   c                     || _         d S r   r\   )r   r1   s     r   r1   zBaseProcess.name   s     


r   c                 8    | j                             dd          S )z4
        Return whether process is a daemon
        r    F)r,   getr   s    r   r    zBaseProcess.daemon   s    
 |%000r   c                     || j         d<   dS )z1
        Set whether process is a daemon
        r    Nr,   )r   daemonics     r   r    zBaseProcess.daemon   s     "*Xr   c                     | j         d         S )Nauthkeyra   r   s    r   rd   zBaseProcess.authkey   s    |I&&r   c                 4    t          |          | j        d<   dS )z2
        Set authorization key of process
        rd   N)AuthenticationStringr,   )r   rd   s     r   rd   zBaseProcess.authkey   s    
 #7w"?"?Yr   c                 x    |                                   | j        | j        S | j                                        S )zM
        Return exit code of process or `None` if it has yet to stop
        )rG   r   r   r   s    r   exitcodezBaseProcess.exitcode   s:    
 	;;{!!!r   c                     |                                   | t          u rt          j                    S | j        o| j        j        S )zU
        Return identifier (PID) of process or `None` if it has yet to start
        )rG   r	   r.   r/   r   pidr   s    r   identzBaseProcess.ident   s?    
 	###9;;;24;?2r   c                 v    |                                   	 | j        S # t          $ r t          d          dw xY w)z{
        Return a file descriptor (Unix) or handle (Windows) suitable for
        waiting for process termination.
        zprocess not startedN)rG   rL   AttributeErrorrF   r   s    r   rK   zBaseProcess.sentinel   sO     		>>! 	> 	> 	>233=	>s    8c                    d }| t           u rd}nS| j        rd}nI| j        t          j                    k    rd}n*| j        d}n | j                                        }|d}nd}t          |           j        d| j	        z  g}| j        "|
                    d| j        j        z             |
                    d| j        z             |
                    |           |3t                              ||          }|
                    d	|z             | j        r|
                    d
           dd                    |          z  S )Nstartedclosedunknowninitialstoppedzname=%rzpid=%sz	parent=%szexitcode=%sr    z<%s> )r	   r3   r0   r.   r/   r   r   r9   r:   r<   appendrj   _exitcode_to_namer_   r    r;   )r   rh   statusinfos       r   __repr__zBaseProcess.__repr__  sF   ###FF\ 	#FF,,FF[ FF{''))H#""T

#Y%;<;"KK4;?2333K$"22333F(,,Xx@@HKK0111; 	"KK!!!&&r   c                    ddl m}m} 	 | j        |                    | j                   t          j        d          at                      a	|
                                 t          }| at          | j        | j        |          at           j        r%t!          j                                                     	 |                                  ~n# ~w xY w|                    d           	 |                                  d}|                                 n# |                                 w xY wn# t0          $ rl}|j        d}nXt5          |j        t6                    r|j        }n6t8          j                            t?          |j                  dz              d}Y d }~nKd }~w d}dd l }t8          j                            d| j!        z             |"                                 Y nxY wt!          j#                     |                    d|z             |$                                 nD# t!          j#                     |                    d|z             |$                                 w xY w|S )N   )utilcontextz child process calling self.run()r   
zProcess %s:
z process exiting with exitcode %d)% r|   r}   _start_method_force_start_method	itertoolsrC   r*   setr   _close_stdinr	   _ParentProcessr2   r0   r   	threading_HAVE_THREAD_NATIVE_IDmain_thread_set_native_id_after_forkrx   rI   _exit_function
SystemExitcode
isinstanceintsysstderrwriter%   	tracebackr1   	print_exc	_shutdown_flush_std_streams)r   parent_sentinelr|   r}   old_processrh   er   s           r   
_bootstrapzBaseProcess._bootstrap"  s|   ########(	&!-++D,>???(q11I*K#,!4#3_F FO/ 9%''66888   """  KKII8999&


##%%%%##%%%%% 	 	 	v~AFC(( 6
  QVt!3444	"HJ_ty8999!!!!!!!!II88CDDD##%%%% !!!II88CDDD##%%%%sc   B,D. 7C D. CD. )D ?D. D**D. -H* .
G'8A"FH* AG'%H* *AI+c                  l    ddl m}  | j                                         |                                  d S )Nr{   r|   )r   r|   _finalizer_registryclear_run_after_forkersr   s    r   r   zBaseProcess._after_forkR  sA     &&(((!!!!!r   r   )r:   
__module____qualname____doc__r   rD   rG   rI   rM   rO   rQ   r;   rX   rZ   propertyr1   setterr    rd   rh   rk   rj   rK   ry   r   staticmethodr   r
   r   r   r   r   G   s        
" " " "$T2     &9 9 96 6 6  $       	$ 	$ 	$ 	$  &  "   X 
[  [ 1 1 X1 ]* * ]* ' ' X' ^@ @ ^@ " " X" 3 3 X3 C	> 	> X	>' ' '>. . . .` " " \" " "r   r   c                       e Zd Zd ZdS )rf   c                 n    ddl m}  |            t          d          t          t	          |           ffS )Nr{   )get_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)r}   r   	TypeErrorrf   bytes)r   r   s     r   
__reduce__zAuthenticationString.__reduce__^  sO    //////'2   $eDkk^33r   N)r:   r   r   r   r
   r   r   rf   rf   ]  s#        4 4 4 4 4r   rf   c                   <    e Zd Zd Zd Zed             ZddZeZdS )r   c                 v    d| _         || _        || _        d | _        d | _        d| _        || _        i | _        d S )Nr
   F)r+   r<   _pidr0   r   r3   rL   r,   )r   r1   rj   rK   s       r   rD   z_ParentProcess.__init__n  s?    
	!r   c                 6    ddl m}  || j        gd           S )Nr   rS   rT   multiprocessing.connectionrS   rL   )r   rS   s     r   rX   z_ParentProcess.is_alivex  s1    3333334(!44444r   c                     | j         S r   )r   r   s    r   rk   z_ParentProcess.ident|  s
    yr   Nc                 8    ddl m}  || j        g|           dS )z6
        Wait until parent process terminates
        r   r   r   Nr   )r   rT   rS   s      r   r;   z_ParentProcess.join  s6     	433333dnw//////r   r   )	r:   r   r   rD   rX   r   rk   r;   rj   r
   r   r   r   r   l  sb          5 5 5   X0 0 0 0 CCCr   r   c                       e Zd Zd Zd ZdS )_MainProcessc                     d| _         d| _        d | _        d | _        d| _        t          t          j        d                    dd| _        d S )Nr
   MainProcessF    z/mp)rd   	semprefix)	r+   r<   r0   r   r3   rf   r.   urandomr,   r   s    r   rD   z_MainProcess.__init__  sN    "
#7
2#G#G%*, ,r   c                     d S r   r
   r   s    r   rZ   z_MainProcess.close  s    r   N)r:   r   r   rD   rZ   r
   r   r   r   r     s2        , , ,$    r   r   r{      SIG_r"   )$__all__r.   r   signalr   r   _weakrefsetr   pathabspathgetcwdORIGINAL_DIROSErrorr   r   r   r   objectr   r   rf   r   r   r   r	   rC   r*   r   r   rv   r   __dict__itemsr1   signumr=   r
   r   r   <module>r      s:     
			 



               7??929;;//LL   LLL      ! ! !O" O" O" O" O"& O" O" O"l4 4 4 4 45 4 4 4    [   B    ;   0 <>> "9?1%% CEE	  D..0011 0 0LD&BQBx3d??%/ZZ6'"& GII			s   'A AA