o
    l¨Êhî-  ã                   @   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	 ej
dkr9ddlmZ ddlmZ d dlZzd dlmZ W n eyP   ddlmZ Y nw ejd	k r^eZd d
l mZ g d¢ZeedƒZejejfZdejiZ e j!dkr{ee d< dZ"G dd„ de#ƒZ$e$ƒ Z%e%j&Z&e%j'Z'e%j(Z(e%j)Z)ddd„Z*dd„ Z+dS )é    Né   )Úspawn)ÚutilÚwin32)Ú_winapi)Ú	duplicate)Ú
sem_unlink)é   )Úfdopen)Úensure_runningÚregisterÚ
unregisterÚpthread_sigmaskÚfolderÚposixÚsemlockFc                   @   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 )ÚResourceTrackerc                 C   s   t  ¡ | _d | _d | _d S ©N)Ú	threadingÚLockÚ_lockÚ_fdÚ_pid©Úself© r   ú`/var/www/html/env/lib/python3.10/site-packages/joblib/externals/loky/backend/resource_tracker.pyÚ__init__B   s   

zResourceTracker.__init__c                 C   s   |   ¡  | jS r   )r   r   r   r   r   r   ÚgetfdG   s   zResourceTracker.getfdc                 C   sl  | j ��' | jdur@|  ¡ r	 W d  ƒ dS t | j¡ tjdkr5z	t | jd¡ W n	 ty4   Y nw d| _d| _t	 
d¡ g }z
| tj ¡ ¡ W n	 tyU   Y nw t ¡ \}}tjdkrqtt |¡dd�}t |¡ |}d tj|t¡}z�zh| |¡ t ¡ }|gt ¡  }tjdd	… d
kr­ddl}tdt |ƒƒD ]}	| !dd||	 ¡||	< qŸ|d|g7 }t "d |¡¡ zt#rÅt$ %t$j&t'¡ t(|||ƒ}
W t#rÕt$ %t$j)t'¡ nt#ràt$ %t$j)t'¡ w w W n t*yï   t |¡ ‚ w || _|
| _W tjdk�rt+ ,|¡ n t |¡ ntjdk�rt+ ,|¡ w t |¡ w W d  ƒ dS W d  ƒ dS 1 �s/w   Y  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 {} import main; main({}, {})é   )r	   r	   r   z-R+z-Rz-czlaunching resource tracker: {})-r   r   Ú_check_aliveÚosÚcloseÚnameÚwaitpidr   ÚOSErrorÚwarningsÚwarnÚappendÚsysÚstderrÚfilenoÚ	ExceptionÚpipeÚplatformr   ÚmsvcrtÚget_osfhandleÚformatÚmainÚ
__module__ÚVERBOSEr   Úget_executabler   Ú_args_from_interpreter_flagsÚversion_infoÚreÚrangeÚlenÚsubÚdebugÚ_HAVE_SIGMASKÚsignalr   Ú	SIG_BLOCKÚ_IGNORED_SIGNALSÚspawnv_passfdsÚSIG_UNBLOCKÚBaseExceptionr   ÚCloseHandle)r   Úfds_to_passÚrÚwÚ_rÚcmdÚexeÚargsr9   ÚiÚpidr   r   r   r   K   sŽ   

û
ý
ÿ

ÿ
ÿÿ€ÿÿÿ€
þý²L$´zResourceTracker.ensure_runningc                 C   s*   z
|   ddd¡ W dS  ty   Y dS w )z8Check for the existence of the resource tracker process.ÚPROBEÚ FT)Ú_sendÚBrokenPipeErrorr   r   r   r   r!       s   ýÿzResourceTracker._check_alivec                 C   ó   |   ¡  |  d||¡ dS )z0Register a named resource with resource tracker.ÚREGISTERN©r   rQ   ©r   r$   Úrtyper   r   r   r   ©   ó   zResourceTracker.registerc                 C   rS   )z2Unregister a named resource with resource tracker.Ú
UNREGISTERNrU   rV   r   r   r   r   ®   rX   zResourceTracker.unregisterc                 C   sJ   d  |||¡ d¡}t|ƒdkrtdƒ‚t | j|¡}|t|ƒks#J ‚d S )Nz{0}:{1}:{2}
Úasciii   zname too long)r2   Úencoder;   Ú
ValueErrorr"   Úwriter   )r   rJ   r$   rW   ÚmsgÚnbytesr   r   r   rQ   ³   s
   zResourceTracker._sendN)
Ú__name__r4   Ú__qualname__r   r   r   r!   r   r   rQ   r   r   r   r   r   @   s    U	r   c                 C   s¶  t   t jt j¡ t   t jt j¡ trt  t jt¡ tj	tj
fD ]}z| ¡  W q ty0   Y qw |r>tj d¡ tj ¡  dd„ t ¡ D ƒ}�ztjdkrUt | tj¡} t| dƒ�¢}|D ]—}zy| ¡  d¡ d¡}|d d |d	d
… ¡|d
 }}}|dkrƒW q]|tvr”td ||tt ¡ ƒ¡ƒ‚|dkr±||  |¡ |r°tj d ||¡¡ tj ¡  n&|dkrÑ||   |¡ |rÐtj d ||t!|ƒ¡¡ tj ¡  nt"d| ƒ‚W q] t#yô   z	tj$t %¡ Ž  W n	 t#yñ   Y nw Y q]w W d  ƒ n1 sÿw   Y  W | &¡ D ]\\}}	|	�r(zt' (dt!|	ƒ|f ¡ W n
 t�y'   Y nw |	D ]9}zt| |ƒ |�rDtj d |¡¡ tj ¡  W �q* t�yc }
 zt' (d||
f ¡ W Y d}
~
�q*d}
~
ww �q	nb| &¡ D ]\\}}	|	�rŠzt' (dt!|	ƒ|f ¡ W n
 t�y‰   Y nw |	D ]9}zt| |ƒ |�r¦tj d |¡¡ tj ¡  W �qŒ t�yÅ }
 zt' (d||
f ¡ W Y d}
~
�qŒd}
~
ww �qkw |�rÙtj d¡ tj ¡  dS dS )zRun resource tracker.z!Main resource tracker is running
c                 S   s   i | ]}|t ƒ “qS r   )Úset)Ú.0rW   r   r   r   Ú
<dictcomp>×   s    zmain.<locals>.<dictcomp>r   ÚrbrZ   ú:r   r   éÿÿÿÿrO   zvCannot register {} for automatic cleanup: unknown resource type ({}). Resource type should be one of the following: {}rT   z![ResourceTracker] register {} {}
rY   z.[ResourceTracker] unregister {} {}: cache({})
zunrecognized command %rNzQresource_tracker: There appear to be %d leaked %s objects to clean up at shutdownz[ResourceTracker] unlink {}
zresource_tracker: %s: %rzresource tracker shut down
))r?   ÚSIGINTÚSIG_IGNÚSIGTERMr>   r   rC   rA   r*   ÚstdinÚstdoutr#   r-   r+   r]   ÚflushÚ_CLEANUP_FUNCSÚkeysr/   r0   Úopen_osfhandler"   ÚO_RDONLYÚopenÚstripÚdecodeÚsplitÚjoinr\   r2   ÚlistÚaddÚremover;   ÚRuntimeErrorrD   Ú
excepthookÚexc_infoÚitemsr'   r(   )ÚfdÚverboseÚfÚcacheÚlineÚsplittedrJ   r$   rW   Úrtype_cacheÚer   r   r   r3   Ä   sà   ÿ


ÿÿýÿ
€þ
€€ÿ€ýßÿ€)

þÿÿ
€ €ÿöø

þÿÿ
€ €ÿöøþr3   c                 C   sæ   t |ƒ}tjdkrEt ¡ \}}z*ddlm} g }|D ]	}|||ƒg7 }qddlm} |||ƒW t |¡ t |¡ S t |¡ t |¡ w d 	dd„ |D ƒ¡}	zt
 | |	d d dd	d d d ¡	\}
}}}t
 |¡ W |S  tyr   Y |S w )
Nr   r   )Ú_mk_inheritable)Ú	fork_execú c                 s   s   � | ]}d | V  qdS )z"%s"Nr   )rc   Úxr   r   r   Ú	<genexpr>2  s   € z!spawnv_passfds.<locals>.<genexpr>Tr   )Úsortedr*   r/   r"   r.   Ú	reductionr†   r‡   r#   rv   r   ÚCreateProcessrE   rD   )ÚpathrL   ÚpassfdsÚerrpipe_readÚerrpipe_writer†   Ú_passr~   r‡   rJ   ÚhpÚhtrN   Útidr   r   r   rB   #  s2   



ÿÿþþrB   )r   ),r"   Úshutilr*   r?   r'   r   rP   r   Úmultiprocessingr   r/   Úcompat_win32r   rŒ   r   r0   Ú_multiprocessingr   ÚImportErrorr   r8   r&   rR   r
   rr   Ú__all__Úhasattrr>   rh   rj   rA   Úrmtreern   r$   r5   Úobjectr   Ú_resource_trackerr   r   r   r   r3   rB   r   r   r   r   Ú<module>   sH   
ÿ

ÿ
}
_