o
    r¨Êh  ã                   @   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	   úK/var/www/html/env/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    