a
    Šxdš   ã                   @   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   úK/var/www/html/Ranjet/env/lib/python3.9/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>/   ó    z4ForkServer.set_forkserver_preload.<locals>.<genexpr>z&module_names must be a list of stringsN)Úallr   Ú	TypeError)r   Z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¡Ü}| | j¡ t 	¡ \}}t 	¡ \}}||| j
t ¡ g}||7 }zvz:t ||¡ ||fW W t |¡ t |¡ W  d  ƒ S    t |¡ t |¡ ‚ Y n0 W t |¡ t |¡ nt |¡ t |¡ 0 W d  ƒ n1 s0    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   Zgetfdr   ZsendfdsÚclose)r   ÚfdsÚclientZparent_rÚchild_wÚchild_rZparent_wZallfdsr   r   r   r   ;   s2    ÿ


ù



ÿ
z!ForkServer.connect_to_new_processc           
         s€  | j b t ¡  | jdur,W d  ƒ dS d}| jr`ddh‰ t d¡}‡ fdd„| ¡ D ƒ}ni }t tj	¡Ú}t
 d¡}| |¡ t |d	¡ | ¡  t ¡ \}}z|zT| ¡ |g}|| ¡ || j|f; }t ¡ }|gt ¡  }	|	d
|g7 }	t||	|ƒ W n   t |¡ ‚ Y n0 W t |¡ nt |¡ 0 || _|| _W d  ƒ n1 sR0    Y  W d  ƒ n1 sr0    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©Zdesired_keysr   r   Ú
<dictcomp>j   s   z-ForkServer.ensure_running.<locals>.<dictcomp>r.   i€  z-c)r   r   r   r   r   r	   Zget_preparation_dataÚitemsr-   r.   r   Zarbitrary_addressÚbindr0   ÚchmodÚlistenr1   ÚfilenoÚget_executabler
   Ú_args_from_interpreter_flagsr   r2   r   )
r   ÚcmdÚdataÚlistenerÚaddressÚalive_rZalive_wZfds_to_passZexeÚargsr   r<   r   r   X   sB    



ÿ

ÿ

zForkServer.ensure_runningN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r   r   r   $   s
   r   c                 C   sh  |rjd|v r@|dur@dt  ¡ _zt |¡ W t  ¡ `n
t  ¡ `0 |D ]$}zt|ƒ W qD tyf   Y qD0 qDtjdur¦ztj 	¡  t
tjƒt_W n ttfy¤   Y n0 t tjtj¡}tjtj| dŠ}t ¡ ^}| ¡ t_| |tj¡ | |tj¡ zîdd„ | ¡ D ƒ}	|	rþqqþ||	v r>t |d¡dks:J ‚t‚||	v sLJ ‚| ¡ d	 ~}
d}t ¡ d	krÈzNzt |
|||ƒ W n, t!y¬   tj"t #¡ Ž  tj$ %¡  Y n0 W t &|¡ nt &|¡ 0 W d  ƒ n1 sÞ0    Y  W qü ty  } z|j't'j(kr‚ W Y d}~qüd}~0 0 qüW d  ƒ n1 s:0    Y  W d  ƒ n1 sZ0    Y  dS )
zRun forkserver.r   NT)rB   c                 S   s   g | ]\}}|j ‘qS r   )Úfileobj)r#   ÚkeyÚeventsr   r   r   Ú
<listcomp>°   r&   zmain.<locals>.<listcomp>r   r&   r   ))r   Úcurrent_processZ_inheritingr	   Zimport_main_pathÚ
__import__ÚImportErrorÚsysÚstdinr2   Ú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)Zlistener_fdrI   Zpreloadr7   r8   ÚmodnameÚhandlerrG   ÚselectorZrfdsÚsÚcodeÚer   r   r   ÚmainŽ   sZ    


ÿ

<rw   c                 G   s   | ||||fS r    r   )r6   r5   ÚaliveÚstfdZ	inheritedr   r   r   Ú__unpack_fdsÉ   s    rz   c           
      C   s¦   |  ¡  t  |¡ t tj|¡ t | td ¡}|   ¡  t|ƒtksHJ ‚t|Ž \}}t	_
}t	_|tj_t|t ¡ ƒ dtjv rŽdd l}| ¡  t |¡}	t||	ƒ d S )Nr   Úrandomr   )r2   r0   rZ   r[   r   Zrecvfdsr+   r*   rz   r`   r   r   r   Z_semaphore_trackerZ_fdÚwrite_unsignedÚgetpidrU   Úmodulesr{   Úseedr	   Ú_main)
rt   rG   rI   rr   r3   r6   r5   ry   r{   ru   r   r   r   rh   Í   s     
ÿ


rh   c                 C   sN   d}t j}t|ƒ|k r@t | |t|ƒ ¡}|s6tdƒ‚||7 }q
t  |¡d S )Nr&   zunexpected EOFr   )ÚUNSIGNED_STRUCTÚsizer*   r0   rd   ÚEOFErrorÚunpack)ÚfdrF   Úlengthrt   r   r   r   Úread_unsignedï   s    
r‡   c                 C   s<   t  |¡}|r8t | |¡}|dkr*tdƒ‚||d … }q
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   ro   r0   r]   rZ   r-   ÚstructrU   r   Ú r   r   r   r   r	   r
   Úcompatr   Ú__all__r+   ÚStructr   Úobjectr   rw   rz   rh   r‡   r|   r`   r   r   r   r   r   r   r   r   Ú<module>   s:   
j
;"