
    Rhk/                        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                  j                   ej                               Z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j2                  d      a e       a[i Z eej>                  jA                               D ]  \  Z!Z"e!dd dk(  sde!vsde! ee" <    [![" e       Z#y# e$ r dZY w xY w))BaseProcesscurrent_processactive_childrenparent_process    N)WeakSetc                      t         S )z@
    Return process object representing the current process
    )_current_process     ./usr/lib/python3.12/multiprocessing/process.pyr   r   %   s
     r   c                  4    t                t        t              S )zN
    Return list of process objects corresponding to live child processes
    )_cleanuplist	_childrenr
   r   r   r   r   +   s     J	?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 ]7  } | j                  x}s|j                         #t        j	                  |        9 y N)r   r   _popenpolldiscard)pchild_popens     r   r   r   =   s@    )_ !88#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y)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   |J d       t        t              }t        j                  |fz   | _        t        j                  j                         | _        t        j                         | _        t        j                  | _
        d | _        d| _        || _        t        |      | _        t!        |      | _        |xs; t%        |       j&                  dz   dj)                  d | j                  D              z   | _        ||| _        t.        j1                  |        y )Nz#group argument must be None for nowF-:c              3   2   K   | ]  }t        |        y wr   )str).0is     r   	<genexpr>z'BaseProcess.__init__.<locals>.<genexpr>^   s     =c!f=s   )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    }CCC}%&)33uh>'//44699;,114[
F| >T$Z0036XX=dnn==>
 DKdr   c                 2    | j                   rt        d      y )Nzprocess object is closed)r3   
ValueErrorr   s    r   _check_closedzBaseProcess._check_closedc   s    <<788 r   c                 j    | j                   r' | j                   | j                  i | j                   yy)zQ
        Method to be run in sub-process; can be overridden in sub-class
        N)r4   r6   r8   r   s    r   runzBaseProcess.rung   s+     <<DLL$**55 r   c                    | j                          | j                  J d       | j                  t        j                         k(  sJ d       t
        j                  j                  d      rJ d       t                | j                  |       | _        | j                  j                  | _        | `| `| `t        j!                  |        y)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)rG   r   r0   r.   r/   r	   r,   getr   r   sentinel	_sentinelr4   r6   r8   r   r>   r   s    r   startzBaseProcess.startn   s     	{{"B$BB"299;. 	LK	L.#++//9 	ED	E9
kk$'-- L$*dldr   c                 X    | j                          | j                  j                          y)zT
        Terminate process; sends SIGTERM signal or uses TerminateProcess()
        N)rG   r   	terminater   s    r   rP   zBaseProcess.terminate   s      	r   c                 X    | j                          | j                  j                          y)zT
        Terminate process; sends SIGKILL signal or uses TerminateProcess()
        N)rG   r   killr   s    r   rR   zBaseProcess.kill   s      	r   c                     | j                          | j                  t        j                         k(  sJ d       | j                  J d       | j                  j                  |      }|t        j                  |        yy)z5
        Wait until child process terminates
        zcan only join a child processNzcan only join a started process)rG   r0   r.   r/   r   waitr   r   )r   timeoutress      r   r;   zBaseProcess.join   sr     	299;.O0OO.{{&I(II&kkw'?d# r   c                    | j                          | t        u ry| j                  t        j                         k(  sJ d       | j
                  y| j
                  j                         }|yt        j                  |        y)z1
        Return whether process is alive
        Tzcan only test a child processF)	rG   r	   r0   r.   r/   r   r   r   r   )r   
returncodes     r   is_alivezBaseProcess.is_alive   su     	##299;.O0OO.;;[[%%'
d#r   c                     | j                   ]| j                   j                         t        d      | j                   j                          d| _         | `t
        j                  |        d| _        y)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   closerM   r   r   r3   r   s    r   r[   zBaseProcess.close   sg     ;;"{{!)  "P Q QKKDKd#r   c                     | j                   S r   )r<   r   s    r   r1   zBaseProcess.name   s    zzr   c                 @    t        |t              sJ d       || _        y )Nzname must be a string)
isinstancer%   r<   )r   r1   s     r   r1   zBaseProcess.name   s    $$=&==$
r   c                 :    | j                   j                  dd      S )z4
        Return whether process is a daemon
        r    F)r,   rK   r   s    r   r    zBaseProcess.daemon   s    
 ||%00r   c                 H    | j                   J d       || j                  d<   y)z1
        Set whether process is a daemon
        Nzprocess has already startedr    )r   r,   )r   daemonics     r   r    zBaseProcess.daemon   s(    
 {{"A$AA"!)Xr   c                      | j                   d   S )Nauthkey)r,   r   s    r   rc   zBaseProcess.authkey   s    ||I&&r   c                 4    t        |      | j                  d<   y)z2
        Set authorization key of process
        rc   N)AuthenticationStringr,   )r   rc   s     r   rc   zBaseProcess.authkey   s    
 #7w"?Yr   c                     | j                          | j                  | j                  S | j                  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   s7    
 	;;;;{{!!r   c                     | j                          | t        u rt        j                         S | j                  xr | 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<    
 	##99;;;24;;??2r   c                 n    | j                          	 | 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   rM   AttributeErrorrF   r   s    r   rL   zBaseProcess.sentinel   s<     		>>>! 	>23=	>s    4c                    d }| t         u rd}nc| j                  rd}nT| j                  t        j                         k7  rd}n0| j
                  d}n!| j
                  j                         }|d}nd}t        |       j                  d| j                  z  g}| j
                  (|j                  d| j
                  j                  z         |j                  d| j                  z         |j                  |       |*t        j                  ||      }|j                  d	|z         | j                  r|j                  d
       ddj                  |      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<   appendri   _exitcode_to_namerK   r    r;   )r   rg   statusinfos       r   __repr__zBaseProcess.__repr__  s   ##F\\F,F[[ F{{'')H#""T
