o
    p̦in/                     @   s   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dZG dd deZdddZdd Zdd Zdd Ze ZejZejZejZejZdS )    N   )
connection)process)	reduction)resource_tracker)spawn)util)ensure_runningget_inherited_fdsconnect_to_new_processset_forkserver_preload   qc                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )
ForkServerc                 C   s.   d | _ d | _d | _d | _t | _dg| _d S )N__main__)_forkserver_address_forkserver_alive_fd_forkserver_pid_inherited_fds	threadingLock_lock_preload_modulesself r   1/usr/lib/python3.10/multiprocessing/forkserver.py__init__"   s   
zForkServer.__init__c                 C   s4   | j  |   W d    d S 1 sw   Y  d S N)r   _stop_unlockedr   r   r   r   _stop*   s   
"zForkServer._stopc                 C   sV   | j d u rd S t| j d | _t| j d d | _ t| js&t| j d | _d S )Nr   )	r   oscloser   waitpidr   is_abstract_socket_namespacer   unlinkr   r   r   r   r   /   s   

zForkServer._stop_unlockedc                 C   s&   t dd | jD std|| _dS )z>Set list of module names to try to load in forkserver process.c                 s   s    | ]	}t |tu V  qd S r   )typestr).0modr   r   r   	<genexpr>@   s    z4ForkServer.set_forkserver_preload.<locals>.<genexpr>z&module_names must be a list of stringsN)allr   	TypeError)r   modules_namesr   r   r   r   >   s   
z!ForkServer.set_forkserver_preloadc                 C   s   | 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   r   r   r   r
   D   s   zForkServer.get_inherited_fdsc              
   C   s   |    t|d tkrtdttjX}|| j t	 \}}t	 \}}||| j
t g}||7 }z,zt|| ||fW W t| t| W  d   S    t| t|  t| t| w 1 sqw   Y  dS )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allfdsr   r   r   r   L   s0   






z!ForkServer.connect_to_new_processc                    s  | j  t  | jdur1t| jtj\}}|s"	 W d   dS t| j d| _	d| _d| _d}| j
rKddh td} fdd| D }ni }ttjs}td}|| t|sit|d	 |  t \}}z<z+| |g}	|| || j
|f; }t }
|
gt  }|d
|g7 }t|
||	}W n	   t|  W t| nt| w || _	|| _|| _W d   n1 sw   Y  W d   dS W d   dS 1 sw   Y  dS )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ignorec                    s   i | ]\}}| v r||qS r   r   )r(   xydesired_keysr   r   
<dictcomp>   s    z-ForkServer.ensure_running.<locals>.<dictcomp>r3   i  z-c)r   r   r	   r   r!   r#   WNOHANGr"   r   r   r   r   get_preparation_dataitemsr2   r3   r   arbitrary_addressbindr   r$   chmodlistenr5   filenoget_executable_args_from_interpreter_flagsspawnv_passfds)r   pidstatuscmddatalisteneraddressalive_ralive_wfds_to_passexeargsr   rD   r   r	   i   sZ   
	




"zForkServer.ensure_runningN)
__name__
__module____qualname__r   r    r   r   r
   r   r	   r   r   r   r   r       s    r   c                 C   s  |r4d|v r |dur dt  _zt| W t  `nt  `w |D ]}zt| W q" ty3   Y q"w t  t	
 \}}t	|d t	|d dd }tj|tjtji}	dd |	 D }
t| i }tjtj| d	y}t b}| t_||tj ||tj ||tj 	 z(	 d
d | D }|rnq||v rt	|ddksJ dt||v r	t	|d 	 zt	dt	j\}}W n	 t y   Y n5w |dkrn/|!|d}|durt	"|}zt#|| W n	 t$y   Y nw t	%| nt&'d|  q||v r|( d }t)*|t+d }t,|t+kr-t-d.t,||^}}}|%  t	/ }|dkrd}z<z|%  |%  ||||g}|0|1  t2||||
}W n t3yv   t4j5t46   t4j78  Y nw W t	9| n,t	9| w zt#|| W n
 t$y   Y nw |||< t	%| |D ]}t	%| qW d   n	1 sw   Y  W n t:y } z|j;t;j<kr̂ W Y d}~nd}~ww q1 sw   Y  W d   dS 1 sw   Y  dS )zRun forkserver.r   NTFc                  W   s   d S r   r   )_unusedr   r   r   sigchld_handler   s   zmain.<locals>.sigchld_handlerc                 S   s   i | ]\}}|t  ||qS r   )signal)r(   sigvalr   r   r   rF      s    zmain.<locals>.<dictcomp>)rN   c                 S   s   g | ]\}}|j qS r   )fileobj)r(   keyeventsr   r   r   
<listcomp>   s    zmain.<locals>.<listcomp>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!   r5   set_blockingrb   SIGCHLDSIGINTSIG_IGNrI   set_wakeup_fdr2   r3   	selectorsDefaultSelectorgetsockname_forkserverr   register
EVENT_READselectread
SystemExitr#   rG   ChildProcessErrorpopwaitstatus_to_exitcodewrite_signedBrokenPipeErrorr"   warningswarnacceptr   recvfdsr0   r/   RuntimeErrorformatforkextendvalues
_serve_one	Exceptionsys
excepthookexc_infostderrflush_exitOSErrorerrnoECONNABORTED)listener_fdrX   preloadr?   r@   modnamesig_rsig_wra   handlersold_handlers	pid_to_fdrV   selectorrfdsrR   stsr;   
returncodesr8   r<   code
unused_fdsfder   r   r   main   s   









&8r   c           	      C   sh   t d | D ]
\}}t  || q	|D ]}t| q|^t_tj_	t_
t| }t| |}|S )Nrj   )rb   ru   rI   r!   r"   ry   r   r   _resource_tracker_fdr   dupr   _main)	r<   r8   r   r   rc   rd   r   parent_sentinelr   r   r   r   r   +  s   

r   c                 C   sX   d}t j}t||k r%t| |t| }|std||7 }t||k st |d S )Nri   zunexpected EOFr   )SIGNED_STRUCTsizer/   r!   r}   EOFErrorunpack)r   rU   lengthr   r   r   r   read_signedB  s   r   c                 C   sB   t |}|rt| |}|dkrtd||d  }|sd S d S )Nr   zshould not get here)r   packr!   writer   )r   nmsgnbytesr   r   r   r   L  s   
r   )NN) r   r!   rv   rb   r2   structr   r   r    r   r   contextr   r   r   r   __all__r0   Structr   objectr   r   r   r   r   ry   r	   r
   r   r   r   r   r   r   <module>   s<    
 
 

