a
    åIþ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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
   ú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 ¡ \}}zºz†| 
|¡ 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 s˜0    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   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 ƒ}z¨t| dƒà}|D ]Ê}z| ¡  d¡ d¡\}}}t |d¡}|du rÒt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 qŠ0 qŠW d  ƒ n1 sl0    Y  W | ¡ D ]ž\}}|r¾z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Âq€nª| ¡ 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