U
    ªº|e¢8  ã                   @   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mZ d dlm	Z	 ddl
mZ ejdkrzd dlZd dlZd dlmZ dd	d
gZeedƒZejejfZeje jdœZe jdkrºeed< dZG dd„ dƒZeƒ ZejZejZej Z ej!Z!ej"Z"ddd„Z#dd„ Z$dS )é    N)Ú
sem_unlink)Úutilé   )ÚspawnÚwin32)Ú	duplicateÚensure_runningÚregisterÚ
unregisterÚpthread_sigmask)ÚfolderÚfileÚposixZsemlockFc                   @   sL   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d„ Z
dS )ÚResourceTrackerc                 C   s   t  ¡ | _d | _d | _d S ©N)Ú	threadingÚLockÚ_lockÚ_fdÚ_pid©Úself© r   úk/var/www/website-v5/atlas_env/lib/python3.8/site-packages/joblib/externals/loky/backend/resource_tracker.pyÚ__init__N   s    
zResourceTracker.__init__c                 C   s   |   ¡  | jS r   )r   r   r   r   r   r   ÚgetfdS   s    zResourceTracker.getfdc           	      C   sÚ  | j ��È | jdk	r~|  ¡ r*W 5 Q R £ dS t | j¡ tjdkrhzt | jd¡ W n tk
rf   Y nX d| _d| _t	 
d¡ g }z| tj ¡ ¡ W n tk
rª   Y nX t ¡ \}}tjdkrâtt |¡dd�}t |¡ |}dtj› d	|› d
t› d�}zªzv| |¡ t ¡ }|ft ¡ d|f•}t d|› �¡ z$t�rLt  !t j$t#¡ t%|||ƒ}W 5 t�rpt  !t j"t#¡ X W n" t&k
�r–   t |¡ ‚ Y nX || _|| _W 5 tjdk�rÀt |¡ n
t |¡ X W 5 Q R X dS )z¬Make sure that resource tracker process is running.

        This can be run from any process.  Usually a child process will use
        the resource created by its parent.Nr   r   z^resource_tracker: process died unexpectedly, relaunching.  Some folders/sempahores might leak.r   T)Úinheritablezfrom z import main; main(z, ú)z-czlaunching resource tracker: )'r   r   Ú_check_aliveÚosÚcloseÚnameÚwaitpidr   ÚOSErrorÚwarningsÚwarnÚappendÚsysÚstderrÚfilenoÚ	ExceptionÚpipeÚplatformr   ÚmsvcrtZget_osfhandleÚmainÚ
__module__ÚVERBOSEÚ_winapiÚCloseHandler   Zget_executabler   Ú_args_from_interpreter_flagsÚdebugÚ_HAVE_SIGMASKÚsignalr   ÚSIG_UNBLOCKÚ_IGNORED_SIGNALSÚ	SIG_BLOCKÚspawnv_passfdsÚBaseException)	r   Zfds_to_passÚrÚwÚ_rÚcmdZexeÚargsÚpidr   r   r   r   W   sf    


ÿ


 ÿ ÿ


zResourceTracker.ensure_runningc                 C   s2   z|   ddd¡ W n tk
r(   Y dS X dS dS )z8Check for the existence of the resource tracker process.ÚPROBEÚ FTN)Ú_sendÚBrokenPipeErrorr   r   r   r   r   §   s
    zResourceTracker._check_alivec                 C   s   |   ¡  |  d||¡ dS )z6Register a named resource, and increment its refcount.ÚREGISTERN©r   rD   ©r   r!   Úrtyper   r   r   r	   °   s    zResourceTracker.registerc                 C   s   |   ¡  |  d||¡ dS )z2Unregister a named resource with resource tracker.Ú
UNREGISTERNrG   rH   r   r   r   r
   µ   s    zResourceTracker.unregisterc                 C   s   |   ¡  |  d||¡ dS )z@Decrement the refcount of a resource, and delete it if it hits 0ÚMAYBE_UNLINKNrG   rH   r   r   r   Úmaybe_unlinkº   s    zResourceTracker.maybe_unlinkc                 C   sR   t |ƒdkrtdƒ‚|› d|› d|› d� d¡}t | j|¡}|t |ƒksNt‚d S )Ni   zname too longú:Ú
Úascii)ÚlenÚ
ValueErrorÚencoder   Úwriter   ÚAssertionError)r   r?   r!   rI   ÚmsgÚnbytesr   r   r   rD   ¿   s
    zResourceTracker._sendN)Ú__name__r/   Ú__qualname__r   r   r   r   r	   r
   rL   rD   r   r   r   r   r   M   s   P	r   c                    sŠ  ˆ rt jt jd� t tjtj¡ t tjtj¡ trDt tj	t
