
    Rhf/                     b   d dl Z d dlZd dlZd dl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
 ddl	mZ ddlmZ ddl	mZ ddl	mZ ddl	mZ g d	Zd
Z ej&                  d      Z G d de      ZddZd Zd Zd Z e       Zej8                  Zej:                  Zej<                  Zej>                  Zy)    N   )
connection)process)	reduction)resource_tracker)spawn)util)ensure_runningget_inherited_fdsconnect_to_new_processset_forkserver_preload   qc                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	
ForkServerc                 ~    d | _         d | _        d | _        d | _        t	        j
                         | _        dg| _        y )N__main__)_forkserver_address_forkserver_alive_fd_forkserver_pid_inherited_fds	threadingLock_lock_preload_modulesselfs    1/usr/lib/python3.12/multiprocessing/forkserver.py__init__zForkServer.__init__"   s:    #' $(!#"^^%
!+    c                 f    | j                   5  | j                          d d d        y # 1 sw Y   y xY wN)r   _stop_unlockedr   s    r   _stopzForkServer._stop*   s*    ZZ 	"!	" 	" 	"s   '0c                 B   | j                   y t        j                  | j                         d | _        t        j                  | j                   d       d | _         t        j                  | j                        st        j                  | j                         d | _        y )Nr   )	r   oscloser   waitpidr	   is_abstract_socket_namespacer   unlinkr   s    r   r#   zForkServer._stop_unlocked/   sw    ' 	**+$(!


4''+#001I1IJIId../#' r    c                 L    t        d |D              st        d      || _        y)z>Set list of module names to try to load in forkserver process.c              3   >   K   | ]  }t        |      t        u   y wr"   )typestr).0mods     r   	<genexpr>z4ForkServer.set_forkserver_preload.<locals>.<genexpr>@   s     =49#=s   z&module_names must be a list of stringsN)all	TypeErrorr   )r   modules_namess     r   r   z!ForkServer.set_forkserver_preload>   s$    =}==DEE -r    c                     | j                   S )zReturn 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   zForkServer.get_inherited_fdsD   s     """r    c                    | j                          t        |      dz   t        k\  rt        d      t	        j                  t        j
                        5 }|j                  | j                         t        j                         \  }}t        j                         \  }}||| j                  t        j                         g}||z  }	 t        j                  ||       ||ft        j                  |       t        j                  |       cddd       S #  t        j                  |       t        j                  |        xY w# t        j                  |       t        j                  |       w xY w# 1 sw Y   yxY w)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   z!ForkServer.connect_to_new_processL   s$    	s8a<>)^,,]]6>>* 	"fNN4334 "	Hg "	GXw(A(A&,,.0FcMF	"!!&&1) !!!	" 	"""!!!	" 	"s1   A1E2D*E2-E  E,E//E22E;c                 4   | j                   5  t        j                          | j                  qt	        j
                  | j                  t        j                        \  }}|s
	 ddd       yt	        j                  | j                         d| _	        d| _        d| _        d}| j                  rBddh}t        j                  d      }|j                         D ci c]  \  }}||v s|| }}}ni }t        j                  t        j                        5 }t!        j"                  d      }	|j%                  |	       t'        j(                  |	      st	        j*                  |	d       |j-                          t	        j.                         \  }
}	 |j1                         |
g}||j1                         |
| j                  |fz  }t        j2                         }|gt'        j4                         z   }|d|gz  }t'        j6                  |||      }	 t	        j                  |
       |	| _	        || _        || _        ddd       ddd       yc c}}w #  t	        j                  |        xY w# t	        j                  |
       w xY w# 1 sw Y   MxY w# 1 sw Y   yxY w)	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)	main_pathsys_pathignorer<   i  z-c)r   r   r
   r   r&   r(   WNOHANGr'   r   r   r   r   get_preparation_dataitemsr;   r<   r   arbitrary_addressbindr	   r)   chmodlistenr>   filenoget_executable_args_from_interpreter_flagsspawnv_passfds)r   pidstatuscmddesired_keysdataxylisteneraddressalive_ralive_wfds_to_passexeargss                  r   r
   zForkServer.ensure_runningi   s:    ZZ 1	+++-##/ jj)=)=rzzJV1	+ 1	+ 223+/(,0)'+$,C $$ +Z811(;)-KAl9J1KKv~~. +($66yAg&88AHHWe,! $&779 &#+??#4g">KHOO-w8M8M " "C..0C54#D#D#FFDT3K'D--c4EC
 HHW%+2(,3)'*$3+11	+ 1	+( L,HHW%HHW%-+ +11	+ 1	+si   AJ+A.JI&I+)JA9JA=I*J6JJI%%I((I??JJ	JJN)
__name__
__module____qualname__r   r$   r#   r   r   r   r
    r    r   r   r       s%    -"
(.#":8+r    r   c           
      
   |r\d|v rE|Cdt        j                         _        	 t        j                  |       t        j                         `|D ]  }	 t        |        t        j                          t        j                         \  }}t        j                  |d       t        j                  |d       d }t        j                  |t        j                  t        j                  i}	|	j!                         D 
ci c]  \  }
}|
t        j                  |
|       }}
}t        j"                  |       i }t%        j$                  t$        j&                  |       5 }t)        j*                         5 }|j-                         t.        _        |j3                  |t(        j4                         |j3                  |t(        j4                         |j3                  |t(        j4                         	 	 	 |j7                         D cg c]  \  }}|j8                   }}}|rn0||v r&t        j:                  |d      dk(  sJ d	       t<        ||v rt        j:                  |d
       	 	 t        j>                  dt        j@                        \  }}|dk(  rne|jE                  |d      }|8t        jF                  |      }	 tI        ||       t        jL                  |       ntO        jP                  d|z         ||v rK|jS                         d   5 }tU        jV                  |tX        dz         }t[        |      tX        kD  r#t]        dj_                  t[        |                  |^}}}|jM                          t        j`                         }|dk(  rld}	 |jM                          |jM                          ||||g}|jc                  |je                                tg        ||||      }t        jt                  |       nC	 tI        ||       |||<   t        jL                  |       |D ]  }t        jL                  |        ddd       \# t        j                         `w xY w# t        $ r Y w xY wc c}}
