o
    svXj  ã                   @   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   úW/var/www/html/myproject/venv/lib/python3.10/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 �p | jdur	 W d  ƒ dS g }z
| tj ¡ ¡ W n	 ty'   Y nw d}t ¡ \}}z4z | |¡ t	 
¡ }|gt ¡  }|d|| g7 }t|||ƒ W n	   t |¡ ‚ || _W t |¡ nt |¡ w W d  ƒ dS 1 svw   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   Úfds_to_passÚcmdÚrÚwÚexeÚargsr   r   r   r   )   s0   
þÿ

"ézSemaphoreTracker.ensure_runningc                 C   ó   |   d|¡ dS )z2Register name of semaphore with semaphore tracker.ÚREGISTERN©Ú_send©r   Únamer   r   r   r	   G   ó   zSemaphoreTracker.registerc                 C   r'   )z4Unregister name of semaphore with semaphore tracker.Ú
UNREGISTERNr)   r+   r   r   r   r
   K   r-   zSemaphoreTracker.unregisterc                 C   sP   |   ¡  d ||¡ d¡}t|ƒdkrtdƒ‚t | j|¡}|t|ƒks&J ‚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   s,  t   t jt j¡ t   t jt j¡ tjtjfD ]}z| ¡  W q ty'   Y qw t	ƒ }z¡t
 | d¡�I}|D ]>}z%| ¡  d¡\}}|dkrK| |¡ n|dkrU| |¡ ntd| ƒ‚W q5 tys   z	tjt ¡ Ž  W n   Y Y q5w W d  ƒ n1 s~w   Y  W |r›zt dt|ƒ ¡ W n	 tyš   Y nw |D ]-}z*| d¡}zt |¡ W n tyÇ } zt d	||f ¡ W Y d}~nd}~ww W q�w dS |räzt dt|ƒ ¡ W n	 tyã   Y nw |D ].}z+| d¡}zt |¡ W n t�y } zt d	||f ¡ W Y d}~nd}~ww W qæw w )
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Úwarnr2   Údecoder   Ú
sem_unlink)ÚfdÚfÚcacheÚliner"   r,   Úer   r   r   Úmaina   sŒ   ÿ€€ü÷ÿ€
þÿ
€ÿ€õù
þÿ
€ÿ€õrU   )Ú
__future__r   rC   r   r<   r   r   rL   Ú_extr   Ú r   r   Úcompatr   Ú__all__Úobjectr   Ú_semaphore_trackerr   r	   r
   r   rU   r   r   r   r   Ú<module>   s&   ;