B
    18\$                 @   s  d dl mZ d dlZd dlZ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ddd	gZejd
kpeedoeedoeejdZG dd dejZejZd5dd	Zejd
kr edddg7 Zd dlZd6ddZdd Zdd Zdd ZG dd deZnHedddg7 Zd dlZejdkZdd Zdd Zdd Zd d Zd!d Zd"d# ZG d$d% d%Z ee!e  j"e d&d' Z#ee!e$j%e# ee!e&j'e# d(d) Z(d*d+ Z)eej*e( ejd
krd,d- Z+d.d/ Z,eeje+ nd0d- Z+d1d/ Z,eeje+ G d2d3 d3ed4Z-dS )7    )ABCMetaN   )contextsend_handlerecv_handleForkingPicklerregisterdumpwin32CMSG_LEN
SCM_RIGHTSsendmsgc                   sJ   e Zd ZdZi ZejZ fddZe	dd Z
e	d	ddZejZ  ZS )
r   z)Pickler subclass used by multiprocessing.c                s*   t  j|  | j | _| j| j d S )N)super__init___copyreg_dispatch_tablecopydispatch_tableupdate_extra_reducers)selfargs)	__class__ ]/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/multiprocessing/reduction.pyr   &   s    zForkingPickler.__init__c             C   s   || j |< dS )z&Register a reduce function for a type.N)r   )clstypereducer   r   r   r   +   s    zForkingPickler.registerNc             C   s    t  }| ||| | S )N)ioBytesIOr	   	getbuffer)r   objprotocolbufr   r   r   dumps0   s    zForkingPickler.dumps)N)__name__
__module____qualname____doc__r   copyregr   r   r   classmethodr   r#   pickleloads__classcell__r   r   )r   r   r   !   s   c             C   s   t |||  dS )z3Replacement for pickle.dump() using ForkingPickler.N)r   r	   )r    filer!   r   r   r   r	   :   s    	DupHandle	duplicatesteal_handleFc             C   s*   |dkrt  }t t  | |d|t jS )z<Duplicate a handle.  (target_process is a handle not a pid!)Nr   )_winapiGetCurrentProcessDuplicateHandleDUPLICATE_SAME_ACCESS)handleZtarget_processinheritabler   r   r   r/   G   s
    
