U
    |±ËhÌ  ã                	   @   s´  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mZ d dl	m
Z
 d dlmZ ddlmZmZmZ dgZG d	d
„ d
ƒZG dd„ dƒZedkr°d dlZe d¡Zejdeddd ejdeddd e ¡ Zi ZdZz¶z^e  "ej#d¡>Zde $¡ _%z"e &e¡Z'e (e'¡ e &e¡Z)W 5 e $¡ `%X W 5 Q R X e) *¡ ZW nR e+k
rŒ   e,dƒ e,ej-› dƒ e,dƒ d dl.Z.e,e. /¡ ƒ e,dƒ Y nX W 5 edk	r¤e  ¡  e !e¡ X dS )é    N)ÚBytesIO)ÚutilÚprocess)Úwait)Úset_spawning_popené   )Ú	reductionÚresource_trackerÚspawnÚPopenc                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_DupFdc                 C   s   t  |¡| _d S ©N)r   Ú_mk_inheritableÚfd©Úselfr   © r   úR/tmp/pip-unpacked-wheel-9qhk7zno/joblib/externals/loky/backend/popen_loky_posix.pyÚ__init__   s    z_DupFd.__init__c                 C   s   | j S r   )r   ©r   r   r   r   Údetach   s    z_DupFd.detachN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r      s   r   c                   @   sX   e Zd ZdZeZdd„ Zdd„ Zej	fdd„Z
dd	d
„Zdd„ Zdd„ Zedd„ ƒZdS )r   Zlokyc                 C   s.   t j ¡  t j ¡  d | _g | _|  |¡ d S r   )ÚsysÚstdoutÚflushÚstderrÚ
returncodeÚ_fdsÚ_launch)r   Úprocess_objr   r   r   r   +   s
    

zPopen.__init__c                 C   s   | j  |¡ t |¡S r   )r   Úappendr   r   r   r   r   r   Úduplicate_for_child2   s    zPopen.duplicate_for_childc                 C   s€   | j d krzzt | j|¡\}}W q< tk
r6   Y d S X q<q
|| jkrzt |¡r`t |¡ | _ nt |¡snt‚t 	|¡| _ | j S r   )
r   ÚosÚwaitpidÚpidÚOSErrorÚWIFSIGNALEDÚWTERMSIGÚ	WIFEXITEDÚAssertionErrorÚWEXITSTATUS)r   Úflagr&   Ústsr   r   r   Úpoll6   s    


z
Popen.pollNc                 C   sB   | j d kr<|d k	r$t| jg|ƒs$d S |  |dkr6tjnd¡S | j S )Ng        r   )r   r   Úsentinelr/   r$   ÚWNOHANG)r   Útimeoutr   r   r   r   I   s    
z
Popen.waitc                 C   s\   | j d krXzt | jtj¡ W n8 tk
r2   Y n& tk
rV   | jddd krR‚ Y nX d S )Ngš™™™™™¹?)r2   )	r   r$   Úkillr&   ÚsignalÚSIGTERMÚProcessLookupErrorr'   r   r   r   r   r   Ú	terminateR   s    
zPopen.terminatec                 C   sÎ  t j ¡ }tƒ }t| ƒ z2t |jt|ddƒ¡}t	 
||¡ t	 
||¡ W 5 td ƒ X z.t ¡ \}}t ¡ \}}	tjg}
|
d| jg7 }
|
dt|jƒg7 }
|
dtt	 |¡ƒg7 }
t	 |¡ t	 |¡ |  j|||g7  _tjdkrtjdkr|d d	 }|  |¡ d
dlm} ||
| j|jd}t d|› d|
› ¡ || _d}t||ƒsTd}t |	d¡}| t||ƒƒ ¡ W 5 Q R X || _ W 5 |d k	r¤t | tj|f¡ ||fD ]}|d k	r¬t |¡ q¬X d S )NZinit_main_moduleTz-mú--process-nameú--pipe)é   é   ÚposixZmp_tracker_argsr   r   )Ú	fork_exec)Úenvzlaunched python with pid z
 and cmd:
Ú	getbufferÚgetvalueÚwb)!r	   Z_resource_trackerZgetfdr   r   r
   Zget_preparation_dataÚ_nameÚgetattrr   Údumpr   ZFinalizer$   ÚcloseÚpiper   Ú
executabler   ÚstrÚnamer   r   Úversion_infor#   r=   r>   Údebugr0   ÚhasattrÚfdopenÚwriter&   )r   r!   Z
tracker_fdÚfpÚ	prep_dataZparent_rZchild_rZchild_wr   Zparent_wZ
cmd_pythonZmp_tracker_fdr=   r&   ÚmethodÚfr   r   r   r    \   sR    

þ



ÿ


zPopen._launchc                   C   s   dS )NTr   r   r   r   r   Úthread_is_spawning“   s    zPopen.thread_is_spawning)N)r   r   r   rQ   r   ZDupFdr   r#   r$   r1   r/   r   r7   r    ÚstaticmethodrS   r   r   r   r   r   '   s   
	
7Ú__main__zCommand line parserr9   TzFile handle for the pipe)ÚtypeÚrequiredÚhelpr8   z Identifier for debugging purpose)rV   ÚdefaultrX   ÚrbzR

--------------------------------------------------------------------------------z failed with traceback: zP--------------------------------------------------------------------------------zQ
--------------------------------------------------------------------------------)0r$   r   r4   ÚpickleÚior   Úmultiprocessingr   r   Zmultiprocessing.connectionr   Zmultiprocessing.contextr   Ú r   r	   r
   Ú__all__r   r   r   ÚargparseÚArgumentParserÚparserÚadd_argumentÚintrH   Ú
parse_argsÚargsÚinfoÚexitcodeZfrom_parentrE   ÚexitrM   rF   Úcurrent_processZ_inheritingÚloadrP   Úpreparer!   Ú
_bootstrapÚ	ExceptionÚprintZprocess_nameÚ	tracebackÚ
format_excr   r   r   r   Ú<module>   s`   q

   ÿü



