
    ѝi*2                     t   S SK r S SKrS SKrS SKrS SK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  SSK
Jr  SSKJr  SSK
Jr  SSK
Jr  SSK
Jr  / S	QrS
r\R(                  " S5      r " S S\5      rSSS.S jjrS rS rS r\" 5       r\R:                  r\R<                  r\R>                  r\R@                  r g)    N   )
connection)process)	reduction)resource_tracker)spawn)util)ensure_runningget_inherited_fdsconnect_to_new_processset_forkserver_preload   qc                   >    \ rS rSrS rS rS rS rS rS r	S r
S	rg
)
ForkServer!   c                     S U l         S U l        S U l        S U l        [        R
                  " 5       U l        S/U l        g )N__main__)_forkserver_address_forkserver_alive_fd_forkserver_pid_inherited_fds	threadingLock_lock_preload_modulesselfs    ,lib/python3.13/multiprocessing/forkserver.py__init__ForkServer.__init__#   s:    #' $(!#"^^%
!+    c                 p    U R                      U R                  5         S S S 5        g ! , (       d  f       g = fN)r   _stop_unlockedr   s    r   _stopForkServer._stop+   s    ZZ! ZZs   '
5c                 V   U R                   c  g [        R                  " U R                  5        S U l        [        R                  " U R                   S5        S U l         [
        R                  " U R                  5      (       d   [        R                  " U R                  5        S U l        g )Nr   )	r   oscloser   waitpidr	   is_abstract_socket_namespacer   unlinkr   s    r   r%   ForkServer._stop_unlocked0   sz    ' 	**+$(!


4''+#001I1IJJIId../#' r"   c                 T    [        S U 5       5      (       d  [        S5      eXl        g)z>Set list of module names to try to load in forkserver process.c              3   D   #    U  H  n[        U5      [        L v   M     g 7fr$   )typestr).0mods     r   	<genexpr>4ForkServer.set_forkserver_preload.<locals>.<genexpr>A   s     =}49#}s    z&module_names must be a list of stringsN)all	TypeErrorr   )r   modules_namess     r   r   !ForkServer.set_forkserver_preload?   s%    =}===DEE -r"   c                     U R                   $ )z|Return list of fds inherited from parent process.

This returns None if the current process was not started by fork
server.
)r   r   s    r   r   ForkServer.get_inherited_fdsE   s     """r"   c                    U R                  5         [        U5      S-   [        :  a  [        S5      e[        R                  " [        R
                  5       nUR                  U R                  5        [        R                  " 5       u  p4[        R                  " 5       u  pVXTU R                  [        R                  " 5       /nXq-  n [        R                  " X'5        X64[        R                  " U5        [        R                  " U5        sSSS5        $ !   [        R                  " U5        [        R                  " U5        e = f! [        R                  " U5        [        R                  " U5        f = f! , (       d  f       g= f)a  Request forkserver to create a child process.

Returns a pair of fds (status_r, data_w).  The calling process can read
the child process's pid and (eventually) its returncode from status_r.
The calling process should write to data_w the pickled preparation and
process data.
   ztoo many fdsN)r
   lenMAXFDS_TO_SEND
ValueErrorsocketAF_UNIXconnectr   r)   piper   r   getfdr   sendfdsr*   )r   fdsclientparent_rchild_wchild_rparent_wallfdss           r   r   !ForkServer.connect_to_new_processM   s    	s8a<>)^,,]]6>>*fNN4334 "	H "	G(A(A&,,.0FMF	"!!&1) !!! +*""!!! +*s1   A0E8D,E8/EE.E55E88
Fc                 d   U R                      [        R                  " 5         U R                  bw  [        R
                  " U R                  [        R                  5      u  pU(       d
   SSS5        g[        R                  " U R                  5        SU l	        SU l        SU l        Sn0 nU R                  (       a@  [        R                  " S5      nSU;   a  US   US'   SU;   a  US   US'   SU;   a  US   US'   [        R                  " [        R                  5       n[        R                   " S5      nUR#                  U5        [$        R&                  " U5      (       d  [        R(                  " US	5        UR+                  5         [        R,                  " 5       u  p UR/                  5       U/n
X6R/                  5       XR                  U4-  n[        R0                  " 5       nU/[$        R2                  " 5       -   nUS
U/-  n[$        R4                  " XU
5      n [        R                  " U5        Xpl	        Xl        Xl        SSS5        SSS5        g!   [        R                  " U	5        e = f! [        R                  " U5        f = f! , (       d  f       NN= f! , (       d  f       g= f)zMake sure that a fork server is running.

This can be called from any process.  Note that usually a child
process will just reuse the forkserver started by its parent, so
ensure_running() will do nothing.
NzCfrom multiprocessing.forkserver import main; main(%d, %d, %r, **%r)ignoresys_pathinit_main_from_path	main_pathsys_argvrC   i  z-c)r   r   r
   r   r)   r+   WNOHANGr*   r   r   r   r   get_preparation_datarB   rC   r   arbitrary_addressbindr	   r,   chmodlistenrE   filenoget_executable_args_from_interpreter_flagsspawnv_passfds)r   pidstatuscmdmain_kwsdatalisteneraddressalive_ralive_wfds_to_passexeargss                r   r
   ForkServer.ensure_runningj   s'    ZZ++-##/ jj)=)=rzzJ Z 223+/(,0)'+$,C H$$11(;%+/
+;HZ((D0,01F,GH[)%+/
+;HZ(v~~.($66yAg&88AAHHWe,! $&779 &#+??#4g">KOO-w8M8M$& &C..0C54#D#D#FFDT3K'D--cEC
 HHW%+2(,3)'*$3 /7 ZZHHW%HHW%- /.7 ZsQ   AJ!2B.J! BJ"A=I (JJ!I22I55JJ
J	J!!
J/)r   r   r   r   r   r   N)__name__
__module____qualname____firstlineno__r    r&   r%   r   r   r   r
   __static_attributes__ r"   r   r   r   !   s%    -"
(.#":;+r"   r   )rU   c          
         U(       a  Ub  U[         R                  SS& Ub  U[         R                  SS& SU;   aI  UbF  S[        R                  " 5       l         [        R                  " U5        [        R                  " 5       ?U H  n [        U5        M     [        R                  " 5         [        R                  " 5         [        R                  " 5       u  px[        R                  " US5        [        R                  " US5        S n	[         R"                  U	[         R$                  [         R&                  0n
U
R)                  5        VVs0 s H  u  pU[         R                   " X5      _M     nnn[         R*                  " U5        0 n[,        R,                  " [,        R.                  U S9 n[0        R2                  " 5        nUR5                  5       [6        l        UR;                  U[0        R<                  5        UR;                  U[0        R<                  5        UR;                  U[0        R<                  5           UR?                  5        VVs/ s H  u  nnUR@                  PM     nnnU(       a  OM9  UU;   a(  [        RB                  " US5      S:X  d   S	5       e[D        eUU;   a  [        RB                  " US
5          [        RF                  " S[        RH                  5      u  nnUS:X  a  OjURM                  US5      nUb:  [        RN                  " U5      n [Q        UU5        [        RT                  " U5        O[V        RX                  " SU-  5        M  UU;   Ga  UR[                  5       S    n[\        R^                  " U[`        S-   5      n[c        U5      [`        :  a#  [e        SRg                  [c        U5      5      5      eUtnnnURU                  5         [        Rh                  " 5       nUS:X  a  Sn URU                  5         URU                  5         UUXx/nURk                  URm                  5       5        [n        Rp                  " 5         [n        R:                  " [        Rr                  5        [u        UUUU5      n[n        R                  " 5         [        R                  " U5        OG [Q        UU5        UUU'   [        RT                  " U5        U H  n[        RT                  " U5        M     SSS5        O GM  ! [        R                  " 5       ?f = f! [         a     GM  f = fs  snnf s  snnf ! [J         a     GM  f = f! [R         a     GN6f = f! [v         aH    [         Rx                  " [         Rz                  " 5       6   [         R|                  R                  5          GN,f = f! [n        R                  " 5         [        R                  " U5        f = f! [R         a     GN4f = f! , (       d  f       GN= f! [         a*  nUR                  [        R                  :w  a  e  SnAGN5SnAff = f! , (       d  f       O= fSSS5        g! , (       d  f       g= f)zRun forkserver.Nr   TFc                      g r$   rr   )_unuseds    r   sigchld_handlermain.<locals>.sigchld_handler   s    r"   )r\   r   r"   zNot at EOF?i   r   z.forkserver: waitpid returned unexpected pid %dzToo many ({0:n}) fds to send)Esysargvpathr   current_process_inheritingr   import_main_path
__import__ImportErrorr	   _flush_std_streams_close_stdinr)   rE   set_blockingsignalSIGCHLDSIGINTSIG_IGNitemsset_wakeup_fdrB   rC   	selectorsDefaultSelectorgetsockname_forkserverr   register
EVENT_READselectfileobjread
SystemExitr+   rV   ChildProcessErrorpopwaitstatus_to_exitcodewrite_signedBrokenPipeErrorr*   warningswarnacceptr   recvfdsr@   r?   RuntimeErrorformatforkextendvaluesatexit_clear_exit_function
_serve_one	Exception
excepthookexc_infostderrflush_run_exitfuncs_exitOSErrorerrnoECONNABORTED)listener_fdrg   preloadrT   rR   rU   modnamesig_rsig_wrv   handlerssigvalold_handlers	pid_to_fdre   selectorkeyeventsrfdsr`   stsrK   
returncodesrH   rL   code
unused_fdsfdes                                  r   mainr      s%    "CHHQK"CHHQK Y%:48G##%1:&&y1++-9G7#  	!779LEOOE5!OOE5! 	v~~	
H '/nn&68&6
 s00&6  8  I	v~~k	:h		"	"	$*2*>*>*@'(I$8$89'9#7#78%!5!56S=E__=NO=NMS&CKK=NDO 
 d?777A.#5D}D5$$D=GGE5)"')zz"bjj'AHC !8!"+--T":".)+)B)B3)GJ% ,Wj A HHW- %MM +>@C+D E+ 0 t#!*1-'//>A3EFs8n4". > E E$'H!.#/ / 25.3	 ggi!8#$D/ ( 0 ( 0.5w-M
 * 1 1)2B2B2D E & &0C0C D'1'32<2>(@ !' 5 5 7 "% ,Wc : .5IcNHHW-&) " '*M .- $O Y ++-9  .8( P   1 "!" $3 % $%D $- 3 # ? #

 0 0 23 !' 5 5 7 "
 $3 % $%C .-R  77e000 1s 
%	$ 
;	:	:sD  T 	T'#T9.Y!A;Y XT?
-AX(U/2X"U.AX:BW>BU(,W>:W-:W> XYT$'
T65T6?X
UXUX
U%!X$U%%X(AV:	6V=9V:	:V==-W*	*W>-
W;	7W>:W;	;W>>
XXYX
YX?9Y?YY
Y	Y!!
Y/c                 z   [         R                  " S5        UR                  5        H  u  pE[         R                   " XE5        M     U H  n[        R                  " U5        M     Ut[
        l        [        R                  l	        [
        l
        [        R                  " U 5      n[        R                  " X5      nU$ )Nrx   )r   r   r   r)   r*   r   r   r   _resource_tracker_fdr   dupr   _main)	rL   rH   r   r   r   r   r   parent_sentinelr   s	            r   r   r   ;  s    
NN$c %
 
 %("[%''+  ffWoO;;w0DKr"   c                    Sn[         R                  n[        U5      U:  aI  [        R                  " X[        U5      -
  5      nU(       d  [        S5      eX-  n[        U5      U:  a  MI  [         R                  U5      S   $ )Nr"   zunexpected EOFr   )SIGNED_STRUCTsizer?   r)   r   EOFErrorunpack)r   rd   lengthr   s       r   read_signedr   R  sq    DF
d)f
GGBT*++,,		 d)f

 %a((r"   c                     [         R                  U5      nU(       a5  [        R                  " X5      nUS:X  a  [	        S5      eX#S  nU(       a  M4  g g )Nr   zshould not get here)r   packr)   writer   )r   nmsgnbytess       r   r   r   \  sF    


Q
C
""Q;455'l	 #r"   )NN)!r   r   r)   r   r   rB   structry   r   r    r   r   contextr   r   r   r	   __all__r@   Structr   objectr   r   r   r   r   r   r
   r   r   r   rr   r"   r   <module>r      s      	     
        % c"D+ D+TMM`.) l++11 $;; $;; r"   