c          	   C   sB   t t jd| }z t ||t  ddt jt jB S t | X dS )z5Steal a handle from process identified by source_pid.Fr   N)r1   OpenProcessPROCESS_DUP_HANDLEr3   r2   r4   DUPLICATE_CLOSE_SOURCECloseHandle)Z
source_pidr5   Zsource_process_handler   r   r   r0   O   s    
c             C   s   t |tj|}| | dS )z&Send a handle over a local connection.N)r.   r1   r4   send)connr5   destination_pidZdhr   r   r   r   [   s    c             C   s   |    S )z)Receive a handle over a local connection.)recvdetach)r<   r   r   r   r   `   s    c               @   s"   e Zd ZdZdddZdd ZdS )r.   zPicklable wrapper for a handle.Nc          	   C   s\   |d krt  }ttjd|}ztt |||dd| _W d t| X || _	|| _
d S )NFr   )osgetpidr1   r7   r8   r3   r2   _handler:   _access_pid)r   r5   accesspidprocr   r   r   r   f   s    zDupHandle.__init__c          	   C   sV   | j t kr| jS ttjd| j }zt|| jt | j	dtj
S t| X dS )z1Get the handle.  This should only be called once.FN)rD   r@   rA   rB   r1   r7   r8   r3   r2   rC   r9   r:   )r   rG   r   r   r   r?   u   s    
zDupHandle.detach)N)r$   r%   r&   r'   r   r?   r   r   r   r   r.   d   s   
DupFdsendfdsrecvfdsdarwinc             C   sV   t  d|}tt|d g}| |gtjtj|fg trR| ddkrRt	ddS )z,Send an array of fds over an AF_UNIX socket.i   r      Az%did not receive acknowledgement of fdN)
arraybyteslenr   socket
SOL_SOCKETr   ACKNOWLEDGEr>   RuntimeError)sockZfdsmsgr   r   r   rI      s
    c          	   C   s  t  d}|j| }| dt|\}}}}|s:|s:tytrJ| d t|dkrft	dt| |d \}}	}
|tj
kr|	tjkrt|
|j dkrt||
 t|d |d krtdt||d t|S W n ttfk
r   Y nX t	dd	S )
z/Receive an array of fds over an AF_UNIX socket.rL   r   rN   zreceived %d items of ancdatar   rM   z Len is {0:n} but msg[0] is {1!r}zInvalid data receivedN)rO   itemsizerecvmsgrR   
CMSG_SPACEEOFErrorrT   r;   rQ   rU   rS   r   
ValueError	frombytesAssertionErrorformatlist
IndexError)rV   sizeaZ
bytes_sizerW   ZancdataflagsaddrZ
cmsg_levelZ	cmsg_typeZ	cmsg_datar   r   r   rJ      s2    





c          	   C   s2   t |  t jt j}t||g W dQ R X dS )z&Send a handle over a local connection.N)rR   fromfdfilenoAF_UNIXSOCK_STREAMrI   )r<   r5   r=   sr   r   r   r      s    c          	   C   s0   t |  t jt j}t|dd S Q R X dS )z)Receive a handle over a local connection.r   r   N)rR   rf   rg   rh   ri   rJ   )r<   rj   r   r   r   r      s    c             C   sF   t  }|dk	r ||| S tr:ddlm} || S tddS )zReturn a wrapper for an fd.Nr   )resource_sharerz&SCM_RIGHTS appears not to be available)r   get_spawning_popenrH   Zduplicate_for_childHAVE_SEND_HANDLE rk   r\   )fdZ	popen_objrk   r   r   r   rH      s    
c             C   s2   | j d krt| j| jjffS t| j | jjffS d S )N)__self__getattrr   __func__r$   )mr   r   r   _reduce_method   s    
rt   c               @   s   e Zd Zdd ZdS )_Cc             C   s   d S )Nr   )r   r   r   r   f   s    z_C.fN)r$   r%   r&   rv   r   r   r   r   ru      s   ru   c             C   s   t | j| jffS )N)rq   __objclass__r$   )rs   r   r   r   _reduce_method_descriptor   s    rx   c             C   s   t | j| j| jpi ffS )N)_rebuild_partialfuncr   keywords)pr   r   r   _reduce_partial   s    r}   c             C   s   t j| f||S )N)	functoolspartial)rz   r   r{   r   r   r   ry      s    ry   c             C   s   ddl m} t|| ffS )Nr   )	DupSocket)rk   r   _rebuild_socket)rj   r   r   r   r   _reduce_socket   s    r   c             C   s   |   S )N)r?   )Zdsr   r   r   r      s    r   c             C   s"   t |  }t|| j| j| jffS )N)rH   rg   r   familyr   proto)rj   dfr   r   r   r      s    c             C   s   |   }tj||||dS )N)rg   )r?   rR   )r   r   r   r   ro   r   r   r   r      s    c               @   sd   e Zd ZdZeZeZeZeZeZe	j
dkr8eZeZeZneZeZeZeZeZeZeZeZdd ZdS )AbstractReducerzAbstract base class for use in implementing a Reduction class
    suitable for use in replacing the standard reduction mechanism
    used in multiprocessing.r
   c             G   sN   t tt jt t ttjt t ttj	t t t
jt t tjt d S )N)r   r   ru   rv   rt   r`   appendrx   int__add__r~   r   r}   rR   r   )r   r   r   r   r   r     s
    zAbstractReducer.__init__N)r$   r%   r&   r'   r   r   r	   r   r   sysplatformr0   r/   r.   rI   rJ   rH   rt   rx   ry   r   r   r   r   r   r   r   r      s&   
r   )	metaclass)N)NF).abcr   r(   r~   r   r@   r*   rR   r   rn   r   __all__r   hasattrrm   Picklerr   r   r	   r1   r/   r0   r   r   objectr.   rO   rT   rI   rJ   rH   rt   ru   r   rv   rx   r`   r   r   r   r}   ry   r   r   r   r   r   r   r   r   <module>
   sb   




#
