o
    Df                     @   s   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	Ze ZejZejZejZejZd
d ZdS )    N   )	_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   S/home/ubuntu/webapp/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 )zMake 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   F      zSemaphoreTracker.registerc                 C   r&   )z4Unregister name of semaphore with semaphore tracker.
UNREGISTERNr(   r*   r   r   r   r	   J   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)   N   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	 }zt
| 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 |rz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 qw dS |rz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 qw 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warnr1   decoder   
sem_unlink)fdfcacheliner!   r+   er   r   r   main`   s   



rT   )rB   r   r;   r   r   rK   _extr    r   r   compatr   __all__r
   _semaphore_trackerr   r   r	   r   rT   r   r   r   r   <module>   s$   ;