U
    ›‰`¥!  ã                   @   sÔ   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dgZe	edƒZ
ejejfZd	d
d„ iZe jdkršd dlZd dlZe ejejdœ¡ G dd„ deƒZeƒ ZejZejZejZejZdd„ ZdS )é    Né   )Úspawn)ÚutilÚensure_runningÚregisterÚ
unregisterÚpthread_sigmaskZnoopc                   C   s   d S ©N© r
   r
   r
   ú6/usr/lib/python3.8/multiprocessing/resource_tracker.pyÚ<lambda>!   ó    r   Úposix)Z	semaphoreZshared_memoryc                   @   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 r	   )Ú	threadingZLockÚ_lockÚ_fdÚ_pid©Úselfr
   r
   r   Ú__init__0   s    
zResourceTracker.__init__c              	   C   sT   | j D | jd kr W 5 Q R £ d S t | j¡ d | _t | jd¡ d | _W 5 Q R X d S )Nr   )r   r   ÚosÚcloseÚwaitpidr   r   r
   r
   r   Ú_stop5   s    
zResourceTracker._stopc                 C   s   |   ¡  | jS r	   )r   r   r   r
   r
   r   ÚgetfdB   s    zResourceTracker.getfdc                 C   st  | j b | jdk	r~|  ¡ r*W 5 Q R £ dS t | j¡ z| jdk	rPt | 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 d}t ¡ \}}zœzr| 
|¡ t ¡ }|gt ¡  }|d|| g7 }z&trt tjt¡ t |||¡}W 5 tr,t tjt¡ X W n   t |¡ ‚ Y nX || _|| _W 5 t |¡ X W 5 Q R X 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   zUresource_tracker: process died unexpectedly, relaunching.  Some resources might leak.z:from multiprocessing.resource_tracker import main;main(%d)z-c)r   r   Ú_check_aliver   r   r   r   ÚChildProcessErrorÚwarningsÚwarnÚappendÚsysÚstderrÚfilenoÚ	ExceptionÚpiper   Zget_executabler   Z_args_from_interpreter_flagsÚ_HAVE_SIGMASKÚsignalr   ÚSIG_UNBLOCKÚ_IGNORED_SIGNALSÚ	SIG_BLOCKZspawnv_passfds)r   Zfds_to_passÚcmdÚrÚwZexeÚargsÚpidr
   r
   r   r   F   sJ    






zResourceTracker.ensure_runningc                 C   s2   zt  | jd¡ W n tk
r(   Y dS X dS dS )z;Check that the pipe has not been closed by sending a probe.s   PROBE:0:noop
FTN)r   Úwriter   ÚOSErrorr   r
   r
   r   r   †   s
    zResourceTracker._check_alivec                 C   s   |   d||¡ dS )z0Register name of resource with resource tracker.ÚREGISTERN©Ú_send©r   ÚnameÚrtyper
   r
   r   r   ‘   s    zResourceTracker.registerc                 C   s   |   d||¡ dS )z2Unregister name of resource with resource tracker.Ú
UNREGISTERNr3   r5   r
   r
   r   r   •   s    zResourceTracker.unregisterc                 C   sb   |   ¡  d |||¡ d¡}t|ƒdkr0tdƒ‚t | j|¡}|t|ƒks^td |t|ƒ¡ƒ‚d S )Nz{0}:{1}:{2}
Úasciii   zname too longznbytes {0:n} but len(msg) {1:n})	r   ÚformatÚencodeÚlenÚ
ValueErrorr   r0   r   ÚAssertionError)r   r+   r6   r7   ÚmsgÚnbytesr
   r
   r   r4   ™   s     ÿzResourceTracker._sendN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r4   r
   r
   r
   r   r   .   s   @r   c           
      C   s  t   t jt j¡ t   t jt j¡ tr2t  t jt¡ tj	tj
fD ]&}z| ¡  W q> tk
rb   Y q>X q>dd„ t ¡ D ƒ}zìt| dƒØ}|D ]Ì}z| ¡  d¡ d¡\}}}t |d¡}	|	dkrÒtd	|› d
|› ƒ‚|dkrê||  |¡ n2|dkr||  |¡ n|dkrntd| ƒ‚W qŠ tk
rT   ztjt ¡ Ž  W n   Y nX Y qŠX qŠW 5 Q R X W 5 | ¡ D ]ž\}}|r®zt dt|ƒ|f ¡ W n tk
r¬   Y nX |D ]V}zLzt| |ƒ W n6 tk
rþ } zt d||f ¡ W 5 d}~X Y nX W 5 X q²qnX dS )zRun resource tracker.c                 S   s   i | ]}|t ƒ “qS r
   )Úset)Ú.0r7   r
   r
   r   Ú
<dictcomp>¹   s      zmain.<locals>.<dictcomp>zQresource_tracker: There appear to be %d leaked %s objects to clean up at shutdownzresource_tracker: %r: %sNÚrbr9   ú:zCannot register z. for automatic cleanup: unknown resource type r2   r8   ZPROBEzunrecognized command %r)r'   ÚSIGINTÚSIG_IGNÚSIGTERMr&   r   r(   r)   r!   ÚstdinÚstdoutr   r$   Ú_CLEANUP_FUNCSÚkeysÚitemsr   r   r<   ÚopenÚstripÚdecodeÚsplitÚgetr=   ÚaddÚremoveÚRuntimeErrorÚ
excepthookÚexc_info)
ÚfdÚfÚcacher7   Zrtype_cacher6   ÚeÚliner+   Zcleanup_funcr
   r
   r   Úmain«   s^    ÿ


þ
(r`   )r   r'   r!   r   r   Ú r   r   Ú__all__Úhasattrr&   rI   rK   r)   rN   r6   Z_multiprocessingZ_posixshmemÚupdateZ
sem_unlinkZ
shm_unlinkÚobjectr   Z_resource_trackerr   r   r   r   r`   r
   r
   r
   r   Ú<module>   s4   

 ÿ
þw