##Y%;<;;"KK4;;??23K$"2"223F(,,Xx@HKK01;;KK!&&r   c                    ddl m}m} 	 | j                  |j	                  | j                         t        j                  d      at               a	|j                          t        }| at        | j                  | j                  |      at         j"                  r"t!        j$                         j'                          	 | j)                          ~|j+                  d       	 | j-                          d}|j/                          	 t!        jF                          |j+                  d|z         |jI                          |S # ~w xY w# |j/                          w xY w# t0        $ rw}|j2                  d}n^t5        |j2                  t6              r|j2                  }n7t8        j:                  j=                  t?        |j2                        dz          d}Y d }~d }~w d}dd l }t8        j:                  j=                  d| jB                  z         |jE                          Y xY w# t!        jF                          |j+                  dz         |jI                          w xY w)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_forkrw   rI   _exit_function
SystemExitcoder^   intsysstderrwriter%   	tracebackr1   	print_exc	_shutdown_flush_std_streams)r   parent_sentinelr{   r|   old_processrg   er   s           r   
_bootstrapzBaseProcess._bootstrap"  s   #(	&!!-++D,>,>?(q1I*K#,!!4#3#3_FO//%%'668   "  II89&
##% !II88CD##%3   ##% 	vv~AFFC(66

  QVVt!34	"HJJ_tyy89!!II88CD##%sb   B1E <D< E E 1E H <D??E EE 	H A-GH AHH :Ic                  d    ddl m}  | j                  j                          | j	                          y )Nrz   r{   )r~   r{   _finalizer_registryclear_run_after_forkersr   s    r   r   zBaseProcess._after_forkR  s#      &&(!r   r   )r:   
__module____qualname____doc__r   rD   rG   rI   rN   rP   rR   r;   rY   r[   propertyr1   setterr    rc   rg   rj   ri   rL   rx   r   staticmethodr   r
   r   r   r   r   G   s4   
" "$T2 &96$ 	$&"   
[[  1 1 ]]* * ' ' ^^@ @ " " 3 3 C	> 	>'>.` " "r   r   c                       e Zd Zd Zy)re   c                 V    ddl m}  |       t        d      t        t	        |       ffS )Nrz   )get_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)r|   r   	TypeErrorre   bytes)r   r   s     r   
__reduce__zAuthenticationString.__reduce__^  s3    /'2  $eDk^33r   N)r:   r   r   r   r
   r   r   re   re   ]  s    4r   re   c                   4    e Zd Zd Zd Zed        ZddZeZy)r   c                 t    d| _         || _        || _        d | _        d | _        d| _        || _        i | _        y )Nr
   F)r+   r<   _pidr0   r   r3   rM   r,   )r   r1   ri   rL   s       r   rD   z_ParentProcess.__init__n  s;    
	!r   c                 :    ddl m}  || j                  gd       S )Nr   rT   rU   multiprocessing.connectionrT   rM   )r   rT   s     r   rY   z_ParentProcess.is_alivex  s    3(!444r   c                     | j                   S r   )r   r   s    r   rj   z_ParentProcess.ident|  s    yyr   Nc                 :    ddl m}  || j                  g|       y)z6
        Wait until parent process terminates
        r   r   r   Nr   )r   rU   rT   s      r   r;   z_ParentProcess.join  s     	4dnnw/r   r   )	r:   r   r   rD   rY   r   rj   r;   ri   r
   r   r   r   r   l  s,    5  0 Cr   r   c                       e Zd Zd Zd Zy)_MainProcessc                     d| _         d| _        d | _        d | _        d| _        t        t        j                  d            dd| _        y )Nr
   MainProcessF    z/mp)rc   	semprefix)	r+   r<   r0   r   r3   re   r.   urandomr,   r   s    r   rD   z_MainProcess.__init__  sB    "
#7

2#G%*,r   c                      y r   r
   r   s    r   r[   z_MainProcess.close  s    r   N)r:   r   r   rD   r[   r
   r   r   r   r     s    ,$r   r   rz      SIG_r"   )$__all__r.   r   signalr   r   _weakrefsetr   pathabspathgetcwdORIGINAL_DIROSErrorr   r   r   r   objectr   r   re   r   r   r   r	   rC   r*   r   r   ru   r   __dict__itemsr1   signumr=   r
   r   r   <module>r      s+   
 
    77??9299;/L!O"& O"l45 4[ B; 0 > "9??1% E	  ..01 0LD&BQx3d?'(Z6'"0 	& I	s  Ls   *C0 0C:9C: