a
    ze                     @   s   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rxe
dg7 Z
G d	d deZne
d
g7 Z
G dd
 d
eZG dd deZe ZejZdS )    N   )process)	reduction)utilstopwin32	DupSocketc                   @   s   e Zd Zdd Zdd ZdS )r   c                    s(   |    fdd}t| j| _d S )Nc                    s     |}| | d S N)share
send_bytes)connpidr
   Znew_sock 5/usr/lib/python3.9/multiprocessing/resource_sharer.pysend   s    
z DupSocket.__init__.<locals>.send)dup_resource_sharerregisterclose_id)selfsockr   r   r   r   __init__   s    zDupSocket.__init__c                 C   sB   t | j"}| }t|W  d    S 1 s40    Y  d S r	   )r   get_connectionr   
recv_bytessocketZ	fromshare)r   r   r
   r   r   r   detach$   s    zDupSocket.detachN__name__
__module____qualname__r   r   r   r   r   r   r      s   DupFdc                   @   s   e Zd Zdd Zdd ZdS )r"   c                    s4   t |  fdd} fdd}t||| _d S )Nc                    s   t |  | d S r	   )r   send_handle)r   r   Znew_fdr   r   r   1   s    zDupFd.__init__.<locals>.sendc                      s   t   d S r	   )osr   r   r$   r   r   r   3   s    zDupFd.__init__.<locals>.close)r%   r   r   r   r   )r   fdr   r   r   r$   r   r   /   s    
zDupFd.__init__c                 C   s:   t | j}t|W  d    S 1 s,0    Y  d S r	   )r   r   r   r   recv_handle)r   r   r   r   r   r   7   s    zDupFd.detachNr   r   r   r   r   r"   -   s   c                   @   sJ   e Zd Zdd Zdd Zedd Zddd	Zd
d Zdd Z	dd Z
dS )_ResourceSharerc                 C   s:   d| _ i | _t | _d | _d | _d | _t	| t
j d S )Nr   )_key_cache	threadingLock_lock	_listener_address_threadr   register_after_forkr(   
_afterfork)r   r   r   r   r   ?   s    
z_ResourceSharer.__init__c                 C   sf   | j L | jd u r|   |  jd7  _||f| j| j< | j| jfW  d    S 1 sX0    Y  d S )Nr   )r-   r/   _startr)   r*   )r   r   r   r   r   r   r   H   s    
z_ResourceSharer.registerc                 C   s<   ddl m} | \}}||t jd}||t f |S )Nr   Clientauthkey)
connectionr5   r   current_processr7   r   r%   getpid)identr5   addresskeycr   r   r   r   Q   s
    z_ResourceSharer.get_connectionNc                 C   s   ddl m} | j | jd ur|| jt jd}|d  |  | j	
| | j	 rdtd | j  d | _	d | _d | _| j D ]\}\}}|  q| j  W d    n1 s0    Y  d S )Nr   r4   r6   z._ResourceSharer thread did not stop when asked)r8   r5   r-   r/   r   r9   r7   r   r   r0   joinis_aliver   sub_warningr.   r*   itemsclear)r   timeoutr5   r>   r=   r   r   r   r   r   r   Z   s$    




z_ResourceSharer.stopc                 C   s\   | j  D ]\}\}}|  q
| j   | j  | jd urF| j  d | _d | _d | _d S r	   )	r*   rB   rC   r-   _at_fork_reinitr.   r   r/   r0   )r   r=   r   r   r   r   r   r2   o   s    



z_ResourceSharer._afterforkc                 C   sX   ddl m} td |t jd| _| jj| _	t
j| jd}d|_|  || _d S )Nr   )Listenerz0starting listener and thread for sending handlesr6   )targetT)r8   rF   r   debugr   r9   r7   r.   r<   r/   r+   Thread_servedaemonstartr0   )r   rF   tr   r   r   r3   z   s    

z_ResourceSharer._startc                 C   s   t tdrttjt  z| j f}| }|d u rJW d    W q|\}}| j	|\}}z||| W |  n|  0 W d    n1 s0    Y  W q   t
 stjt   Y q0 qd S )Npthread_sigmask)hasattrsignalrN   	SIG_BLOCKvalid_signalsr.   acceptrecvr*   popr   
is_exitingsys
excepthookexc_info)r   r   msgr=   destination_pidr   r   r   r   r   rJ      s    
2z_ResourceSharer._serve)N)r   r    r!   r   r   staticmethodr   r   r2   r3   rJ   r   r   r   r   r(   =   s   		

r(   )r%   rP   r   rW   r+    r   contextr   r   __all__platformobjectr   r"   r(   r   r   r   r   r   r   <module>   s    


\