o
    i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r=d dlZd dl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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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   i/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/joblib/externals/loky/backend/resource_tracker.py__init__R   s   

zResourceTracker.__init__c                 C   s   |    | jS r   )r   r   r   r   r   r   getfdW   s   zResourceTracker.getfdc           	      C   s*  | 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 d	| d
t d}zjzD|| t }|gt d|}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rt%&| nt| ntjdkrt%&| 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 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   msvcrtget_osfhandlemain
__module__VERBOSEr   get_executabler   _args_from_interpreter_flagsdebug_HAVE_SIGMASKsignalr   	SIG_BLOCK_IGNORED_SIGNALSspawnv_passfdsSIG_UNBLOCKBaseException_winapiCloseHandle)	r   fds_to_passrw_rcmdexeargspidr   r   r   r   [   s   









C$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   rI   r   r"   rtyper   r   r   r	         zResourceTracker.registerc                 C   rK   )z2Unregister a named resource with resource tracker.
UNREGISTERNrM   rN   r   r   r   r
      rP   zResourceTracker.unregisterc                 C   rK   )z@Decrement the refcount of a resource, and delete it if it hits 0MAYBE_UNLINKNrM   rN   r   r   r   maybe_unlink   rP   zResourceTracker.maybe_unlinkc                 C   sR   t |dkr
td| d| d| dd}t| j|}|t |ks'J d S )Ni   zname too long:
ascii)len
ValueErrorencoder    writer   )r   rC   r"   rO   msgnbytesr   r   r   rI      s
   zResourceTracker._sendN)__name__r1   __qualname__r   r   r   r   r	   r
   rS   rI   r   r   r   r   r   P   s    L	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 }zmtjdkrXt| tj} t| d(}	 | }|dkrjnz| d	d
}|d d
|dd |d }}}|dkrW q_|tvrtd| d| dtt  |dkr||| vrd|| |< n
|| |  d7  <  rt d| d| d|| |  d n|dkr|| |=  rt d| d| dt | d nm|dkrW|| |  d8  <  rt d| d| d|| |  d || | dkrV|| |= z r0t d|  t| | W n& tyU }	 zt!"d| d|	 W Y d}	~	nd}	~	ww nt#d |W n t$y}   z	tj%t&   W n
 t$yz   Y nw Y nw q`W d   n	1 sw   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 | ]}|i qS r   r   ).0rO   r   r   r   
<dictcomp>   s    zmain.<locals>.<dictcomp>r   rbT    rV   rT   r   r   rG   zCannot register z/ for automatic cleanup: unknown resource type (z1). Resource type should be one of the following: rL   z*[ResourceTracker] incremented refcount of  z
 (current r   rQ   z[ResourceTracker] unregister z: registry(rR   z*[ResourceTracker] decremented refcount of [ResourceTracker] unlink resource_tracker: : Nzunrecognized command c                    s   | rzt dt|  d| d W n	 ty   Y nw | D ]1}zt| |  r1td|  W q tyO } zt d| d| W Y d }~qd }~ww d S )Nz%resource_tracker: There appear to be z leaked z  objects to clean up at shutdownrf   rg   rh   )r%   r&   rW   r+   _CLEANUP_FUNCSr   r5   )rtype_registryrO   r"   everboser   r   _unlink_resources3  s.   "zmain.<locals>._unlink_resourcesr   zresource tracker shut down)(r   log_to_stderrDEBUGr7   SIGINTSIG_IGNSIGTERMr6   r   r;   r9   r(   stdinstdoutr!   r+   r5   ri   keysr-   r.   open_osfhandler    O_RDONLYopenreadlinestripdecodesplitjoinrX   listrW   r%   r&   RuntimeErrorr<   
excepthookexc_infoitems)fdrm   fregistrylinesplittedrC   r"   rO   rk   rn   rj   r   rl   r   r0      s   








H



r0   c                    s   t |}tjdkr@t \}}z%ddlm  ddlm}  fdd|D }|||W t| t| S t| t| w d	dd	 |D }zt
| |d d d
dd d d 	\}}	}
}t
|	 W |
S  tym   Y |
S w )Nr   r   _mk_inheritable)	fork_execc                    s   g | ]} |qS r   r   )r`   r   r   r   r   
<listcomp>f  s    z"spawnv_passfds.<locals>.<listcomp>re   c                 s   s    | ]	}d | d V  qdS )"Nr   )r`   xr   r   r   	<genexpr>l  s    z!spawnv_passfds.<locals>.<genexpr>Tr   )sortedr(   r-   r    r,   	reductionr   r   r!   r~   r=   CreateProcessr>   r<   )pathrE   passfdserrpipe_readerrpipe_writer   _passrC   _htrF   r   r   r   r:   _  s.   



r:   )r   )%r    shutilr(   r7   r%   r   _multiprocessingr   multiprocessingr   rH   r   r-   r=   r.   multiprocessing.reductionr   __all__hasattrr6   rq   rs   r9   rmtreeunlinkri   r"   r2   r   _resource_trackerr   r	   rS   r
   r   r0   r:   r   r   r   r   <module>   s@   -


y
 