w c c}}w # tB        $ r Y w xY w# tJ        $ r Y w xY w# th        $ rF tk        jl                  tk        jn                           tj        jp                  js                          Y w xY w# t        jt                  |       w xY w# tJ        $ r Y w xY w# 1 sw Y   xY w# tv        $ r)}|jx                  tx        jz                  k7  r Y d}~d}~ww xY w# 1 sw Y   nxY wddd       y# 1 sw Y   yxY w)zRun forkserver.r   NTFc                       y r"   rh   )_unuseds    r   sigchld_handlerzmain.<locals>.sigchld_handler   s    r    )rS   r   r    zNot at EOF?i   r   z.forkserver: waitpid returned unexpected pid %dzToo many ({0:n}) fds to send)>r   current_process_inheritingr   import_main_path
__import__ImportErrorr	   _close_stdinr&   r>   set_blockingsignalSIGCHLDSIGINTSIG_IGNrN   set_wakeup_fdr;   r<   	selectorsDefaultSelectorgetsockname_forkserverr   register
EVENT_READselectfileobjread
SystemExitr(   rL   ChildProcessErrorpopwaitstatus_to_exitcodewrite_signedBrokenPipeErrorr'   warningswarnacceptr   recvfdsr9   r8   RuntimeErrorformatforkextendvalues
_serve_one	Exceptionsys
excepthookexc_infostderrflush_exitOSErrorerrnoECONNABORTED)listener_fdr`   preloadrI   rJ   modnamesig_rsig_wrl   handlerssigvalold_handlers	pid_to_fdr^   selectorkeyeventsrfdsrW   stsrD   
returncodesrA   rE   code
unused_fdsfdes                                 r   mainr      s    Y%:48G##%1:&&y1++-9 	G7#	 	779LE5OOE5!OOE5! 	v~~	
H '/nn&68"c sC00 8L 8  I	v~~k	: Yh		"	"	$Y(0*2*>*>*@'(I$8$89'9#7#78%!5!56P=E__=NOMS&CKKOD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u-M
 * 1 1)2B2B2D E'1'32<2>(@ !#% ,Wc : .5IcNHHW-&) - "-G$-S Q ++-9  &8( P   1 "!" $3 % $%@ $- 3 # ? #

 0 0 23 !#
 $3 % $%=$- $-L  77e000 1oY Y Y Y Ys7  Q Q!<!Q1U/1A;U-T%Q7
AT%$'Q=/T%;RAT%BTAR%T<T	6T>T%UQ!	Q.-Q.7T%=	R
T%	R

T%	RT%RT%AS,	(S/+S,	,S//T	T		T	TT	TT"T%%	U.UUUUU#	U//U8c                 n   t        j                  d       |j                         D ]  \  }}t        j                   ||        |D ]  }t        j                  |        |^t
        _        t        j                  _	        t
        _
        t        j                  |       }t        j                  | |      }|S )Nrm   )ru   ry   rN   r&   r'   r}   r   r   _resource_tracker_fdr   dupr   _main)	rE   rA   r   r   r   r   r   parent_sentinelr   s	            r   r   r   +  s    
NN$  Sc3  

 %("[%''+  ffWoO;;w0DKr    c                     d}t         j                  }t        |      |k  rCt        j                  | |t        |      z
        }|st        d      ||z  }t        |      |k  rCt         j                  |      d   S )Nr    zunexpected EOFr   )SIGNED_STRUCTsizer8   r&   r   EOFErrorunpack)r   r[   lengthr   s       r   read_signedr   B  su    DF
d)f
GGBT*++,,		 d)f

 %a((r    c                     t         j                  |      }|r/t        j                  | |      }|dk(  rt	        d      ||d  }|r.y y )Nr   zshould not get here)r   packr&   writer   )r   nmsgnbytess       r   r   r   L  sH    


Q
C
"c"Q;455&'l	 r    )NN) r   r&   rz   ru   r;   structr   r   r    r   r   contextr   r   r   r	   __all__r9   Structr   objectr   r   r   r   r   r}   r
   r   r   r   rh   r    r   <module>r      s     	     
        % c"A+ A+NAH.) l++11 $;; $;; r    