
    kc                     H    d dl Z  G d d      Z G d d      Z G d d      Zy)    Nc                   (    e Zd ZdZd Zd Zd Zd Zy)Proxyz` Class for wrapping a shared resource object and getting
        notified when it's deleted
    c                 @    || _         |j                  dd       | _        y )N	on_delete)objectgetr   )selfr   kwargss      ;/usr/lib/python3/dist-packages/supervisor/socket_manager.py__init__zProxy.__init__   s    K6    c                 >    | j                   r| j                          y y Nr   r	   s    r   __del__zProxy.__del__   s    >>NN r   c                 .    t        | j                  |      S r   )getattrr   )r	   names     r   __getattr__zProxy.__getattr__   s    t{{D))r   c                     | j                   S r   )r   r   s    r   _getz
Proxy._get   s    {{r   N)__name__
__module____qualname____doc__r   r   r   r    r   r   r   r      s    7*r   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)ReferenceCounterz8 Class for tracking references to a shared resource
    c                 :    |d   | _         |d   | _        d| _        y )Non_non_zeroon_zeror   )r!   r"   	ref_count)r	   r
   s     r   r   zReferenceCounter.__init__   s"    !-0i(r   c                     | j                   S r   )r#   r   s    r   	get_countzReferenceCounter.get_count   s    ~~r   c                 l    | j                   dk(  r| j                          | xj                   dz  c_         y )Nr      )r#   r!   r   s    r   	incrementzReferenceCounter.increment"   s(    >>Q!r   c                     | j                   dk  rt        d      | xj                   dz  c_         | j                   dk(  r| j                          y y )Nr   z.Illegal operation: cannot decrement below zeror'   )r#   	Exceptionr"   r   s    r   	decrementzReferenceCounter.decrement'   sB    >>QLMM!>>QLLN r   N)r   r   r   r   r   r%   r(   r+   r   r   r   r   r      s    

r   r   c                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)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                     |j                  dd       | _        d | _        d| _        || _        t        | j                  | j                        | _        y )NloggerF)r"   r!   )	r   r/   socketpreparedsocket_configr   _close_prepare_socketref_ctr)r	   r2   r
   s      r   r   zSocketManager.__init__5   sE    jj40*'KKT-A-Ar   c                 h    d| j                   dt        |       d| j                  j                  dS )N<z at z for >)	__class__idr2   urlr   s    r   __repr__zSocketManager.__repr__>   s)    &*nn&(h&*&8&8&<&<> 	>r   c                     | j                   S r   )r2   r   s    r   configzSocketManager.configC   s    !!!r   c                     | j                   S r   )r1   r   s    r   is_preparedzSocketManager.is_preparedF   s    }}r   c                     | j                   j                          | j                          t        | j                  | j                   j
                        S )Nr   )r5   r(   _require_preparedr   r0   r+   r   s    r   
get_socketzSocketManager.get_socketI   s9      T[[DLL,B,BCCr   c                 V    | j                          | j                  j                         S r   )rB   r5   r%   r   s    r   get_socket_ref_countz"SocketManager.get_socket_ref_countN   s!     ||%%''r   c                 2    | j                   st        d      y )NzSocket has not been prepared)r1   r*   r   s    r   rB   zSocketManager._require_preparedR   s    }}:;; r   c                    | j                   s| j                  r(| j                  j                  d| j                  z         | j                  j	                         | _        | j                  j                         r4| j
                  j                  | j                  j                                n)| j
                  j                  t
        j                         d| _         y y )NzCreating socket %sT)	r1   r/   infor2   create_and_bindr0   get_backloglisten	SOMAXCONNr   s    r   r4   zSocketManager._prepare_socketV   s    }}{{  !58J8J!JK,,<<>DK!!--/""4#5#5#A#A#CD""6#3#34 DM r   c                     | j                          | j                  r(| j                  j                  d| j                  z         | j                  j                          d| _        y )NzClosing socket %sF)rB   r/   rH   r2   r0   closer1   r   s    r   r3   zSocketManager._closea   sJ     ;;KK043E3EEFr   N)r   r   r   r   r   r<   r>   r@   rC   rE   rB   r4   r3   r   r   r   r-   r-   .   s5    >
"D
(<	!r   r-   )r0   r   r   r-   r   r   r   <module>rO      s&     & 08 8r   