
    Rh                         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e      Zne
d
gz  Z
 G d d
e      Z G d de      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      6/usr/lib/python3.12/multiprocessing/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>.send1   s    %%dFC8r   c                  0    t        j                          y r   )osr   )r/   s   r   r   zDupFd.__init__.<locals>.close3   s     r   )r1   r   r   r   r   )r   fdr   r   r/   s       @r   r   zDupFd.__init__/   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.detach7   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 | _        t        j                         | _        d | _        d | _        d | _        t        j                  | t        j                         y )Nr   )_key_cache	threadingLock_lock	_listener_address_threadr   register_after_forkr6   
_afterfork)r   s    r   r   z_ResourceSharer.__init__?   sI    	^^%
  '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.registerH   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)
connectionrF   r   current_processrH   r   r1   getpid)identrF   addresskeycs        r   r   z_ResourceSharer.get_connectionQ   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   rE   NrG   z._ResourceSharer thread did not stop when asked)rI   rF   r<   r>   r   rJ   rH   r   r   r?   joinis_aliver   sub_warningr=   r9   itemsclear)r   timeoutrF   rO   rN   r   r   s          r   r   z_ResourceSharer.stopZ   s    &ZZ 	$}}(4==#*#:#:#<#D#DFt	!!'*<<((*$$ &; <$$&# $!%*.++*;*;*= &C$G!!#!	$ 	$ 	$s   DD::Ec                 :   | j                   j                         D ]  \  }\  }} |         | j                   j                          | j                  j	                          | j
                  | j
                  j                          d | _        d | _        d | _        y r   )	r9   rT   rU   r<   _at_fork_reinitr=   r   r>   r?   )r   rN   r   r   s       r   rA   z_ResourceSharer._afterforko   s{    "&++"3"3"5 	C$G	

""$>>%NN  "r   c                 h   ddl m} | j                  J d       t        j                  d        |t        j                         j                  d      | _        | j                  j                  | _	        t        j                  | j                        }d|_        |j                          || _        y )	Nr   )ListenerzAlready have Listenerz0starting listener and thread for sending handles   )rH   backlog)targetT)rI   rZ   r=   r   debugr   rJ   rH   rM   r>   r:   Thread_servedaemonstartr?   )r   rZ   ts      r   rC   z_ResourceSharer._startz   s    (~~%>'>>%

EF!'*A*A*C*K*KUXY..DKK0		r   c                 *   t        t        d      r6t        j                  t        j                  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_sigmask)hasattrsignalre   	SIG_BLOCKvalid_signalsr=   acceptrecvr9   popr   
is_exitingsys
excepthookexc_info)r   r   msgrN   destination_pidr   r   s          r   r`   z_ResourceSharer._serve   s    6,-""6#3#3V5I5I5KL4^^**, 	 ))+C{	  	  ,/(C"&++//#"6KD% T?3	   	  	 4(NNCLLN3sH   	C #C
7C  #C
$	B>-C
5C >	CC

CC :Dr   )r%   r&   r'   r(   r   r   staticmethodr   r   rA   rC   r`   r)   r   r   r6   r6   =   s8    8C.  $*		4r   r6   )r1   rg   r!   rn   r:    r   contextr   r   __all__platformobjectr	   r*   r6   r   r   r)   r   r   <module>ry      s    
   
    ( <<7}G/F /  yG3 3 Y4f Y4x #$ r   