
    F\h/                     
   / S Qr SSKrSSKrSSKrSSKrSSKrSSKJr   \R                  R                  \R                  " 5       5      rS rS rS rS r " S S	\5      r " S
 S\5      r " S S\5      r " S S\5      rSq\" 5       q\R2                  " S5      q\" 5       qC0 r\" \R>                  RA                  5       5       H"  u  r!r"\!SS S:X  d  M  S\!;  d  M  S\! 3\\"* '   M$     C!C"\" 5       r#g! \ a    Sr Nf = f))BaseProcesscurrent_processactive_childrenparent_process    N)WeakSetc                      [         $ )z8
Return process object representing the current process
)_current_process     ./usr/lib/python3.13/multiprocessing/process.pyr   r   %   s
     r   c                  4    [        5         [        [        5      $ )zF
Return list of process objects corresponding to live child processes
)_cleanuplist	_childrenr
   r   r   r   r   +   s     J	?r   c                      [         $ )z7
Return process object representing the parent process
)_parent_processr
   r   r   r   r   3   s
     r   c                      [        [        5       H@  n U R                  =n(       d  M  UR                  5       c  M+  [        R	                  U 5        MB     g N)r   r   _popenpolldiscard)pchild_popens     r   r   r   =   s;    )_88#K#)9)9);)Ga  r   c                   ^   \ rS rSrSrS rSSSS0 4SS.S jjrS rS	 rS
 r	S r
S rSS jrS rS r\S 5       r\R"                  S 5       r\S 5       r\R"                  S 5       r\S 5       r\R"                  S 5       r\S 5       r\S 5       r\r\S 5       rS rSS jr\S 5       rSrg)r   G   zt
Process objects represent activity that is run in a separate process

The class is analogous to `threading.Thread`
c                     [         er   )NotImplementedErrorselfs    r   _PopenBaseProcess._PopenM   s    !!r   Nr
   )daemonc                B   Ub   S5       e[        [        5      n[        R                  U4-   U l        [        R                  R                  5       U l        [        R                  " 5       U l        [        R                  U l
        S U l        SU l        X l        [        U5      U l        [!        U5      U l        U=(       d;    [%        U 5      R&                  S-   SR)                  S U R                   5       5      -   U l        Ub  X`l        [.        R1                  U 5        g )Nz#group argument must be None for nowF-:c              3   8   #    U  H  n[        U5      v   M     g 7fr   )str).0is     r   	<genexpr>'BaseProcess.__init__.<locals>.<genexpr>^   s     =nc!ffns   )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targetr4   argskwargsr"   counts           r   __init__BaseProcess.__init__P   s    }CCC}%&)33uh>'//44699;,114[
F| >T$Z0036XX=dnn==>
 Kdr   c                 <    U R                   (       a  [        S5      eg )Nzprocess object is closed)r6   
ValueErrorr   s    r   _check_closedBaseProcess._check_closedc   s    <<788 r   c                 t    U R                   (       a'  U R                   " U R                  0 U R                  D6  gg)zA
Method to be run in sub-process; can be overridden in sub-class
N)r7   r9   r;   r   s    r   runBaseProcess.rung   s)     <<LL$**55 r   c                    U R                  5         U R                  b   S5       eU R                  [        R                  " 5       :X  d   S5       e[
        R                  R                  S5      (       a   S5       e[        5         U R                  U 5      U l        U R                  R                  U l        U ?U ?U ?[        R!                  U 5        g)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)rK   r   r3   r1   r2   r	   r/   getr   r    sentinel	_sentinelr7   r9   r;   r   rA   r   s    r   startBaseProcess.startn   s     	{{"B$BB"299;. 	LK	L.#++//99 	ED	E9
kk$'-- L$*dldr   c                 X    U R                  5         U R                  R                  5         g)zD
Terminate process; sends SIGTERM signal or uses TerminateProcess()
N)rK   r   	terminater   s    r   rW   BaseProcess.terminate   s      	r   c                 X    U R                  5         U R                  R                  5         g)zD
Terminate process; sends SIGKILL signal or uses TerminateProcess()
N)rK   r   killr   s    r   rZ   BaseProcess.kill   s      	r   c                    U R                  5         U R                  [        R                  " 5       :X  d   S5       eU R                  c   S5       eU R                  R                  U5      nUb  [        R                  U 5        gg)z%
Wait until child process terminates
zcan only join a child processNzcan only join a started process)rK   r3   r1   r2   r   waitr   r   )r   timeoutress      r   r>   BaseProcess.join   sr     	299;.O0OO.{{&I(II&kkw'?d# r   c                    U R                  5         U [        L a  gU R                  [        R                  " 5       :X  d   S5       eU R
                  c  gU R
                  R                  5       nUc  g[        R                  U 5        g)z!
Return whether process is alive
Tzcan only test a child processF)	rK   r	   r3   r1   r2   r   r   r   r   )r   
returncodes     r   is_aliveBaseProcess.is_alive   su     	##299;.O0OO.;;[[%%'
d#r   c                     U R                   b^  U R                   R                  5       c  [        S5      eU R                   R                  5         SU l         U ?[
        R                  U 5        SU l        g)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   rJ   closerS   r   r   r6   r   s    r   rf   BaseProcess.close   sg     ;;"{{!)  "P Q QKKDKd#r   c                     U R                   $ r   )r?   r   s    r   r4   BaseProcess.name   s    zzr   c                 H    [        U[        5      (       d   S5       eXl        g )Nzname must be a string)
isinstancer'   r?   )r   r4   s     r   r4   ri      s     $$$=&==$
r   c                 :    U R                   R                  SS5      $ )z$
Return whether process is a daemon
r"   F)r/   rQ   r   s    r   r"   BaseProcess.daemon   s    
 ||%00r   c                 H    U R                   b   S5       eXR                  S'   g)z!
Set whether process is a daemon
Nzprocess has already startedr"   )r   r/   )r   daemonics     r   r"   rm      s&    
 {{"A$AA"!)Xr   c                      U R                   S   $ )Nauthkey)r/   r   s    r   rq   BaseProcess.authkey   s    ||I&&r   c                 4    [        U5      U R                  S'   g)z"
Set authorization key of process
rq   N)AuthenticationStringr/   )r   rq   s     r   rq   rr      s    
 #7w"?Yr   c                     U R                  5         U R                  c  U R                  $ U R                  R                  5       $ )z=
Return exit code of process or `None` if it has yet to stop
)rK   r   r   r   s    r   exitcodeBaseProcess.exitcode   s7    
 	;;;;{{!!r   c                     U R                  5         U [        L a  [        R                  " 5       $ U R                  =(       a    U R                  R
                  $ )zE
Return identifier (PID) of process or `None` if it has yet to start
)rK   r	   r1   r2   r   pidr   s    r   identBaseProcess.ident   s<    
 	##99;;;24;;??2r   c                 p    U R                  5          U R                  $ ! [         a    [        S5      Sef = f)zc
Return a file descriptor (Unix) or handle (Windows) suitable for
waiting for process termination.
zprocess not startedN)rK   rS   AttributeErrorrJ   r   s    r   rR   BaseProcess.sentinel   s<     		>>>! 	>23=	>s    5c                    S nU [         L a  SnOlU R                  (       a  SnOXU R                  [        R                  " 5       :w  a  SnO2U R
                  c  SnO"U R
                  R                  5       nUb  SnOSn[        U 5      R                  SU R                  -  /nU R
                  b(  UR                  SU R
                  R                  -  5        UR                  SU R                  -  5        UR                  U5        Ub)  [        R                  X5      nUR                  S	U-  5        U R                  (       a  UR                  S
5        SSR                  U5      -  $ )Nstartedclosedunknowninitialstoppedzname=%rzpid=%sz	parent=%szexitcode=%sr"   z<%s> )r	   r6   r3   r1   r2   r   r   r<   r=   r?   appendry   _exitcode_to_namerQ   r"   r>   )r   rv   statusinfos       r   __repr__BaseProcess.__repr__  s   ##F\\F,F[[ F{{'')H#""T
##Y%;<;;"KK4;;??23K$"2"223F(,,X@HKK01;;KK!&&r   c                    SSK JnJn   U R                  b  UR	                  U R                  5        [
        R                  " S5      q[        5       q	UR                  5         [        nU q[        U R                  U R                  U5      q[         R"                  (       a#  [         R$                  " 5       R'                  5          U R)                  5         AUR+                  S5        U R-                  5         Sn[         RD                  " 5         UR+                  SU-  5        URG                  5         U$ ! Af = f! [.         a  nUR0                  c  Sn S nAN_[3        UR0                  [4        5      (       a  UR0                  n S nAN[6        R8                  R;                  [=        UR0                  5      S-   5        Sn S nANS nAf  SnSS Kn[6        R8                  R;                  SU R@                  -  5        URC                  5          GN= f! [         RD                  " 5         UR+                  SW-  5        URG                  5         f = f)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	itertoolsrF   r-   setr   _close_stdinr	   _ParentProcessr5   r3   r   	threading_HAVE_THREAD_NATIVE_IDmain_thread_set_native_id_after_forkr   rN   
SystemExitcoderk   intsysstderrwriter'   	tracebackr4   	print_exc	_shutdown_flush_std_streams)r   parent_sentinelr   r   old_processrv   er   s           r   
_bootstrapBaseProcess._bootstrap"  s   #%	&!!-++D,>,>?(q1I*K#,!!4#3#3_FO//%%'668   "  II89HHJH !II88CD##%-    	vv~AFFC((66

  QVVt!34	"HJJ_tyy89!!II88CD##%s[   B9D9 D3 $D9 3D66D9 9
HGH +GH 7G>H AH
H ;Ic                  d    SSK Jn   U R                  R                  5         U R	                  5         g )Nr   r   )r   r   _finalizer_registryclear_run_after_forkersr   s    r   r   BaseProcess._after_forkO  s#      &&(!r   )r9   r6   r/   r.   r;   r?   r5   r3   r   rS   r7   r"   r   )r=   
__module____qualname____firstlineno____doc__r    rG   rK   rN   rT   rW   rZ   r>   rc   rf   propertyr4   setterr"   rq   rv   rz   ry   rR   r   r   staticmethodr   __static_attributes__r
   r   r   r   r   G   s4   
" "$T2 &96$ 	$&"   
[[  1 1 ]]* * ' ' ^^@ @ " " 3 3 C	> 	>'>+Z " "r   r   c                       \ rS rSrS rSrg)rt   iZ  c                 X    SSK Jn  U" 5       c  [        S5      e[        [	        U 5      44$ )Nr   )get_spawning_popenzJPickling an AuthenticationString object is disallowed for security reasons)r   r   	TypeErrorrt   bytes)r   r   s     r   
__reduce__AuthenticationString.__reduce__[  s3    /'2  $eDk^33r   r
   N)r=   r   r   r   r   r   r
   r   r   rt   rt   Z  s    4r   rt   c                   >    \ rS rSrS rS r\S 5       rSS jr\r	Sr
g)	r   ii  c                 n    SU l         Xl        X l        S U l        S U l        SU l        X0l        0 U l        g )Nr
   F)r.   r?   _pidr3   r   r6   rS   r/   )r   r4   ry   rR   s       r   rG   _ParentProcess.__init__k  s5    
	!r   c                 <    SSK Jn  U" U R                  /SS9(       + $ )Nr   r]   r^   multiprocessing.connectionr]   rS   )r   r]   s     r   rc   _ParentProcess.is_aliveu  s    3(!444r   c                     U R                   $ r   )r   r   s    r   rz   _ParentProcess.identy  s    yyr   Nc                 4    SSK Jn  U" U R                  /US9  g)z&
Wait until parent process terminates
r   r   r   Nr   )r   r^   r]   s      r   r>   _ParentProcess.join}  s     	4dnnw/r   )r6   r/   r.   r?   r3   r   r   rS   r   )r=   r   r   r   rG   rc   r   rz   r>   ry   r   r
   r   r   r   r   i  s,    5  0 Cr   r   c                        \ rS rSrS rS rSrg)_MainProcessi  c                     SU l         SU l        S U l        S U l        SU l        [        [        R                  " S5      5      SS.U l        g )Nr
   MainProcessF    z/mp)rq   	semprefix)	r.   r?   r3   r   r6   rt   r1   urandomr/   r   s    r   rG   _MainProcess.__init__  sB    "
#7

2#G%*,r   c                     g r   r
   r   s    r   rf   _MainProcess.close  s    r   )r6   r/   r.   r?   r3   r   N)r=   r   r   r   rG   rf   r   r
   r   r   r   r     s    ,$r   r   r      SIG_r$   )$__all__r1   r   signalr   r   _weakrefsetr   pathabspathgetcwdORIGINAL_DIROSErrorr   r   r   r   objectr   r   rt   r   r   r   r	   rF   r-   r   r   r   r   __dict__itemsr4   signumr@   r
   r   r   <module>r      s"   
 
    77??299;/L!L"& L"f45 4[ B; 0 > ??1% E	  ..01LD&BQx3d?'(Z6'" 2 	& I	m  Ls   *C7 7DD