B
    18\                 @   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Zdd Zdd ZdS )r   zPicklable wrapper for a socket.c                s(   |    fdd}t| j| _d S )Nc                s     |}| | d S )N)share
send_bytes)connpidr	   )new_sock c/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/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   s*   t | j}| }t|S Q R X dS )z1Get the socket.  This should only be called once.N)r   get_connectionr   
recv_bytessocketZ	fromshare)r   r   r	   r   r   r   detach$   s    zDupSocket.detachN)__name__
__module____qualname____doc__r   r   r   r   r   r   r      s   DupFdc               @   s    e Zd ZdZdd Zdd ZdS )r!   z-Wrapper for fd which can be used at any time.c                s4   t |  fdd} fdd}t||| _d S )Nc                s   t |  | d S )N)r   send_handle)r   r   )new_fdr   r   r   1   s    zDupFd.__init__.<locals>.sendc                  s   t   d S )N)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|S Q R X dS )z-Get the fd.  This should only be called once.N)r   r   r   r   recv_handle)r   r   r   r   r   r   7   s    zDupFd.detachN)r   r   r   r    r   r   r   r   r   r   r!   -   s   c               @   sN   e Zd 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 )_ResourceSharerz-Manager for resouces using background thread.c             C   s@   d| _ i | _g | _t | _d | _d | _d | _t	
| tj d S )Nr   )_key_cache
_old_locks	threadingLock_lock	_listener_address_threadr   register_after_forkr'   
_afterfork)r   r   r   r   r   ?   s    
z_ResourceSharer.__init__c          	   C   sN   | j > | jdkr|   |  jd7  _||f| j| j< | j| jfS Q R X dS )z+Register resource, returning an identifier.Nr   )r-   r/   _startr(   r)   )r   r   r   r   r   r   r   I   s    
z_ResourceSharer.registerc             C   s<   ddl m} | \}}||t jd}||t f |S )z<Return connection from which to receive identified resource.r   )Client)authkey)
connectionr4   r   current_processr5   r   r$   getpid)identr4   addresskeycr   r   r   r   R   s
    z_ResourceSharer.get_connectionNc          	   C   s   ddl m} | j | jdk	r|| jt jd}|d |  | j	
| | j	 rdtd | j  d| _	d| _d| _x | j D ]\}\}}|  qW | j  W dQ R X dS )z:Stop the background thread and clear registered resources.r   )r4   N)r5   z._ResourceSharer thread did not stop when asked)r6   r4   r-   r/   r   r7   r5   r   r   r0   joinis_aliver   sub_warningr.   r)   itemsclear)r   timeoutr4   r<   r;   r   r   r   r   r   r   [   s"    





z_ResourceSharer.stopc             C   sn   x | j  D ]\}\}}|  qW | j   | j| j t | _| jd k	rX| j	  d | _d | _
d | _d S )N)r)   r@   rA   r*   appendr-   r+   r,   r.   r   r/   r0   )r   r;   r   r   r   r   r   r2   p   s    




z_ResourceSharer._afterforkc             C   sj   ddl m} | jd kstdtd |t jd| _| jj	| _
tj| jd}d|_|  || _d S )Nr   )ListenerzAlready have Listenerz0starting listener and thread for sending handles)r5   )targetT)r6   rD   r.   AssertionErrorr   debugr   r7   r5   r:   r/   r+   Thread_servedaemonstartr0   )r   rD   tr   r   r   r3   ~   s    

z_ResourceSharer._startc          	   C   s   t tdr ttjtdtj xy\| j H}| }|d krBP |\}}| j	
|\}}z||| W d |  X W d Q R X W q"   t stjt   Y q"X q"W d S )Npthread_sigmaskr   )hasattrsignalrM   	SIG_BLOCKrangeNSIGr.   acceptrecvr)   popr   
is_exitingsys
excepthookexc_info)r   r   msgr;   destination_pidr   r   r   r   r   rI      s     
z_ResourceSharer._serve)N)r   r   r   r    r   r   staticmethodr   r   r2   r3   rI   r   r   r   r   r'   =   s   
		
r'   )r$   rO   r   rW   r+    r   contextr   r   __all__platformobjectr   r!   r'   r   r   r   r   r   r   <module>   s    


`