o
    JAfn/  ã                   @   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 )Nc                 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 strings)Úallr   Ú	TypeError)r   Zmodules_namesr   r   r   r   >   s   
z!ForkServer.set_forkserver_preloadc                 C   s   	 | j S r   )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 srw   Y  d S )Né   ztoo many fds)r	   ÚlenÚMAXFDS_TO_SENDÚ
ValueErrorÚsocketÚAF_UNIXÚconnectr   r!   Úpiper   r   Zgetfdr   Úsendfdsr"   )r   ÚfdsÚclientÚparent_rÚchild_wÚchild_rÚparent_wZallfdsr   r   r   r   L   s2   ÿ


ð



ðz!ForkServer.connect_to_new_processc                    sÒ  	 | j Û t ¡  | jd ur2t | jtj¡\}}|s#	 W d   ƒ d S t | j¡ d | _	d | _d | _d}| j
rLddh‰ t d¡}‡ fdd„| ¡ D ƒ}ni }t tj¡s}t d¡}| |¡ t |¡sjt |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 sÊw   Y  W d   ƒ d S W d   ƒ d S 1 sâw   Y  d S )
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©Zdesired_keysr   r   Ú
<dictcomp>„   s    z-ForkServer.ensure_running.<locals>.<dictcomp>r2   i€  z-c)r   r   r	   r   r!   r#   ÚWNOHANGr"   r   r   r   r   Zget_preparation_dataÚitemsr1   r2   r   Úarbitrary_addressÚbindr   r$   ÚchmodÚlistenr4   ÚfilenoZget_executableÚ_args_from_interpreter_flagsÚspawnv_passfds)r   ÚpidÚstatusÚcmdÚdataÚlistenerÚaddressÚalive_rZalive_wZfds_to_passZexeÚargsr   rA   r   r	   i   s\   
ù	



ÿ
ýçè"èzForkServer.ensure_runningN)
Ú__name__Ú
__module__Ú__qualname__r   r    r   r   r
   r   r	   r   r   r   r   r       s    r   c                 C   sÎ  	 |r5d|v r!|d ur!dt  ¡ _zt |¡ W t  ¡ `nt  ¡ `w |D ]}zt|ƒ W q# ty4   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k}t ¡ T}| ¡ t_| |tj¡ | |tj¡ | |tj¡ 	 z	 d	d
„ | ¡ D ƒ}|r¢nq–||v r©t‚||v rüt	 |d¡ 	 zt	 dt	j¡\}}W n	 t yÈ   Y n4w |dkrÎn.| !|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rwd}z<z| %¡  | %¡  ||||g}| 0| 1¡ ¡ t2||||
ƒ}W n t3yi   t4j5t4 6¡ Ž  t4j7 8¡  Y nw W t	 9|¡ n,t	 9|¡ w zt#||ƒ W n
 t$yˆ   Y nw |||< t	 %|¡ |D ]}t	 %|¡ q”W d   ƒ n	1 s¨w   Y  W n t:yÉ } z|j;t;j<kr¿‚ W Y d }~nd }~ww q“1 sÏw   Y  W d   ƒ d S 1 sàw   Y  d S )Nr   TFc                  W   s   d S r   r   )Z_unusedr   r   r   Úsigchld_handler¼   s   zmain.<locals>.sigchld_handlerc                 S   s   i | ]\}}|t   ||¡“qS r   )Úsignal)r(   ÚsigÚvalr   r   r   rB   Æ   s    ÿzmain.<locals>.<dictcomp>)rI   c                 S   s   g | ]\}}|j ‘qS r   )Úfileobj)r(   ÚkeyÚeventsr   r   r   Ú
<listcomp>Ú   s    zmain.<locals>.<listcomp>i   éÿÿÿÿr   z.forkserver: waitpid returned unexpected pid %dr   zToo many ({0:n}) fds to send)=r   Úcurrent_processZ_inheritingr   Zimport_main_pathÚ
__import__ÚImportErrorr   Ú_close_stdinr!   r4   Úset_blockingrX   ÚSIGCHLDÚSIGINTÚSIG_IGNrD   Úset_wakeup_fdr1   r2   Ú	selectorsÚDefaultSelectorÚgetsocknameÚ_forkserverr   ÚregisterÚ
EVENT_READÚselectÚ
SystemExitÚreadr#   rC   ÚChildProcessErrorÚpopÚwaitstatus_to_exitcodeÚwrite_signedÚBrokenPipeErrorr"   ÚwarningsÚwarnÚacceptr   Úrecvfdsr/   r.   ÚRuntimeErrorÚformatÚforkÚextendÚvaluesÚ
_serve_oneÚ	ExceptionÚsysÚ
excepthookÚexc_infoÚstderrÚflushÚ_exitÚOSErrorÚerrnoZECONNABORTED)Zlistener_fdrR   Zpreloadr<   r=   ÚmodnameZsig_rZsig_wrW   ÚhandlersZold_handlersZ	pid_to_fdrP   ÚselectorZrfdsrL   Ústsr9   Ú
returncodeÚsr6   r:   ÚcodeÚ
unused_fdsÚfdÚer   r   r   Úmain§   sæ   
ÿüÿ
ÿ
ýÿ
þÿë
ÿÿ

þþ€þ
€Ü€&ÿ€ÿ±8ør”   c           	      C   sh   t  d¡ | ¡ D ]
\}}t   ||¡ q	|D ]}t |¡ q|^t_tj_	t_
t | ¡}t | |¡}|S )Nr_   )rX   rh   rD   r!   r"   rl   r   r   Ú_resource_trackerZ_fdr   Údupr   Z_main)	r:   r6   r‘   r‹   rY   rZ   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 )Nó    zunexpected EOFr   )ÚSIGNED_STRUCTÚsizer.   r!   rq   ÚEOFErrorÚunpack)r’   rO   Ú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   ru   L  s   
üru   )NN) r‰   r!   ri   rX   r1   Ústructr‚   r   rw   Ú r   r   Úcontextr   r   r   r   Ú__all__r/   ÚStructr™   Úobjectr   r”   r€   rž   ru   rl   r	   r
   r   r   r   r   r   r   Ú<module>   s<    
 
 