¡ tjtjfD ]&}z| ¡  W qP tk
rt   Y qPX qPˆ r†t  d¡ dd„ t ¡ D ƒ}�z†tjdkr´t | tj¡} t| d	ƒ��X}| ¡ }|d
krÖ�q�zø| ¡  d¡ d¡}|d d |dd… ¡|d   }	}
}|	dk�r"W qÂ|tk�rNtd|
› d|› dt t ¡ ƒ› �ƒ‚|	dk�r¸|
|| k�rtd|| |
< n|| |
  d7  < ˆ �rÎt  d|› d|
› d|| |
 › d�¡ �n|	dk�rö|| |
= ˆ �rÎt  d|
› d|› dt!|ƒ› d�¡ nØ|	dk�rÀ|| |
  d8  < ˆ �r@t  d|› d|
› d|| |
 › d�¡ || |
 dk�rÎ|| |
= z&ˆ �rtt  d|
› �¡ t| |
ƒ W n: tk
�r¼ } zt" #d|
› d |›�¡ W 5 d!}~X Y nX nt$d"|	›�ƒ‚W qÂ t%k
�r   ztj&t '¡ Ž  W n t%k
�r
   Y nX Y qÂX qÂW 5 Q R X W 5 ‡ fdd„}| ¡ D ]$\}}|dk�rN�q6n
|||ƒ �q6d|k�rt||d dƒ X ˆ �r†t  d#¡ d!S )$zRun resource tracker.)Úlevelz Main resource tracker is runningc                 S   s   i | ]
}|i “qS r   r   )Ú.0rI   r   r   r   Ú
<dictcomp>æ   s      zmain.<locals>.<dictcomp>c                    s¦   | r:z t  dt| ƒ› d|› d�¡ W n tk
r8   Y nX | D ]b}z$t| |ƒ ˆ rdt d|› �¡ W q> tk
rž } zt  d|› d|›�¡ W 5 d }~X Y q>X q>d S )Nz%resource_tracker: There appear to be z leaked z  objects to clean up at shutdownú[ResourceTracker] unlink úresource_tracker: ú: )r$   r%   rP   r*   Ú_CLEANUP_FUNCSr   r4   )Úrtype_registryrI   r!   Úe©Úverboser   r   Ú_unlink_resources7  s    ÿzmain.<locals>._unlink_resourcesr   r   Úrbó    rO   rM   r   r   éÿÿÿÿrB   zCannot register z/ for automatic cleanup: unknown resource type (z1). Resource type should be one of the following: rF   z*[ResourceTracker] incremented refcount of ú z
 (current r   rJ   z[ResourceTracker] unregister z: registry(rK   z*[ResourceTracker] decremented refcount of r\   r]   r^   Nzunrecognized command zresource tracker shut down)(r   Úlog_to_stderrÚDEBUGr6   ÚSIGINTÚSIG_IGNÚSIGTERMr5   r   r7   r8   r'   ÚstdinÚstdoutr    r*   r4   r_   ÚkeysÚitemsr,   r-   Úopen_osfhandler   ÚO_RDONLYÚopenÚreadlineÚstripÚdecodeÚsplitÚjoinrQ   ÚlistrP   r$   r%   ÚRuntimeErrorr;   Ú
excepthookÚexc_info)Úfdrc   ÚfÚregistryrd   rI   r`   ÚlineÚsplittedr?   r!   ra   r   rb   r   r.   Ñ   s     

ý


ÿ
ÿ

ÿ
ÿ
ÿÿ

r.   c                    sÒ   t |ƒ}tjdkrpt ¡ \}}z8ddlm‰  ddlm} ‡ fdd„|D ƒ}|||ƒW ¢S t |¡ t |¡ X n^d 	dd	„ |D ƒ¡}z0t
 | |d d d
dd d d ¡	\}}	}
}t
 |	¡ W n tk
rÈ   Y nX |
S d S )Nr   r   ©Ú_mk_inheritable)Ú	fork_execc                    s   g | ]}ˆ |ƒ‘qS r   r   )rZ   r~   rƒ   r   r   Ú
<listcomp>l  s     z"spawnv_passfds.<locals>.<listcomp>rh   c                 s   s   | ]}d |› d �V  qdS )ú"Nr   )rZ   Úxr   r   r   Ú	<genexpr>r  s     z!spawnv_passfds.<locals>.<genexpr>Tr   )Úsortedr'   r,   r   r+   r    Ú	reductionr„   r…   ry   r1   ZCreateProcessr2   r;   )Úpathr@   ÚpassfdsÚerrpipe_readÚerrpipe_writer…   Z_passr?   Ú_ZhtrA   r   rƒ   r   r:   d  s6    

        ÿr:   )r   )%r   Úshutilr'   r6   r$   r   Ú_multiprocessingr   Úmultiprocessingr   rC   r   r,   r1   r-   Zmultiprocessing.reductionr   Ú__all__Úhasattrr5   rk   rm   r8   ÚrmtreeÚunlinkr_   r!   r0   r   Ú_resource_trackerr   r	   rL   r
   r   r.   r:   r   r   r   r   Ú<module>.   s:   



|
 