o
    f                     @   s6   d dl Z G dd dZG dd dZG dd dZdS )    Nc                   @   0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )Proxyz` Class for wrapping a shared resource object and getting
        notified when it's deleted
    c                 K   s   || _ |dd | _d S )N	on_delete)objectgetr   )selfr   kwargs r	   L/var/www/html/venv/lib/python3.10/site-packages/supervisor/socket_manager.py__init__   s   zProxy.__init__c                 C   s   | j r	|    d S d S Nr   r   r	   r	   r
   __del__   s   zProxy.__del__c                 C   s   t | j|S r   )getattrr   )r   namer	   r	   r
   __getattr__   s   zProxy.__getattr__c                 C      | j S r   )r   r   r	   r	   r
   _get      z
Proxy._getN)__name__
__module____qualname____doc__r   r   r   r   r	   r	   r	   r
   r      s    r   c                   @   r   )ReferenceCounterz8 Class for tracking references to a shared resource
    c                 K   s   |d | _ |d | _d| _d S )Non_non_zeroon_zeror   )r   r   	ref_count)r   r   r	   r	   r
   r      s   


zReferenceCounter.__init__c                 C   r   r   )r   r   r	   r	   r
   	get_count   r   zReferenceCounter.get_countc                 C   s$   | j dkr	|   |  j d7  _ d S )Nr      )r   r   r   r	   r	   r
   	increment"      
zReferenceCounter.incrementc                 C   s:   | j dkr	td|  j d8  _ | j dkr|   d S d S )Nr   z.Illegal operation: cannot decrement below zeror   )r   	Exceptionr   r   r	   r	   r
   	decrement'   s   

zReferenceCounter.decrementN)r   r   r   r   r   r   r    r#   r	   r	   r	   r
   r      s    r   c                   @   sX   e Zd 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d ZdS )SocketManagera   Class for managing sockets in servers that create/bind/listen
        before forking multiple child processes to accept()
        Sockets are managed at the process group level and referenced counted
        at the process level b/c that's really the only place to hook in
    c                 K   s6   | dd | _d | _d| _|| _t| j| jd| _d S )NloggerF)r   r   )	r   r%   socketpreparedsocket_configr   _close_prepare_socketref_ctr)r   r(   r   r	   r	   r
   r   5   s   zSocketManager.__init__c                 C   s   d| j t| | jjf S )Nz<%s at %s for %s>)	__class__idr(   urlr   r	   r	   r
   __repr__>   s   zSocketManager.__repr__c                 C   r   r   )r(   r   r	   r	   r
   configC   r   zSocketManager.configc                 C   r   r   )r'   r   r	   r	   r
   is_preparedF   r   zSocketManager.is_preparedc                 C   s$   | j   |   t| j| j jdS )Nr   )r+   r    _require_preparedr   r&   r#   r   r	   r	   r
   
get_socketI   r!   zSocketManager.get_socketc                 C   s   |    | j S r   )r2   r+   r   r   r	   r	   r
   get_socket_ref_countN   s   
z"SocketManager.get_socket_ref_countc                 C   s   | j stdd S )NzSocket has not been prepared)r'   r"   r   r	   r	   r
   r2   R   s   zSocketManager._require_preparedc                 C   sd   | j s0| jr| jd| j  | j | _| j r$| j| j  n| jtj d| _ d S d S )NzCreating socket %sT)	r'   r%   infor(   create_and_bindr&   get_backloglisten	SOMAXCONNr   r	   r	   r
   r*   V   s   

zSocketManager._prepare_socketc                 C   s4   |    | jr| jd| j  | j  d| _d S )NzClosing socket %sF)r2   r%   r5   r(   r&   closer'   r   r	   r	   r
   r)   a   s
   

zSocketManager._closeN)r   r   r   r   r   r/   r0   r1   r3   r4   r2   r*   r)   r	   r	   r	   r
   r$   .   s    	r$   )r&   r   r   r$   r	   r	   r	   r
   <module>   s    