U
    .d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re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   R/tmp/pip-unpacked-wheel-ho8k9mhl/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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rtt|dd}t| |}dtj d	| d
t d}zzv|| 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rt| n
t| X W 5 Q R X 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   msvcrtZget_osfhandlemain
__module__VERBOSE_winapiCloseHandler   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   [   s^    









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   rE   r   r!   rtyper   r   r   r	      s    zResourceTracker.registerc                 C   s   |    | d|| dS )z2Unregister a named resource with resource tracker.
UNREGISTERNrH   rI   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_UNLINKNrH   rI   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!   rJ   msgnbytesr   r   r   rE      s
    zResourceTracker._sendN)__name__r/   __qualname__r   r   r   r   r	   r
   rM   rE   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rDttj	t
 tjtjfD ]&}z|  W qP tk
rt   Y qPX qP rt d dd t D }ztjdkrt| 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  <  rt d| d|
 d|| |
  d n|	dkr|| |
=  rt 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 qX qW 5 Q R X W 5  fdd}| D ]$\}}|dkrNq6n
||| q6d|krt||d d X  rt d# d!S )$zRun resource tracker.)levelz Main resource tracker is runningc                 S   s   i | ]
}|i qS r   r   ).0rJ   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%   rQ   r*   _CLEANUP_FUNCSr   r5   )rtype_registryrJ   r!   everboser   r   _unlink_resources3  s    zmain.<locals>._unlink_resourcesr   r   rb    rP   rN   r   r   rC   zCannot register z/ for automatic cleanup: unknown resource type (z1). Resource type should be one of the following: rG   z*[ResourceTracker] incremented refcount of  z
 (current r   rK   z[ResourceTracker] unregister z: registry(rL   z*[ResourceTracker] decremented refcount of r]   r^   r_   Nzunrecognized command zresource tracker shut down)(r   Zlog_to_stderrDEBUGr7   SIGINTSIG_IGNSIGTERMr6   r   r8   r9   r'   stdinstdoutr    r*   r5   r`   keysitemsr,   r-   open_osfhandler   O_RDONLYopenreadlinestripdecodesplitjoinrR   listrQ   r$   r%   RuntimeErrorr<   
excepthookexc_info)fdrd   fregistryre   rJ   ra   lineZsplittedr@   r!   rb   r   rc   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   )r[   r~   r   r   r   
<listcomp>f  s     z"spawnv_passfds.<locals>.<listcomp>ri   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+   r    Z	reductionr   r   ry   r1   ZCreateProcessr2   r<   )pathrA   Zpassfdserrpipe_readerrpipe_writer   Z_passr@   _ZhtrB   r   r   r   r;   _  s6    

        r;   )r   )%r   shutilr'   r7   r$   r   _multiprocessingr   multiprocessingr   rD   r   r,   r1   r-   Zmultiprocessing.reductionr   __all__hasattrr6   rk   rm   r9   rmtreeunlinkr`   r!   r0   r   Z_resource_trackerr   r	   rM   r
   r   r.   r;   r   r   r   r   <module>.   s>   



y
 