U
    ãÇ-eð0  ã                   @   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 d	d
ddg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   úX/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/multiprocess/forkserver.pyÚ__init__"   s    
zForkServer.__init__c              	   C   s   | j  |  ¡  W 5 Q R X d S ©N)r   Ú_stop_unlockedr   r   r   r   Ú_stop*   s    zForkServer._stopc                 C   sV   | j d krd S t | j¡ d | _t | j d¡ d | _ t | j¡sLt | 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k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   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
   D   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 }zNz&t ||¡ ||fW W ¢4W  5 Q R £ S    t |¡ t |¡ ‚ Y nX W 5 t |¡ t |¡ X W 5 Q R X 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   Zgetfdr"   r   Zsendfds)r   ÚfdsÚclientZparent_rÚchild_wÚchild_rZparent_wZallfdsr   r   r   r   L   s(    ÿ


z!ForkServer.connect_to_new_processc                    s  | j ~ t ¡  | jdk	r`t | jtj¡\}}|sBW 5 Q R £ dS t | j¡ d| _	d| _d| _d}| j
r”ddh‰ t d¡}‡ fdd„| ¡ D ƒ}ni }t tj¡Ø}t d¡}| |¡ t |¡sÐt |d	¡ | ¡  t ¡ \}}ztzV| ¡ |g}	|| ¡ || j
|f; }t ¡ }
|
gt ¡  }|d
|g7 }t |
||	¡}W n   t |¡ ‚ Y nX W 5 t |¡ X || _	|| _|| _W 5 Q R X W 5 Q R X 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 multiprocess.forkserver import main; main(%d, %d, %r, **%r)Ú	main_pathÚsys_pathÚignorec                    s   i | ]\}}|ˆ k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   Zarbitrary_addressÚbindr   r$   ÚchmodÚlistenr4   ÚfilenoÚget_executableÚ_args_from_interpreter_flagsZspawnv_passfds)r   ÚpidÚstatusÚcmdÚdataÚlistenerÚaddressÚalive_rZalive_wZfds_to_passÚexeÚargsr   r>   r   r	   i   sN    





ÿ
zForkServer.ensure_runningN)
Ú__name__Ú
__module__Ú__qualname__r   r    r   r   r
   r   r	   r   r   r   r   r       s   r   c                 C   sú  |rdd|kr8|dk	r8dt  ¡ _zt |¡ W 5 t  ¡ `X |D ]&}zt|ƒ W q< tk
r`   Y q<X q<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	}t ¡ þ}| ¡ t_| |tj¡ | |tj¡ | |tj¡ zˆd
d„ | ¡ D ƒ}|r"qBq"||krjt	 |d¡dksftdƒ‚t‚||kr\t	 |d¡ zt	 dt	j ¡\}}W n t!k
r²   Y q\Y nX |dkrÂq\| "|d¡}|dk	rJt	 #|¡ròt	 $|¡ }n&t	 %|¡std &||¡ƒ‚t	 '|¡}zt(||ƒ W n t)k
r<   Y nX t	 *|¡ nt+ ,d| ¡ q€||kr¦| -¡ d ,}t. /|t0d ¡}t1|ƒt0kr¦t2d &t1|ƒ¡ƒ‚|^}}}| *¡  t	 3¡ }|dkrNd}zpz<| *¡  | *¡  ||||g}| 5| 6¡ ¡ t7||||
ƒ}W n. t8k
r:   t9j:t9 ;¡ Ž  t9j< =¡  Y nX W 5 t	 4|¡ X nNzt(||ƒ W n t)k
rr   Y nX |||< t	 *|¡ |D ]}t	 *|¡ qŠW 5 Q R X W n4 t>k
rÜ } z|j?t?j@krÌ‚ W 5 d}~X Y nX qW 5 Q R X W 5 Q R X dS )zRun forkserver.r   NTFc                  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   r?   Æ   s   ÿ zmain.<locals>.<dictcomp>)rE   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Child {0:n} status is {1:n}z.forkserver: waitpid returned unexpected pid %dzToo many ({0:n}) fds to send)Ar   Úcurrent_processZ_inheritingr   Zimport_main_pathÚ
__import__ÚImportErrorr   Z_close_stdinr!   r4   Úset_blockingrU   ÚSIGCHLDÚSIGINTÚSIG_IGNrA   Úset_wakeup_fdr1   r2   Ú	selectorsÚDefaultSelectorÚgetsocknameÚ_forkserverr   ÚregisterÚ
EVENT_READÚselectÚreadÚAssertionErrorÚ
SystemExitr#   r@   ÚChildProcessErrorÚpopÚWIFSIGNALEDÚWTERMSIGÚ	WIFEXITEDÚformatÚWEXITSTATUSÚwrite_signedÚBrokenPipeErrorr"   ÚwarningsÚwarnÚacceptr   Zrecvfdsr/   r.   ÚRuntimeErrorÚforkÚ_exitÚextendÚvaluesÚ
_serve_oneÚ	ExceptionÚsysÚ
excepthookÚexc_infoÚstderrÚflushÚOSErrorÚerrnoÚECONNABORTED)Zlistener_fdrN   Zpreloadr9   r:   ÚmodnameZsig_rZsig_wrT   ÚhandlersZold_handlersZ	pid_to_fdrL   ÚselectorZrfdsrH   Ústsr7   Ú
returncodeÚsr5   r8   ÚcodeÚ
unused_fdsÚfdÚer   r   r   Úmain§   sÖ    

  üÿ
ÿ




 ÿÿ
ÿ

ÿÿ

þ
r•   c           	      C   sh   t  d¡ | ¡ D ]\}}t   ||¡ q|D ]}t |¡ q,|^t_tj_	t_
t | ¡}t | |¡}|S )Nr]   )rU   re   rA   r!   r"   ri   r   r   Z_resource_trackerZ_fdr   Údupr   Ú_main)	r8   r5   r’   rŒ   rV   rW   r“   Zparent_sentinelr‘   r   r   r   r   1  s    
þ
r   c                 C   sN   d}t j}t|ƒ|k r@t | |t|ƒ ¡}|s6tdƒ‚||7 }q
t  |¡d S )Nr\   zunexpected EOFr   )ÚSIGNED_STRUCTÚsizer.   r!   rm   ÚEOFErrorÚunpack)r“   rK   Úlengthr   r   r   r   Úread_signedH  s    
r   c                 C   s<   t  |¡}|r8t | |¡}|dkr*tdƒ‚||d … }q
d S )Nr   zshould not get here)r˜   Úpackr!   Úwriter|   )r“   ÚnÚmsgÚnbytesr   r   r   rw   R  s    
rw   )NN) r‰   r!   rf   rU   r1   Ústructrƒ   r   ry   Ú r   r   Úcontextr   r   r   r   Ú__all__r/   ÚStructr˜   Úobjectr   r•   r   r   rw   ri   r	   r
   r   r   r   r   r   r   Ú<module>   s>   ÿ
 
 
