o
    éT•j#  ã                   @   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r�t tjt¡ t |||¡}W tr’t tjt¡ ntr�t tjt¡ w w W n	   t |¡ ‚ || _|| _W t |¡ nt |¡ w W d  ƒ dS 1 sÇw   Y  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   Ú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 ƒ}zÈt| dƒ�j}|D ]_}zF| ¡  d¡ d¡\}}}t |d¡}|du rgtd|› d|› �ƒ‚|d	krs||  |¡ n|d
kr||  |¡ n|dkr„ntd| ƒ‚W qC ty¢   z	tjt ¡ Ž  W n   Y Y qCw W d  ƒ n1 s­w   Y  W | ¡ D ]I\}}|rÔz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 qÖw q·d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