a
    e!                     @   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 g dZe	edZ
ejejfZddd	 iZe jd
krd 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
   1lib/python3.9/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   sj   | j P | jd u r"W d    d S t| j d | _t| jd d | _W d    n1 s\0    Y  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   s  | j  | jdur~|  r,W d   dS t| j z| jdurRt| jd W n tyf   Y n0 d| _d| _t	d g }z|
tj  W n ty   Y n0 d}t \}}zz|
| t }|gt  }|d|| g7 }z:trttjt t|||}W tr@ttjt ntr>ttjt 0 W n   t|  Y n0 || _|| _W t| nt| 0 W d   n1 s0    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   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_BLOCK_IGNORED_SIGNALSZspawnv_passfdsSIG_UNBLOCK)r   Zfds_to_passcmdrwZexeargspidr
   r
   r   r   F   sN    





zResourceTracker.ensure_runningc                 C   s0   zt | jd W n ty&   Y dS 0 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^J 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   )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y`   Y q>0 q>dd t D }zt| d}|D ]}z| dd\}}}t|d}|du rtd| d| |d	kr|| | n2|d
kr|| | n|dkrntd| W q tyR   ztjt   W n   Y n0 Y q0 qW d   n1 sl0    Y  W | D ]\}}|rztdt||f  W n ty   Y n0 |D ]X}zNzt| | W n8 ty }	 ztd||	f  W Y d}	~	n
d}	~	0 0 W n0 qqn| D ]\}}|rhztdt||f  W n tyf   Y n0 |D ]X}zNzt| | W n8 ty }	 ztd||	f  W Y d}	~	n
d}	~	0 0 W n0 qlq*0 dS )zRun resource tracker.c                 S   s   i | ]}|t  qS r
   )set).0r7   r
   r
   r   
<dictcomp>   r   zmain.<locals>.<dictcomp>rbr9   :NzCannot register z. for automatic cleanup: unknown resource type r2   r8   ZPROBEzunrecognized command %rzQresource_tracker: There appear to be %d leaked %s objects to clean up at shutdownzresource_tracker: %r: %s)r'   SIGINTSIG_IGNSIGTERMr&   r   r*   r)   r!   stdinstdoutr   r$   _CLEANUP_FUNCSkeysopenstripdecodesplitgetr=   addremoveRuntimeError
excepthookexc_infoitemsr   r   r<   )
fdfcacheliner+   r6   r7   Zcleanup_funcZrtype_cacheer
   r
   r   main   s    

0

*

*r_   )r   r'   r!   r   r    r   r   __all__hasattrr&   rH   rJ   r)   rM   r6   Z_multiprocessingZ_posixshmemupdateZ
sem_unlinkZ
shm_unlinkobjectr   Z_resource_trackerr   r   r   r   r_   r
   r
   r
   r   <module>   s2   

w