o
    ¡D®fZ   ã                   @   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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ƒ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 )é    Né   )Ú
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   úL/home/ubuntu/webapp/venv/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   1   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   9   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>h   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Úbindr.   ÚchmodÚlistenr/   ÚfilenoÚget_executabler   Ú_args_from_interpreter_flagsr	   r2   r   )
r   ÚcmdÚdataÚlistenerÚaddressÚalive_rÚalive_wÚfds_to_passÚexeÚargsr   r?   r   r
   V   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)rH   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Ústdinr2   Úopenr.   Ú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_fdrO   Úpreloadr:   r;   ÚmodnameÚhandlerrM   ÚselectorÚrfdsÚsÚcodeÚer   r   r   ÚmainŒ   sx   
ÿ

ÿÿ
ýþ€€÷€
ÿ€ÿé8úr†   c                 G   s   | ||||fS r   r   )r7   r6   Ú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   )r2   r.   rf   rg   r   Úrecvfdsr)   r(   rŠ   rl   r   r   r   Ú_semaphore_trackerÚ_fdÚwrite_unsignedÚgetpidra   Úmodulesr‹   Úseedr   Ú_main)
rƒ   rM   rO   r€   r3   r7   r6   rˆ   r‹   r„   r   r   r   rt   Ë   s    

ÿ

rt   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(   r.   rp   ÚEOFErrorÚunpack)ÚfdrL   Ú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”   Úpackr.   ÚwriteÚRuntimeError)r˜   ÚnÚmsgÚnbytesr   r   r   r   ø   s   
ür   )NN) r{   r.   ri   rf   r+   Ústructra   r   Ú r   r   r   r   r   r   Úcompatr	   Ú__all__r)   ÚStructr”   r   r†   rŠ   rt   rš   r   rl   r
   r   r   r   r   r   r   r   Ú<module>   s:    

j;"
