o
    tBh9                     @   sH  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eje j d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*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fileposix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   /var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/joblib/externals/loky/backend/resource_tracker.py__init__U   s   

zResourceTracker.__init__c                 C   s   |    | jS r   )r   r   r   r   r   r   getfdZ   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}zzh|| t }|gt  }tjdd	 d
krddl}tdt |D ]}	|!dd||	 ||	< q|d|g7 }t"d| zt#rt$%t$j&t' t(|||}
W t#rt$%t$j)t' nt#rt$%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 )zMake 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argsr:   ipidr   r   r   r   ^   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 )z6Register a named resource, and increment its refcount.REGISTERNr   rR   r   r%   rtyper   r   r   r         zResourceTracker.registerc                 C   rT   )z2Unregister a named resource with resource tracker.
UNREGISTERNrV   rW   r   r   r   r      rY   zResourceTracker.unregisterc                 C   rT   )z@Decrement the refcount of a resource, and delete it if it hits 0MAYBE_UNLINKNrV   rW   r   r   r   maybe_unlink   rY   zResourceTracker.maybe_unlinkc                 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)r3   encoder<   
ValueErrorr#   writer   )r   rK   r%   rX   msgnbytesr   r   r   rR      s
   zResourceTracker._sendN)__name__r5   __qualname__r   r   r   r"   r   r   r\   rR   r   r   r   r   r   S   s    U	r   c                    s   r	t jt jd 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y9   Y q(w  rAt d dd t D }zVtjdkrXt| tj} t| d}	 | }|dkrinz| d	d
}|d d
|dd |d }}}|dkrW q_|tvrtd||t t |dkr||| vrd|| |< n
|| |  d7  <  rt d|||| |  n}|dkr|| |=  rt d||t!| ne|dkrA|| |  d8  <  rt d|||| |  || | dkr@|| |= z rt d| t| | W n# ty? }	 zt"#d||	f  W Y d}	~	nd}	~	ww nt$d| W n t%yf   z	tj&t'   W n
 t%yc   Y nw Y nw q`W d   n	1 ssw   Y  W  fdd}
|( D ]\}}|dkrq|
|| qd|v r|
|d d n* fdd}
|( D ]\}}|dkrq|
|| qd|v r|
|d d w w  rt d dS dS )zRun resource tracker.)levelz Main resource tracker is runningc                 S   s   i | ]}|t  qS r   )dict).0rX   r   r   r   
<dictcomp>   s    zmain.<locals>.<dictcomp>r   rbT    r]   :r   r   rP   zvCannot register {} for automatic cleanup: unknown resource type ({}). Resource type should be one of the following: {}rU   z<[ResourceTracker] incremented refcount of {} {} (current {})rZ   z0[ResourceTracker] unregister {} {}: registry({})r[   z<[ResourceTracker] decremented refcount of {} {} (current {})[ResourceTracker] unlink {}resource_tracker: %s: %rNzunrecognized command %rc                    s   | rzt dt| |f  W n	 ty   Y nw | D ]/}zt| |  r.td| W q tyJ } zt d||f  W Y d }~qd }~ww d S )NzQresource_tracker: There appear to be %d leaked %s objects to clean up at shutdownrm   rn   )r(   r)   r<   r.   _CLEANUP_FUNCSr   r>   r3   )rtype_registryrX   r%   everboser   r   _unlink_resources;  s*   

zmain.<locals>._unlink_resourcesr   zresource tracker shut down))r   log_to_stderrDEBUGr@   SIGINTSIG_IGNSIGTERMr?   r   rD   rB   r+   stdinstdoutr$   r.   r>   ro   keysr0   r1   open_osfhandler#   O_RDONLYopenreadlinestripdecodesplitjoinr_   r3   listr<   r(   r)   RuntimeErrorrE   
excepthookexc_infoitems)fdrs   fregistrylinesplittedrK   r%   rX   rq   rt   rp   r   rr   r   r4      s   






D



r4   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   )rg   xr   r   r   	<genexpr>u  s    z!spawnv_passfds.<locals>.<genexpr>Tr   )sortedr+   r0   r#   r/   	reductionr   r   r$   r   r   CreateProcessrF   rE   )pathrM   passfdserrpipe_readerrpipe_writer   _passr   r   rK   hphtrO   tidr   r   r   rC   f  s2   



rC   )r   ).r#   shutilr+   r@   r(   r   rQ   r   multiprocessingr   r0   compat_win32r   r   r   r1   _multiprocessingr   ImportErrorr   r9   r'   rS   r
   r   __all__hasattrr?   rw   ry   rB   rmtreeunlinkro   r%   r6   objectr   _resource_trackerr   r   r\   r   r   r4   rC   r   r   r   r   <module>   sP   )



 
 
