
    ⾙h                         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gZ	ej                  dk(  re	dgz  Z	 G d	 d      Zne	d
gz  Z	 G d d
      Z G d d      Z e       Zej                  Zy)    N   )process)	reduction)utilstopwin32	DupSocketc                       e Zd ZdZd Zd Zy)r	   zPicklable wrapper for a socket.c                 z    |j                         fd}t        j                  |j                        | _        y )Nc                 J    j                  |      }| j                  |       y N)share
send_bytes)connpidr   new_socks      T/var/www/Befach/backend/env/lib/python3.12/site-packages/billiard/resource_sharer.pysendz DupSocket.__init__.<locals>.send!   s     s+&    )dup_resource_sharerregisterclose_id)selfsockr   r   s      @r   __init__zDupSocket.__init__   s-    xxzH' (00x~~FDHr   c                     t         j                  | j                        5 }|j                         }t	        j
                  |      cddd       S # 1 sw Y   yxY w)z1Get the socket.  This should only be called once.N)r   get_connectionr   
recv_bytessocket	fromshare)r   r   r   s      r   detachzDupSocket.detach&   sE    !00: /d)''./ / /s   %AAN__name__
__module____qualname____doc__r   r#    r   r   r	   r	      s    -	G	/r   DupFdc                       e Zd ZdZd Zd Zy)r*   z-Wrapper for fd which can be used at any time.c                 z    t        j                  |      fd}fd}t        j                  ||      | _        y )Nc                 4    t        j                  | |       y r   )r   send_handle)r   r   new_fds     r   r   zDupFd.__init__.<locals>.send4   s    %%dFC8r   c                  0    t        j                          y r   )osr   )r/   s   r   r   zDupFd.__init__.<locals>.close7   s     r   )r1   r   r   r   r   )r   fdr   r   r/   s       @r   r   zDupFd.__init__1   s.    VVBZF9!'00u=DHr   c                     t         j                  | j                        5 }t        j                  |      cddd       S # 1 sw Y   yxY w)z-Get the fd.  This should only be called once.N)r   r   r   r   recv_handle)r   r   s     r   r#   zDupFd.detach;   s9    !00: 3d ,,T23 3 3s	   ?ANr$   r)   r   r   r*   r*   /   s    ;	>	3r   c                   F    e Zd ZdZd Zd Zed        Zd
dZd Z	d Z
d	 Zy)_ResourceSharerz.Manager for resources using background thread.c                     d| _         i | _        g | _        t        j                         | _        d | _        d | _        d | _        t        j                  | t        j                         y )Nr   )_key_cache
_old_locks	threadingLock_lock	_listener_address_threadr   register_after_forkr6   
_afterfork)r   s    r   r   z_ResourceSharer.__init__C   sP    	^^%
  'A'ABr   c                    | j                   5  | j                  | j                          | xj                  dz  c_        ||f| j                  | j                  <   | j                  | j                  fcddd       S # 1 sw Y   yxY w)z+Register resource, returning an identifier.Nr   )r=   r?   _startr8   r9   )r   r   r   s      r   r   z_ResourceSharer.registerM   sd    ZZ 	.}}$IINI&*E]DKK		"MM499-	. 	. 	.s   A$A;;Bc                     ddl m} | \  }} ||t        j                         j                        }|j                  |t        j                         f       |S )z<Return connection from which to receive identified resource.r   Clientauthkey)
connectionrG   r   current_processrI   r   r1   getpid)identrG   addresskeycs        r   r   z_ResourceSharer.get_connectionV   sG     	'7G$;$;$=$E$EF	RYY[!"r   Nc                    ddl m} | j                  5  | j                   || j                  t	        j
                         j                        }|j                  d       |j                          | j                  j                  |       | j                  j                         rt        j                  d       | j                  j                          d| _	        d| _        d| _        | j                  j!                         D ]  \  }\  }} |         | j                  j#                          ddd       y# 1 sw Y   yxY w)z:Stop the background thread and clear registered resources.r   rF   NrH   z._ResourceSharer thread did not stop when asked)rJ   rG   r=   r?   r   rK   rI   r   r   r@   joinis_aliver   sub_warningr>   r9   itemsclear)r   timeoutrG   rP   rO   r   r   s          r   r   z_ResourceSharer.stop_   s    &ZZ 	$}}(4==#*#:#:#<#D#DFt	!!'*<<((*$$ &; <$$&# $!%*.++*;*;*=&C$G +>!!#!	$ 	$ 	$s   DD::Ec                    | j                   j                         D ]  \  }\  }} |         | j                   j                          | j                  j	                  | j
                         t        j                         | _        | j                  | j                  j                          d | _        d | _
        d | _        y r   )r9   rU   rV   r:   appendr=   r;   r<   r>   r   r?   r@   )r   rO   r   r   s       r   rB   z_ResourceSharer._afterforkt   s    "&++"3"3"5C$G #6 	tzz*^^%
>>%NN  "r   c                 \   ddl m} | j                  J t        j                  d        |t        j                         j                        | _        | j                  j                  | _	        t        j                  | j                        }d|_        |j                          || _        y )Nr   )Listenerz0starting listener and thread for sending handlesrH   )targetT)rJ   r[   r>   r   debugr   rK   rI   rN   r?   r;   Thread_servedaemonstartr@   )r   r[   ts      r   rD   z_ResourceSharer._start   sy    (~~%%%

EF!'*A*A*C*K*KL..DKK0		r   c                 6   t        t        d      r<t        j                  t        j                  t	        dt        j
                               	 	 | j                  j                         5 }|j                         }|
	 d d d        y |\  }}| j                  j                  |      \  }}	  |||        |        	 d d d        v#  |        w xY w# 1 sw Y   xY w#  t        j                         s$t        j                  t        j                           Y UxY w)Npthread_sigmaskr   )hasattrsignalrd   	SIG_BLOCKrangeNSIGr>   acceptrecvr9   popr   
is_exitingsys
excepthookexc_info)r   r   msgrO   destination_pidr   r   s          r   r_   z_ResourceSharer._serve   s    6,-""6#3#3U1fkk5JK4^^**, 	 ))+C{	  	  ,/(C"&++//#"6KD% T?3	   	  	 4(NNCLLN3sH   C )C=C #C*	C3C;C 	CCCC :Dr   )r%   r&   r'   r(   r   r   staticmethodr   r   rB   rD   r_   r)   r   r   r6   r6   A   s8    8C.  $*	4r   r6   )r1   rf   r!   rn   r;    r   r   r   __all__platformr	   r*   r6   r   r   r)   r   r   <module>rw      s    
   
    ( <<7}G/ /$ yG3 3$]4 ]4@ #$ r   