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Zd dlZzd dlZW n e	y1   dZY nw ej
dkZdd„ Zddd„Zdd	d
„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )é    NÚwin32c                  C   s   t  ¡ } d| _dS )z0Put a ``_clean_exit`` flag on the current threadTN)Ú	threadingÚcurrent_threadÚ_clean_exit)Úthread© r   úU/var/www/html/env/lib/python3.10/site-packages/joblib/externals/loky/backend/utils.pyÚ_flag_current_thread_clean_exit   s   
r	   Tc                 C   s$   |rt d urt| ƒ d S t| ƒ d S ©N)ÚpsutilÚ _recursive_terminate_with_psutilÚ#_recursive_terminate_without_psutil)ÚprocessÚ
use_psutilr   r   r   Úrecursive_terminate   s   r   é   c              	   C   sx   zt  | j¡jdd�}W n t jy   Y d S w |d d d… D ]}z| ¡  W q t jy1   Y qw |  ¡  |  ¡  d S )NT)Ú	recursiveéÿÿÿÿ)r   ÚProcessÚpidÚchildrenÚNoSuchProcessÚkillÚ	terminateÚjoin)r   Úretriesr   Úchildr   r   r   r      s   ÿÿr   c              
   C   sR   zt | jƒ W n ty" } zt d¡ |  ¡  W Y d}~nd}~ww |  ¡  dS )z-Terminate a process and its descendants.
    zgFailed to kill subprocesses on this platform. Pleaseinstall psutil: https://github.com/giampaolo/psutilN)Ú_recursive_terminater   ÚOSErrorÚwarningsÚwarnr   r   )r   Úer   r   r   r   1   s   
€ûr   c                 C   sž  t jdkrgztjddddt| ƒgdd� W dS  tjyf } zC|jdvr%‚ |jd	krMz	t | t	j
¡ W n  tyL } z|jtjkrB‚ W Y d}~nd}~ww W Y d}~dS W Y d}~dS W Y d}~dS d}~ww ztjd
dt| ƒgdd�}W n tjy‘ } z|jd	kr†d}n‚ W Y d}~nd}~ww | ¡  d¡dd… }|D ]
}t|ƒ}t|ƒ qŸz
t | t	j
¡ W dS  tyÎ } z|jtjkrÃ‚ W Y d}~dS d}~ww )zERecursively kill the descendants of a process before killing it.
    r   Útaskkillz/Fz/Tz/PIDN)Ústderr)é   é€   éÿ   r$   Úpgrepz-Pó    Ú
r   )ÚsysÚplatformÚ
subprocessÚcheck_outputÚstrÚCalledProcessErrorÚ
returncodeÚosr   ÚsignalÚSIGTERMr   ÚerrnoÚESRCHÚdecodeÚsplitÚintr   )r   r!   Úchildren_pidsÚcpidr   r   r   r   ?   s^   
þ

ÿ€ÿù€ó
þ
þ€ý
ÿ€ür   c                 C   sr   d}dd„ t |  ¡ ƒD ƒ}t|ƒdkr5|dkr5|d8 }dd„ t |  ¡ ƒD ƒ}t d¡ t|ƒdkr5|dkst|ƒS )z·Return a formated string with the exitcodes of terminated workers.

    If necessary, wait (up to .25s) for the system to correctly set the
    exitcode of one terminated worker.
    r   c                 S   ó   g | ]
}|j d ur|j ‘qS r
   ©Úexitcode©Ú.0Úpr   r   r   Ú
<listcomp>‚   ó    
ÿz3get_exitcodes_terminated_worker.<locals>.<listcomp>r   r$   c                 S   r;   r
   r<   r>   r   r   r   rA   †   rB   gš™™™™™©?)ÚlistÚvaluesÚlenÚtimeÚsleepÚ_format_exitcodes)Ú	processesÚpatienceÚ	exitcodesr   r   r   Úget_exitcodes_terminated_workerw   s   
ürL   c                 C   s    dd„ | D ƒ}dd  |¡ d S )z@Format a list of exit code with names of the signals if possiblec                 S   s$   g | ]}|d urd  t|ƒ|¡‘qS )Nz{}({}))ÚformatÚ_get_exitcode_name)r?   r!   r   r   r   rA   �   s    
ÿz%_format_exitcodes.<locals>.<listcomp>Ú{z, Ú})r   )rK   Ústr_exitcodesr   r   r   rH   �   s   ÿrH   c                 C   s    t jdkrdS | dk rHz2dd l}t jdkr| |  ¡jW S |j ¡ D ]\}}| d¡r:| d¡s:||  kr:|  W S q"W dS  t	yG   Y dS w | dkrNdS dS )	Nr   ÚUNKNOWNr   )é   r   ÚSIGÚSIG_r&   ÚEXIT)
r*   r+   r2   Úversion_infoÚSignalsÚnameÚ__dict__ÚitemsÚ
startswithÚ
ValueError)r=   r2   ÚvÚkr   r   r   rN   ”   s(   



€ýùÿrN   )T)r   )r1   r*   rF   r4   r2   r   r   r,   r   ÚImportErrorr+   ÚWIN32r	   r   r   r   r   rL   rH   rN   r   r   r   r   Ú<module>   s,    ÿ


8