o
    f#                     @   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_sigmasknoopc                   C   s   d S N r   r   r   7/usr/lib/python3.10/multiprocessing/resource_tracker.py<lambda>!   s    r   posix
sem_unlink	semaphore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   get_executabler   _args_from_interpreter_flags_HAVE_SIGMASKsignalr   	SIG_BLOCK_IGNORED_SIGNALSspawnv_passfdsSIG_UNBLOCK)r   fds_to_passcmdrw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   r;   )z2Unregister name of resource with resource tracker.
UNREGISTERNr=   r?   r   r   r   r      rB   zResourceTracker.unregisterc                 C   sb   |    d|||d}t|dkrtdt| j|}|t|ks/J d|t|d S )Nz{0}:{1}:{2}
asciii   zmsg too longznbytes {0:n} but len(msg) {1:n})r   formatencodelen
ValueErrorr   r9   r   )r   r3   r@   rA   msgnbytesr   r   r   r>      s   
zResourceTracker._sendN)__name__
__module____qualname__r   r   r   r   r    r   r   r>   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).0rA   r   r   r   
<dictcomp>   s    zmain.<locals>.<dictcomp>rbrD   :NzCannot register z. for automatic cleanup: unknown resource type r<   rC   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   r1   r/   r%   stdinstdoutr   r(   _CLEANUP_FUNCSkeysopenstripdecodesplitgetrH   addremoveRuntimeError
excepthookexc_infoitemsr"   r#   rG   )
fdfcacheliner3   r@   rA   cleanup_funcrtype_cacheer   r   r   main   s   



rm   )r   r-   r%   r   r"    r   r   __all__hasattrr,   rT   rV   r/   rY   r@   _multiprocessing_posixshmemupdater   
shm_unlinkobjectr   _resource_trackerr   r   r   r   rm   r   r   r   r   <module>   s:   


w