
    hJ/                     &   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     ./usr/lib/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 ]5} | j                                        t                              |            6d S N)r   r   _popenpolldiscard)ps    r   r   r   =   sF    )__ ! !8==??&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                N   |
J d            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 )Nz#group argument must be None for nowF-: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targetr0   argskwargsr   counts           r   __init__zBaseProcess.__init__P   s    }}C}}}%&&)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)r2   
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)r3   r5   r7   r   s    r   runzBaseProcess.rung   s9     < 	6DL$*555555	6 	6r   c                    |                                   | j        
J d            | j        t          j                    k    s
J d            t
          j                            d          r
J d            t                       | 	                    |           | _        | j        j
        | _        | `| `| `t                              |            dS )z%
        Start child process
        Nzcannot start a process twicez:can only start a process object created by current processr   z3daemonic processes are not allowed to have children)rF   r   r/   r-   r.   r	   r+   getr   r   sentinel	_sentinelr3   r5   r7   r   r=   r   s    r   startzBaseProcess.startn   s     	{""$B"""29;;...K /..#+//99 	E 	ED	E 	E 	E


kk$''- L$*dldr   c                 `    |                                   | j                                         dS )zT
        Terminate process; sends SIGTERM signal or uses TerminateProcess()
        N)rF   r   	terminater   s    r   rO   zBaseProcess.terminate   s0     	r   c                 `    |                                   | j                                         dS )zT
        Terminate process; sends SIGKILL signal or uses TerminateProcess()
        N)rF   r   killr   s    r   rQ   zBaseProcess.kill   s0     	r   c                    |                                   | j        t          j                    k    s
J d            | j        
J d            | j                            |          }|t                              |            dS dS )z5
        Wait until child process terminates
        zcan only join a child processNzcan only join a started process)rF   r/   r-   r.   r   waitr   r   )r   timeoutress      r   r:   zBaseProcess.join   s     	29;;...0O...{&&(I&&&kw''?d##### ?r   c                    |                                   | t          u rdS | j        t          j                    k    s
J d            | j        dS | j                                        }|dS t                              |            dS )z1
        Return whether process is alive
        Tzcan only test a child processNF)	rF   r	   r/   r-   r.   r   r   r   r   )r   
returncodes     r   is_alivezBaseProcess.is_alive   s     	###429;;...0O...;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   rE   closerL   r   r   r2   r   s    r   rZ   zBaseProcess.close   sz     ;"{!!)  "P Q Q QKDKd###r   c                     | j         S r   )r;   r   s    r   r0   zBaseProcess.name   s
    zr   c                 R    t          |t                    s
J d            || _        d S )Nzname must be a string)
isinstancer$   r;   )r   r0   s     r   r0   zBaseProcess.name   s,    $$$==&====


r   c                 8    | j                             dd          S )z4
        Return whether process is a daemon
        r   F)r+   rJ   r   s    r   r   zBaseProcess.daemon   s    
 |%000r   c                 <    | j         
J d            || j        d<   dS )z1
        Set whether process is a daemon
        Nzprocess has already startedr   )r   r+   )r   daemonics     r   r   zBaseProcess.daemon   s-    
 {""$A"""!)Xr   c                     | j         d         S )Nauthkey)r+   r   s    r   rb   zBaseProcess.authkey   s    |I&&r   c                 4    t          |          | j        d<   dS )z2
        Set authorization key of process
        rb   N)AuthenticationStringr+   )r   rb   s     r   rb   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
        )rF   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
        )rF   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)rF   rL   AttributeErrorrE   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	   r2   r/   r-   r.   r   r   r8   r9   r;   appendrh   _exitcode_to_namerJ   r   r:   )r   rf   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)% rz   r{   _start_method_force_start_method	itertoolsrB   r)   setr   _close_stdinr	   _ParentProcessr1   r/   r   	threading_HAVE_THREAD_NATIVE_IDmain_thread_set_native_id_after_forkrv   rH   _exit_function
SystemExitcoder]   intsysstderrwriter$   	tracebackr0   	print_exc	_shutdown_flush_std_streams)r   parent_sentinelrz   r{   old_processrf   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 )Nry   rz   )r}   rz   _finalizer_registryclear_run_after_forkersr   s    r   r   zBaseProcess._after_forkR  sA     &&(((!!!!!r   r   )r9   
__module____qualname____doc__r   rC   rF   rH   rM   rO   rQ   r:   rX   rZ   propertyr0   setterr   rb   rf   ri   rh   rK   rw   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 )rd   c                 n    ddl m}  |            t          d          t          t	          |           ffS )Nry   )get_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)r{   r   	TypeErrorrd   bytes)r   r   s     r   
__reduce__zAuthenticationString.__reduce__^  sO    //////'2   $eDkk^33r   N)r9   r   r   r   r
   r   r   rd   rd   ]  s#        4 4 4 4 4r   rd   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;   _pidr/   r   r2   rL   r+   )r   r0   rh   rK   s       r   rC   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   ri   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   )	r9   r   r   rC   rX   r   ri   r:   rh   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)rb   	semprefix)	r*   r;   r/   r   r2   rd   r-   urandomr+   r   s    r   rC   z_MainProcess.__init__  sN    "
#7
2#G#G%*, ,r   c                     d S r   r
   r   s    r   rZ   z_MainProcess.close  s    r   N)r9   r   r   rC   rZ   r
   r   r   r   r     s2        , , ,$    r   r   ry      SIG_r!   )$__all__r-   r   signalr   r   _weakrefsetr   pathabspathgetcwdORIGINAL_DIROSErrorr   r   r   r   objectr   r   rd   r   r   r   r	   rB   r)   r   r   rt   r   __dict__itemsr0   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