U
    .e$                     @   s  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  d	kZ
ejd
kpeedoeedoeejdZe
rd dlZG dd dejZnG dd dejZejZd4ddZejd
kredddg7 ZddlmZ d5ddZdd Zdd Zdd ZG dd d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+d0d1 Z,eeje+ nd2d/ Z+d3d1 Z,eeje+ dS )6    N   )contextsend_handlerecv_handleForkingPicklerregisterdump   win32CMSG_LEN
SCM_RIGHTSsendmsgc                       sX   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	dd	d
ZejZ  ZS )r   )Pickler subclass used by multiprocessing.c                    s.   t t| j|  | j | _| j| j d S N)superr   __init___copyreg_dispatch_tablecopydispatch_tableupdate_extra_reducers)selfargs	__class__ 6/tmp/pip-unpacked-wheel-39f38r4u/billiard/reduction.pyr   *   s    zForkingPickler.__init__c                 C   s   || j |< dS )&Register a reduce function for a type.N)r   )clstypereducer   r   r   r   /   s    ForkingPickler.registerNc                 C   s    t  }| ||| | S r   )ioBytesIOr   	getbufferr   objprotocolbufr   r   r   dumps4   s    ForkingPickler.dumpsc                 C   s   |  | S r   )loadsr$   r   r(   r'   r   r   r   loadbuf:   s    ForkingPickler.loadbuf)N)N)__name__
__module____qualname____doc__r   copyregr   r   r   classmethodr   r)   r-   pickler+   __classcell__r   r   r   r   r   %   s   
c                   @   sV   e Zd ZdZejj Zedd Z	edddZ
edddZeejfd	d
ZdS )r   r   c                    s    fdd}|| j |< dS )r   c                    s    |}| j |d|i d S )Nr&   )save_reduce)r   r&   rvr    r   r   
dispatcherI   s    z+ForkingPickler.register.<locals>.dispatcherN)dispatch)r   r   r    r:   r   r9   r   r   F   s    r!   Nc                 C   s    t  }| ||| | S r   )r"   r#   r   getvaluer%   r   r   r   r)   N   s    r*   c                 C   s   |  | S r   )r+   r<   r,   r   r   r   r-   T   s    r.   c                 C   s   t |tjr| }||S r   )
isinstancer"   r#   r<   )r   r(   r+   r   r   r   r+   X   s    zForkingPickler.loads)N)N)r/   r0   r1   r2   r5   Picklerr;   r   r4   r   r)   r-   r+   r   r   r   r   r   B   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_handle)_winapiFc                 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   )rC   GetCurrentProcessDuplicateHandleDUPLICATE_SAME_ACCESS)handleZtarget_processinheritabler   r   r   rA   m   s        c              	   C   sF   t t jd| }z$t ||t  ddt jt jB W S t | X dS )z5Steal a handle from process identified by source_pid.Fr   N)rC   OpenProcessPROCESS_DUP_HANDLECloseHandlerE   rD   rF   DUPLICATE_CLOSE_SOURCE)Z
source_pidrG   Zsource_process_handler   r   r   rB   u   s         
c                 C   s   t |tj|}| | dS z&Send a handle over a local connection.N)r@   rC   rF   send)connrG   destination_pidZdhr   r   r   r      s    c                 C   s   |    S ))Receive a handle over a local connection.)recvdetach)rO   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 5 t| X || _	|| _
d S )NFr   )osgetpidrC   rI   rJ   rK   rE   rD   _handle_access_pid)r   rG   accesspidprocr   r   r   r      s        
zDupHandle.__init__c              	   C   sZ   | j t kr| jS ttjd| j }z"t|| jt	 | j
dtjW S t| X dS )z1Get the handle.  This should only be called once.FN)rX   rT   rU   rV   rC   rI   rJ   rK   rE   rD   rW   rL   )r   r[   r   r   r   rS      s    
    zDupHandle.detach)N)r/   r0   r1   r2   r   rS   r   r   r   r   r@      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   ACKNOWLEDGErR   RuntimeError)sockZfdsmsgr   r   r   r]      s
    c              	   C   s   t  d}|j| }| dt|\}}}}|s:|s:tzt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stt|W 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.r`   r   rb   zreceived %d items of ancdatar   ra   zInvalid data receivedN)rc   itemsizerecvmsgrf   r   EOFErrorrh   rN   re   ri   rg   r   
ValueErrorZ	frombytesAssertionErrorlist
IndexError)rj   sizeaZ
bytes_sizerk   ZancdataflagsaddrZ
cmsg_levelZ	cmsg_typeZ	cmsg_datar   r   r   r^      s6    

 



c              	   C   s6   |   }t|tjtj}t||g W 5 Q R X dS rM   )filenorf   fromfdAF_UNIXSOCK_STREAMr]   )rO   rG   rP   fdsr   r   r   r      s    c              
   C   s@   |   }t|tjtj}t|dd W  5 Q R  S Q R X dS )rQ   r   r   N)rw   rf   rx   ry   rz   r^   )rO   r{   r|   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   Zget_spawning_popenr\   Zduplicate_for_childHAVE_SEND_HANDLE r}   ro   )r{   Z	popen_objr}   r   r   r   r\      s    
c                 C   s2   | j d krt| j| jjffS t| j | jjffS d S r   )__self__getattrr   __func__r/   mr   r   r   _reduce_method   s    
r   c                   @   s   e Zd Zdd ZdS )_Cc                 C   s   d S r   r   )r   r   r   r   f   s    z_C.fN)r/   r0   r1   r   r   r   r   r   r      s   r   c                 C   s   t | j| jffS r   )r   __objclass__r/   r   r   r   r   _reduce_method_descriptor   s    r   c                 C   s   t | j| j| jpi ffS r   )_rebuild_partialfuncr   keywords)pr   r   r   _reduce_partial  s    r   c                 C   s   t j| f||S r   )	functoolspartial)r   r   r   r   r   r   r   
  s    r   c                 C   s   ddl m} t|| ffS )Nr   )	DupSocket)r}   r   _rebuild_socket)r|   r   r   r   r   _reduce_socket  s    r   c                 C   s   |   S r   )rS   )Zdsr   r   r   r     s    r   c                 C   s"   t |  }t|| j| j| jffS r   )r\   rw   r   familyr   proto)r|   dfr   r   r   r     s    c                 C   s   |   }tj||||dS )N)rw   )rS   rf   )r   r   r   r   r{   r   r   r   r   "  s    )N)NF)-r   r"   rT   r5   rf   sysr   r   __all__version_infoPY3platformhasattrr~   r3   r>   r   r   r   compatrC   rA   rB   r   r   r@   rc   rh   r]   r^   r\   r   r   r   r   r   rq   appendint__add__r   r   r   r   r   r   r   r   r   <module>
   sh   





#
