Ë
    òT•j  ã                   óö   — 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-   ø€ Ø—x‘x“zˆHô'ô (×0Ñ0°°x·~±~ÓFˆD�Hr   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   ø€ Ü×%Ñ% d¨F°CÕ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.   ø€ Ü—V‘V˜B“ZˆFô9ô!ä'×0Ñ0°°uÓ=ˆD�Hr   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°·±Ó:ð 3¸dÜ ×,Ñ,¨TÓ2÷3÷ 3ò 3ús	    ?¿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   € à�Z‰Zñ 	.Ø�}‰}Ð$Ø—‘”Ø�IŠI˜‰N�IØ&*¨E ]ˆD�K‰K˜Ÿ	™	Ñ"Ø—M‘M 4§9¡9Ð-÷	.÷ 	.ò 	.ú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   € õ 	'Ø‰ˆ�Ù�7¤G×$;Ñ$;Ó$=×$EÑ$EÔFˆØ	�‰�”R—Y‘Y“[Ð!Ô"Øˆ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ö   € å&Ø�Z‰Zñ 	$Ø�}‰}Ñ(Ù˜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ð	à�‰×ÑÔØ�
‰
×"Ñ"Ô$Ø�>‰>Ð%Ø�N‰N× Ñ Ô"ØˆŒØˆŒØˆ�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Ñ*KÐUXÔYˆŒØŸ™×.Ñ.ˆŒÜ×Ñ D§K¡KÔ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Ñ#3´V×5IÑ5IÓ5KÔLØð4Ø—^‘^×*Ñ*Ó,ð 	 °ØŸ)™)›+�CØ�{Ø÷	 ð 	 ð ,/Ñ(�C˜Ø"&§+¡+§/¡/°#Ó"6‘K�D˜%ð Ù˜T ?Ô3á�÷	 ð øñ �ú÷	 ð 	 ûð4Ü—‘Ô(Ü—N‘N¤C§L¡L£NÑ3üsH   Á	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4�fô Y4ñx #Ó$Ð Ø×Ñ�r   