o
    e%                     @   s(  d dl mZ d dlZd dlZd dlZd dlZzd dlZW n ey)   d dlZY nw d dl	Z	d dl
Z
ddlmZ g dZe
jdkpPee	doPee	doPee	j	d	ZG d
d dejZejZd8ddZe
jdkreg d7 Zd dlZd9ddddZdd Zdd Zdd ZG dd deZn#eg d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/d0 Z-d1d2 Z.ee	j	e- nd3d0 Z-d4d2 Z.ee	j	e- G d5d6 d6ed7Z/dS ):    )ABCMetaN   )context)send_handlerecv_handleForkingPicklerregisterdumpwin32Z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 multiprocess.c                    s0   t  j|i | | j | _| j| j d S N)super__init___copyreg_dispatch_tablecopydispatch_tableupdate_extra_reducers)selfargskwds	__class__ FD:\Projects\ConvertPro\env\Lib\site-packages\multiprocess/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                 O   s.   t  }| ||g|R i || | S r   )ioBytesIOr	   	getbuffer)r   objprotocolr   r   bufr   r   r   dumps3   s   zForkingPickler.dumpsr   )__name__
__module____qualname____doc__r   copyregr   r   r   classmethodr   r%   pickleloads__classcell__r   r   r   r   r   $   s    
r   c                 O   s"   t ||g|R i ||  dS )z3Replacement for pickle.dump() using ForkingPickler.N)r   r	   )r"   filer#   r   r   r   r   r   r	   =   s   "r	   )	DupHandle	duplicatesteal_handleF)source_processc                C   s6   t  }|du r
|}|du r|}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inheritabler3   current_processr   r   r   r1   J   s   r1   c              	   C   sJ   t t jd| }zt ||t  ddt jt jB W t | S t | w )z5Steal a handle from process identified by source_pid.Fr   )r4   OpenProcessPROCESS_DUP_HANDLEr6   r5   r7   DUPLICATE_CLOSE_SOURCECloseHandle)Z
source_pidr8   Zsource_process_handler   r   r   r2   V   s   

r2   c                 C   s   t |tj|}| | dS z&Send a handle over a local connection.N)r0   r4   r7   send)connr8   destination_pidZdhr   r   r   r   b   s   r   c                 C   s   |    S ))Receive a handle over a local connection.)recvdetach)rA   r   r   r   r   g   s   r   c                   @   s"   e Zd ZdZdddZdd ZdS )r0   zPicklable wrapper for a handle.Nc              	   C   sf   |d u rt  }ttjd|}ztt |||dd| _W t| nt| w || _	|| _
d S )NFr   )osgetpidr4   r;   r<   r6   r5   _handler>   _access_pid)r   r8   accesspidprocr   r   r   r   m   s   

zDupHandle.__init__c              	   C   s^   | j t kr
| jS ttjd| j }zt|| jt | j	dtj
W t| S t| w )z1Get the handle.  This should only be called once.F)rJ   rF   rG   rH   r4   r;   r<   r6   r5   rI   r=   r>   )r   rM   r   r   r   rE   |   s   

zDupHandle.detachr   )r&   r'   r(   r)   r   rE   r   r   r   r   r0   k   s    
r0   )DupFdsendfdsrecvfdsdarwinc                 C   sZ   t  d|}tt|d g}| |gtjtj|fg tr)| ddkr+t	ddS 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   ACKNOWLEDGErD   RuntimeError)sockZfdsmsgr   r   r   rO      s   rO   c              	   C   s  t  d}|j| }| dt|\}}}}|s|stz[tr%| d t|dkr3t	dt| |d \}}	}
|tj
kro|	tjkrtt|
|j dkrOt||
 t|d |d krjtdt||d t|W S W t	dW t	d ttfy   Y t	dw )	z/Receive an array of fds over an AF_UNIX socket.rR   r   rT   zreceived %d items of ancdatar   rS   z Len is {0:n} but msg[0] is {1!r}zInvalid data received)rU   itemsizerecvmsgrX   Z
CMSG_SPACEEOFErrorrZ   r@   rW   r[   rY   r   
ValueError	frombytesAssertionErrorformatlist
IndexError)r\   sizeaZ
bytes_sizer]   ZancdataflagsaddrZ
cmsg_levelZ	cmsg_typeZ	cmsg_datar   r   r   rP      sB   






rP   c                 C   sH   t |  t jt j}t||g W d   dS 1 sw   Y  dS r?   )rX   fromfdfilenoAF_UNIXSOCK_STREAMrO   )rA   r8   rB   sr   r   r   r      s   "c                 C   sH   t |  t jt j}t|dd W  d   S 1 sw   Y  dS )rC   r   r   N)rX   rk   rl   rm   rn   rP   )rA   ro   r   r   r   r      s   $c                 C   sB   t  }|dur||| S trddlm} || S td)zReturn a wrapper for an fd.Nr   )resource_sharerz&SCM_RIGHTS appears not to be available)r   Zget_spawning_popenrN   Zduplicate_for_childHAVE_SEND_HANDLE rp   ra   )fdZ	popen_objrp   r   r   r   rN      s   
rN   c                 C   s.   | j d u rt| j| jjffS t| j | jjffS r   )__self__getattrr   __func__r&   mr   r   r   _reduce_method   s   
ry   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&   r'   r(   r{   r   r   r   r   rz      s    rz   c                 C   s   t | j| jffS r   )ru   __objclass__r&   rw   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      r   c                 C   s   t j| g|R i |S r   )	functoolspartial)r   r   r   r   r   r   r~      r   r~   c                 C   s   ddl m} t|| ffS )Nr   )	DupSocket)rp   r   _rebuild_socket)ro   r   r   r   r   _reduce_socket   s   r   c                 C   s   |   S r   )rE   )Zdsr   r   r   r      s   r   c                 C   s"   t |  }t|| j| j| jffS r   )rN   rl   r   familyr   proto)ro   dfr   r   r   r      s   c                 C   s   |   }tj||||dS )N)rl   )rE   rX   )r   r   r   r   rs   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re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 multiprocess.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 r   )r   r   rz   r{   ry   re   appendr}   int__add__r   r   r   rX   r   )r   r   r   r   r   r     s
   zAbstractReducer.__init__N)r&   r'   r(   r)   r   r   r	   r   r   sysplatformr2   r1   r0   rO   rP   rN   ry   r}   r~   r   r   r   r   r   r   r   r      s(    
r   )	metaclassr   )NF)0abcr   r*   r   r   rF   Zdillr,   ImportErrorrX   r   rr   r   __all__r   hasattrrq   Picklerr   r   r	   r4   r1   r2   r   r   objectr0   rU   rZ   rO   rP   rN   ry   rz   r   r{   r}   re   r   r   r   r   r~   r   r   r   r   r   r   r   r   <module>   st   	


	

#

