o
    Zœcš   ã                   @   s  d dl mZm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 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dd„ Zeƒ Zej Z ej!Z!ej"Z"ej#Z#dS )é    )Úabsolute_importÚprint_functionNé   )Ú
connection)Úprocess)Ú	reduction)Úsemaphore_tracker)Úspawn)Úutil)Úspawnv_passfds)Úensure_runningÚget_inherited_fdsÚconnect_to_new_processÚset_forkserver_preloadé   ÚQc                   @   s4   e Z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 | _t ¡ | _dg| _d S )NÚ__main__)Ú_forkserver_addressÚ_forkserver_alive_fdÚ_inherited_fdsÚ	threadingÚLockÚ_lockÚ_preload_modules©Úself© r   úI/var/www/chikooza/env/lib/python3.10/site-packages/billiard/forkserver.pyÚ__init__&   s
   
zForkServer.__init__c                 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 ©N)Ú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 )z”Return 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   3   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   ÚosÚpiper   r   Úgetfdr   ÚsendfdsÚclose)r   ÚfdsÚclientÚparent_rÚchild_wÚchild_rÚparent_wÚallfdsr   r   r   r   ;   s0   ÿ


ð



ðz!ForkServer.connect_to_new_processc           
         sˆ  | j · t ¡  | jdur	 W d  ƒ dS d}| jr0ddh‰ t d¡}‡ fdd„| ¡ D ƒ}ni }t tj	¡j}t
 d¡}| |¡ t |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 )zíMake 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.
        Nz<from billiard.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>j   s
    ÿÿz-ForkServer.ensure_running.<locals>.<dictcomp>r.   i€  z-c)r   r   r   r   r   r	   Úget_preparation_dataÚitemsr-   r.   r   Úarbitrary_addressÚbindr0   ÚchmodÚlistenr1   ÚfilenoÚget_executabler
   Ú_args_from_interpreter_flagsr   r4   r   )
r   ÚcmdÚdataÚlistenerÚaddressÚalive_rÚalive_wÚfds_to_passÚexeÚargsr   rA   r   r   X   sN   
ý

ÿ

ÿ
ýéï"ïzForkServer.ensure_runningN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r   r   r   $   s    r   c                 C   sJ  |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jdurRztj 	¡  t
tjƒt_W n ttfyQ   Y nw t tjtj¡}tjtj| d¸}t ¡ ¢}| ¡ t_| |tj¡ | |tj¡ 	 zq	 dd„ | ¡ D ƒ}	|	rŠnq~||	v r›t |d¡dks™J ‚t‚||	v s¡J ‚| ¡ d	 =}
d}t ¡ d	krÝz&z	t |
|||ƒ W n t!yÏ   tj"t #¡ Ž  tj$ %¡  Y nw W t &|¡ nt &|¡ w 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 )
zRun forkserver.r   NT)rJ   c                 S   s   g | ]\}}|j ‘qS r   )Úfileobj)r#   ÚkeyÚeventsr   r   r   Ú
<listcomp>°   s    zmain.<locals>.<listcomp>r   ó    r   ))r   Úcurrent_processÚ_inheritingr	   Úimport_main_pathÚ
__import__ÚImportErrorÚsysÚstdinr4   Úopenr0   ÚdevnullÚOSErrorr,   ÚsignalÚSIGCHLDÚSIG_IGNr-   r.   Ú	selectorsÚDefaultSelectorÚgetsocknameÚ_forkserverr   ÚregisterÚ
EVENT_READÚselectÚreadÚ
SystemExitÚacceptÚforkÚ
_serve_oneÚ	ExceptionÚ
excepthookÚexc_infoÚstderrÚflushÚ_exitÚerrnoÚECONNABORTED)Úlistener_fdrQ   Úpreloadr<   r=   ÚmodnameÚhandlerrO   ÚselectorÚrfdsÚsÚcodeÚer   r   r   ÚmainŽ   sx   
ÿ

ÿÿ
ýþ€€÷€
ÿ€ÿé8úrˆ   c                 G   s   | ||||fS r    r   )r9   r8   ÚaliveÚstfdÚ	inheritedr   r   r   Ú__unpack_fdsÉ   s   rŒ   c           
      C   s¦   |  ¡  t  |¡ t tj|¡ t | td ¡}|   ¡  t|ƒtks$J ‚t|Ž \}}t	_
}t	_|tj_t|t ¡ ƒ dtjv rGdd l}| ¡  t |¡}	t||	ƒ d S )Nr   Úrandomr   )r4   r0   rh   ri   r   Úrecvfdsr+   r*   rŒ   rn   r   r   r   Ú_semaphore_trackerÚ_fdÚwrite_unsignedÚgetpidrc   Úmodulesr   Úseedr	   Ú_main)
r…   rO   rQ   r‚   r5   r9   r8   rŠ   r   r†   r   r   r   rv   Í   s    

ÿ

rv   c                 C   sX   d}t j}t|ƒ|k r%t | |t|ƒ ¡}|stdƒ‚||7 }t|ƒ|k st  |¡d S )Nr]   zunexpected EOFr   )ÚUNSIGNED_STRUCTÚsizer*   r0   rr   ÚEOFErrorÚunpack)ÚfdrN   Úlengthr…   r   r   r   Úread_unsignedï   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–   Úpackr0   ÚwriteÚRuntimeError)rš   ÚnÚmsgÚnbytesr   r   r   r‘   ú   s   
ür‘   )NN)$Ú
__future__r   r   r}   r0   rk   rh   r-   Ústructrc   r   Ú r   r   r   r   r	   r
   Úcompatr   Ú__all__r+   ÚStructr–   Úobjectr   rˆ   rŒ   rv   rœ   r‘   rn   r   r   r   r   r   r   r   r   Ú<module>   s<    

j;"
