
    F\h                         S SK r S SKrS SKrS SKrS SKrSSKJr  SSKJr  SSKJ	r	  S/r
\R                  S:X  a  \
S/-  r
 " S	 S\5      rO\
S
/-  r
 " S S
\5      r " S S\5      r\" 5       r\R"                  rg)    N   )process)	reduction)utilstopwin32	DupSocketc                   $    \ rS rSrSrS rS rSrg)r	      zPicklable wrapper for a socket.c                 |   ^ UR                  5       mU4S jn[        R                  UTR                  5      U l        g )Nc                 J   > TR                  U5      nU R                  U5        g N)share
send_bytes)connpidr   new_socks      6/usr/lib/python3.13/multiprocessing/resource_sharer.pysend DupSocket.__init__.<locals>.send   s     s+&    )dup_resource_sharerregisterclose_id)selfsockr   r   s      @r   __init__DupSocket.__init__   s-    xxzH' (00x~~FDHr   c                     [         R                  U R                  5       nUR                  5       n[        R
                  " U5      sSSS5        $ ! , (       d  f       g= f)z1Get the socket.  This should only be called once.N)r   get_connectionr   
recv_bytessocket	fromshare)r   r   r   s      r   detachDupSocket.detach$   s<    !00:d)''. ;::s   &A
Ar   N__name__
__module____qualname____firstlineno____doc__r   r&   __static_attributes__ r   r   r	   r	      s    -	G	/r   DupFdc                   $    \ rS rSrSrS rS rSrg)r1   -   z-Wrapper for fd which can be used at any time.c                 ~   ^ [         R                  " U5      mU4S jnU4S jn[        R                  X#5      U l        g )Nc                 6   > [         R                  " U TU5        g r   )r   send_handle)r   r   new_fds     r   r   DupFd.__init__.<locals>.send1   s    %%dFC8r   c                  2   > [         R                  " T 5        g r   )osr   )r7   s   r   r   DupFd.__init__.<locals>.close3   s     r   )r:   r   r   r   r   )r   fdr   r   r7   s       @r   r   DupFd.__init__/   s,    VVBZF9!'00=DHr   c                     [         R                  U R                  5       n[        R                  " U5      sSSS5        $ ! , (       d  f       g= f)z-Get the fd.  This should only be called once.N)r   r"   r   r   recv_handle)r   r   s     r   r&   DupFd.detach7   s0    !00:d ,,T2 ;::s   A  
Ar(   Nr)   r0   r   r   r1   r1   -   s    ;	>	3r   c                   P    \ rS rSrSrS rS r\S 5       rSS jr	S r
S	 rS
 rSrg)_ResourceSharer=   z.Manager for resources using background thread.c                     SU l         0 U l        [        R                  " 5       U l        S U l        S U l        S U l        [        R                  " U [        R                  5        g )Nr   )_key_cache	threadingLock_lock	_listener_address_threadr   register_after_forkrB   
_afterfork)r   s    r   r   _ResourceSharer.__init__?   sI    	^^%
  'A'ABr   c                    U R                      U R                  c  U R                  5         U =R                  S-  sl        X4U R                  U R                  '   U R                  U R                  4sSSS5        $ ! , (       d  f       g= f)z+Register resource, returning an identifier.Nr   )rI   rK   _startrE   rF   )r   r   r   s      r   r   _ResourceSharer.registerH   sW    ZZ}}$IINI&*]DKK		"MM499- ZZs   A$A;;
B	c                     SSK Jn  U u  p#U" U[        R                  " 5       R                  S9nUR                  U[        R                  " 5       45        U$ )z<Return connection from which to receive identified resource.r   Clientauthkey)
connectionrU   r   current_processrW   r   r:   getpid)identrU   addresskeycs        r   r"   _ResourceSharer.get_connectionQ   sE     	'7G$;$;$=$E$EF	RYY[!"r   Nc                    SSK Jn  U R                     U R                  Gb  U" U R                  [        R
                  " 5       R                  S9nUR                  S5        UR                  5         U R                  R                  U5        U R                  R                  5       (       a  [        R                  " S5        U R                  R                  5         SU l	        SU l        SU l        U R                  R!                  5        H  u  nu  pVU" 5         M     U R                  R#                  5         SSS5        g! , (       d  f       g= f)z:Stop the background thread and clear registered resources.r   rT   NrV   z._ResourceSharer thread did not stop when asked)rX   rU   rI   rK   r   rY   rW   r   r   rL   joinis_aliver   sub_warningrJ   rF   itemsclear)r   timeoutrU   r^   r]   r   r   s          r   r   _ResourceSharer.stopZ   s    &ZZ}}(4==#*#:#:#<#D#DFt	!!'*<<((**$$ &; <$$&# $!%*.++*;*;*=&C$G +>!!#! ZZs   D$E  
Ec                 >   U R                   R                  5        H  u  nu  p#U" 5         M     U R                   R                  5         U R                  R	                  5         U R
                  b  U R
                  R                  5         S U l        S U l        S U l        g r   )	rF   rd   re   rI   _at_fork_reinitrJ   r   rK   rL   )r   r]   r   r   s       r   rN   _ResourceSharer._afterforko   st    "&++"3"3"5C$G #6

""$>>%NN  "r   c                 b   SSK Jn  U R                  b   S5       e[        R                  " S5        U" [
        R                  " 5       R                  SS9U l        U R                  R                  U l	        [        R                  " U R                  S9nSUl        UR                  5         X l        g )	Nr   )ListenerzAlready have Listenerz0starting listener and thread for sending handles   )rW   backlog)targetT)rX   rl   rJ   r   debugr   rY   rW   r\   rK   rG   Thread_servedaemonstartrL   )r   rl   ts      r   rQ   _ResourceSharer._startz   s    (~~%>'>>%

EF!'*A*A*C*K*KUXY..DKK0		r   c                 P   [        [        S5      (       a8  [        R                  " [        R                  [        R                  " 5       5          U R
                  R                  5        nUR                  5       nUc
   S S S 5        g Uu  p4U R                  R                  U5      u  pV U" X5        U" 5          S S S 5        Mu  ! U" 5         f = f! , (       d  f       N= f!   [        R                  " 5       (       d&  [        R                  " [        R                  " 5       6    Nc= f)Npthread_sigmask)hasattrsignalrx   	SIG_BLOCKvalid_signalsrJ   acceptrecvrF   popr   
is_exitingsys
excepthookexc_info)r   r   msgr]   destination_pidr   r   s          r   rr   _ResourceSharer._serve   s    6,--""6#3#3V5I5I5KL4^^**,))+C{ -, ,/(C"&++//#"6KD T3 -   -,4((NNCLLN3sO   C! *C?C! !C*C2C:C! 	CC
CC! C! !AD%)rK   rF   rE   rJ   rI   rL   r   )r*   r+   r,   r-   r.   r   r   staticmethodr"   r   rN   rQ   rr   r/   r0   r   r   rB   rB   =   s8    8C.  $*		4r   rB   )r:   rz   r$   r   rG    r   contextr   r   __all__platformobjectr	   r1   rB   r   r   r0   r   r   <module>r      s    
   
    ( <<7}G/F /  yG3 3 Y4f Y4x #$ r   