o
    JAf#                     @   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rWd dlZd dlZe	edrOedeji edeji 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
   7/usr/lib/python3.10/multiprocessing/resource_tracker.py<lambda>!   s    r   posix
sem_unlink	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	   )	threadingLock_lock_fd_pidselfr
   r
   r   __init__8   s   

zResourceTracker.__init__c                 C   sn   | j * | jd u r	 W d    d S t| j d | _t| jd d | _W d    d S 1 s0w   Y  d S )Nr   )r   r   osclosewaitpidr   r   r
   r
   r   _stop=   s   
"zResourceTracker._stopc                 C   s   |    | jS r	   )r   r   r   r
   r
   r   getfdJ   s   zResourceTracker.getfdc                 C   s  | j  | jdur?|  r	 W d   dS t| j z| jdur)t| jd W n	 ty3   Y nw d| _d| _t	d g }z
|
tj  W n	 tyT   Y nw d}t \}}zXzA|
| t }|gt  }|d|| g7 }ztrttjt t|||}W trttjt ntrttjt w w W n	   t|  || _|| _W t| nt| w W d   dS 1 sw   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   _args_from_interpreter_flags_HAVE_SIGMASKsignalr   	SIG_BLOCK_IGNORED_SIGNALSspawnv_passfdsSIG_UNBLOCK)r   Zfds_to_passcmdrwZexeargspidr
   r
   r   r   N   s^   




"zResourceTracker.ensure_runningc                 C   s*   z
t | jd W dS  ty   Y dS w )z;Check that the pipe has not been closed by sending a probe.s   PROBE:0:noop
FT)r   writer   OSErrorr   r
   r
   r   r      s   zResourceTracker._check_alivec                 C      |  d|| dS )z0Register name of resource with resource tracker.REGISTERN_sendr   namertyper
   r
   r   r         zResourceTracker.registerc                 C   r6   )z2Unregister name of resource with resource tracker.
UNREGISTERNr8   r:   r
   r
   r   r      r=   zResourceTracker.unregisterc                 C   sB   |    d|||d}t|dkrtdt| j|}d S )Nz{0}:{1}:{2}
asciii   zmsg too long)r   formatencodelen
ValueErrorr   r4   r   )r   r/   r;   r<   msgnbytesr
   r
   r   r9      s
   zResourceTracker._sendN)__name__
__module____qualname__r   r   r   r   r   r   r   r9   r
   r
   r
   r   r   6   s    @r   c           
      C   s  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y0   Y qw dd t D }zt| dj}|D ]_}zF| dd\}}}t|d}|du rgtd| d| |d	krs|| | n|d
kr|| | n|dkrntd| W qC ty   z	tjt   W n   Y Y qCw W d   n1 sw   Y  W | D ]I\}}|rztdt||f  W n	 ty   Y nw |D ])}z&zt| | W n ty }	 ztd||	f  W Y d}	~	nd}	~	ww W qw qdS | D ]N\}}|r&ztdt||f  W n
 ty%   Y nw |D ]+}z(zt| | W n tyO }	 ztd||	f  W Y d}	~	nd}	~	ww W q(w qw )zRun resource tracker.c                 S   s   i | ]}|t  qS r
   )set).0r<   r
   r
   r   
<dictcomp>   s    zmain.<locals>.<dictcomp>rbr?   :NzCannot register z. for automatic cleanup: unknown resource type r7   r>   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getrC   addremoveRuntimeError
excepthookexc_infoitemsr    r!   rB   )
fdfcacheliner/   r;   r<   Zcleanup_funcZrtype_cacheer
   r
   r   main   s   



re   )r   r*   r#   r   r     r   r   __all__hasattrr)   rN   rP   r,   rS   r;   _multiprocessingZ_posixshmemupdater   Z
shm_unlinkobjectr   _resource_trackerr   r   r   r   re   r
   r
   r
   r   <module>   s:   


w