a
    Šxd  ã                   @   s®   d dl mZ d dlZ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 ddl
mZ ddlmZ g d¢Z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 )é    )Úabsolute_importNé   )Ú	_billiard)Úspawn)Úutil)Úspawnv_passfds)Úensure_runningÚregisterÚ
unregisterc                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚSemaphoreTrackerc                 C   s   t  ¡ | _d | _d S ©N)Ú	threadingÚLockÚ_lockÚ_fd©Úself© r   úR/var/www/html/Ranjet/env/lib/python3.9/site-packages/billiard/semaphore_tracker.pyÚ__init__!   s    
zSemaphoreTracker.__init__c                 C   s   |   ¡  | jS r   )r   r   r   r   r   r   Úgetfd%   s    zSemaphoreTracker.getfdc              
   C   sü   | j â | jdur"W d  ƒ dS g }z| tj ¡ ¡ W n tyL   Y n0 d}t ¡ \}}znz@| |¡ t	 
¡ }|gt ¡  }|d|| g7 }t|||ƒ W n   t |¡ ‚ Y n0 || _W t |¡ nt |¡ 0 W d  ƒ n1 sî0    Y  dS )z®Make sure that semaphore tracker process is running.

        This can be run from any process.  Usually a child process will use
        the semaphore created by its parent.Nz4from billiard.semaphore_tracker import main;main(%d)z-c)r   r   ÚappendÚsysÚstderrÚfilenoÚ	ExceptionÚosÚpiper   Úget_executabler   Ú_args_from_interpreter_flagsr   Úclose)r   Zfds_to_passÚcmdÚrÚwZexeÚargsr   r   r   r   )   s*    


zSemaphoreTracker.ensure_runningc                 C   s   |   d|¡ dS )z2Register name of semaphore with semaphore tracker.ZREGISTERN©Ú_send©r   Únamer   r   r   r	   G   s    zSemaphoreTracker.registerc                 C   s   |   d|¡ dS )z4Unregister name of semaphore with semaphore tracker.Z
UNREGISTERNr%   r'   r   r   r   r
   K   s    zSemaphoreTracker.unregisterc                 C   sP   |   ¡  d ||¡ d¡}t|ƒdkr.tdƒ‚t | j|¡}|t|ƒksLJ ‚d S )Nz{0}:{1}
Úasciii   zname too long)r   ÚformatÚencodeÚlenÚ
ValueErrorr   Úwriter   )r   r!   r(   ÚmsgÚnbytesr   r   r   r&   O   s    zSemaphoreTracker._sendN)	Ú__name__Ú
__module__Ú__qualname__r   r   r   r	   r
   r&   r   r   r   r   r      s   r   c                 C   sL  t   t jt j¡ t   t jt j¡ tjtjfD ]$}z| ¡  W q, tyN   Y q,0 q,t	ƒ }zRt
 | d¡˜}|D ]‚}zJ| ¡  d¡\}}|dkrš| |¡ n |dkr®| |¡ ntd| ƒ‚W qn tyî   ztjt ¡ Ž  W n   Y n0 Y qn0 qnW d  ƒ n1 s0    Y  W |rFzt dt|ƒ ¡ W n tyD   Y n0 |D ]`}zV| d¡}zt |¡ W n8 ty  } zt d	||f ¡ W Y d}~n
d}~0 0 W n0 qJnš|ràzt dt|ƒ ¡ W n tyÞ   Y n0 |D ]`}zV| d¡}zt |¡ W n8 ty: } zt d	||f ¡ W Y d}~n
d}~0 0 W n0 qä0 dS )
zRun semaphore tracker.Úrbó   :s   REGISTERs
   UNREGISTERzunrecognized command %rNzRsemaphore_tracker: There appear to be %d leaked semaphores to clean up at shutdownr)   zsemaphore_tracker: %r: %s)ÚsignalÚSIGINTÚSIG_IGNÚSIGTERMr   ÚstdinÚstdoutr    r   ÚsetÚioÚopenÚstripÚsplitÚaddÚremoveÚRuntimeErrorÚ
excepthookÚexc_infoÚwarningsÚwarnr,   Údecoder   Z
sem_unlink)ÚfdÚfÚcacheÚliner!   r(   Úer   r   r   Úmaina   sj    0þ

*
îþ

*rN   )Ú
__future__r   r=   r   r6   r   r   rF   Z_extr   Ú r   r   Úcompatr   Ú__all__Úobjectr   Z_semaphore_trackerr   r	   r
   r   rN   r   r   r   r   Ú<module>   s$   ;