U
    d$                     @   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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d5dd	Zejdkr*e
dddg7 Z
ddlm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rd/d0 Z.d1d2 Z/eeje. nd3d0 Z.d4d2 Z/eeje. dS )7    )absolute_importN   )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-lulkwrw3/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   0   s    ForkingPickler.registerNc                 C   s    t  }| ||| | S r   )ioBytesIOr	   	getbufferr   objprotocolbufr   r   r   dumps5   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   
dispatcherJ   s    z+ForkingPickler.register.<locals>.dispatcherN)dispatch)r   r    r!   r;   r   r:   r   r   G   s    r"   Nc                 C   s    t  }| ||| | S r   )r#   r$   r	   getvaluer&   r   r   r   r*   O   s    r+   c                 C   s   |  | S r   )r,   r=   r-   r   r   r   r.   U   s    r/   c                 C   s   t |tjr| }||S r   )
isinstancer#   r$   r=   )r   r)   r,   r   r   r   r,   Y   s    zForkingPickler.loads)N)N)r0   r1   r2   r3   r6   Picklerr<   r   r5   r   r*   r.   r,   r   r   r   r   r   C   s   
c                 C   s   t |||  dS )z3Replacement for pickle.dump() using ForkingPickler.N)r   r	   )r'   filer(   r   r   r   r	   a   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   )rD   GetCurrentProcessDuplicateHandleDUPLICATE_SAME_ACCESS)handleZtarget_processinheritabler   r   r   rB   n   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)rD   OpenProcessPROCESS_DUP_HANDLECloseHandlerF   rE   rG   DUPLICATE_CLOSE_SOURCE)Z
source_pidrH   Zsource_process_handler   r   r   rC   v   s         
c                 C   s   t |tj|}| | dS z&Send a handle over a local connection.N)rA   rD   rG   send)connrH   destination_pidZdhr   r   r   r      s    c                 C   s   |    S ))Receive a handle over a local connection.)recvdetach)rP   r   r   r   r      s    c                   @   s"   e Zd ZdZdddZdd ZdS )rA   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getpidrD   rJ   rK   rL   rF   rE   _handle_access_pid)r   rH   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)rY   rU   rV   rW   rD   rJ   rK   rL   rF   rE   rX   rM   )r   r\   r   r   r   rT      s    
    zDupHandle.detach)N)r0   r1   r2   r3   r   rT   r   r   r   r   rA      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   ACKNOWLEDGErS   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.ra   r   rc   zreceived %d items of ancdatar   rb   zInvalid data receivedN)rd   itemsizerecvmsgrg   r   EOFErrorri   rO   rf   rj   rh   r   
ValueErrorZ	frombytesAssertionErrorlist
IndexError)rk   sizeaZ
bytes_sizerl   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 rN   )filenorg   fromfdAF_UNIXSOCK_STREAMr^   )rP   rH   rQ   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 )rR   r   r   N)rx   rg   ry   rz   r{   r_   )rP   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~   rp   )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__r0   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)r0   r1   r2   r   r   r   r   r   r      s   r   c                 C   s   t | j| jffS r   )r   __objclass__r0   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   )rT   )Zdsr   r   r   r     s    r   c                 C   s"   t |  }t|| j| j| jffS r   )r]   rx   r   familyr    proto)r}   dfr   r   r   r     s    c                 C   s   |   }tj||||dS )N)rx   )rT   rg   )r   r   r    r   r|   r   r   r   r   #  s    )N)NF)0
__future__r   r   r#   rU   r6   rg   sysr   r   __all__version_infoPY3platformhasattrr   r4   r?   r   r   r	   compatrD   rB   rC   r   r   objectrA   rd   ri   r^   r_   r]   r   r   r    r   r   rr   appendint__add__r   r   r   r   r   r   r   r   r   <module>	   sj   





#
