B
    2*\%                 @   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win32ZCMSG_LEN
SCM_RIGHTSsendmsgc                   sF   e 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   c                s*   t  j|  | j | _| j| j d S )N)super__init___copyreg_dispatch_tablecopydispatch_tableupdate_extra_reducers)selfargs)	__class__ DC:\ALexclude\prg\programme\Python37\Lib\multiprocessing\reduction.pyr   &   s    zForkingPickler.__init__c             C   s   || j |< d S )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__r   copyregr   r   r   classmethodr   r"   pickleloads__classcell__r   r   )r   r   r   !   s   c             C   s   t |||  d S )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 )Nr   )_winapiGetCurrentProcessDuplicateHandleDUPLICATE_SAME_ACCESS)handleZtarget_processZ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 )NFr   )r/   OpenProcessPROCESS_DUP_HANDLEr1   r0   r2   DUPLICATE_CLOSE_SOURCECloseHandle)Z
source_pidr3   Zsource_process_handler   r   r   r.   O   s    
c             C   s   t |tj|}| | d S )N)r,   r/   r2   send)connr3   destination_pidZdhr   r   r   r   [   s    c             C   s   |    S )N)recvdetach)r9   r   r   r   r   `   s    c               @   s   e Zd ZdddZdd ZdS )r,   Nc          	   C   s\   |d krt  }ttjd|}ztt |||dd| _W d t| X || _	|| _
d S )NFr   )osgetpidr/   r4   r5   r1   r0   _handler7   _access_pid)r   r3   accessZ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 )NF)rA   r=   r>   r?   r/   r4   r5   r1   r0   r@   r6   r7   )r   rC   r   r   r   r<   u   s    
zDupHandle.detach)N)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 )Ni   r      Az%did not receive acknowledgement of fd)
arraybyteslenr   socket
SOL_SOCKETr   ACKNOWLEDGEr;   RuntimeError)sockZfdsmsgr   r   r   rE      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 )	NrH   r   rJ   zreceived %d items of ancdatar   rI   z Len is {0:n} but msg[0] is {1!r}zInvalid data received)rK   itemsizeZrecvmsgrN   Z
CMSG_SPACEEOFErrorrP   r8   rM   rQ   rO   r   
ValueErrorZ	frombytesAssertionErrorformatlist
IndexError)rR   sizeaZ
bytes_sizerS   ZancdataflagsZaddrZ
cmsg_levelZ	cmsg_typeZ	cmsg_datar   r   r   rF      s2    





c          	   C   s2   t |  t jt j}t||g W d Q R X d S )N)rN   fromfdfilenoAF_UNIXSOCK_STREAMrE   )r9   r3   r:   sr   r   r   r      s    c          	   C   s0   t |  t jt j}t|dd S Q R X d S )Nr   r   )rN   r^   r_   r`   ra   rF   )r9   rb   r   r   r   r      s    c             C   sF   t  }|d k	r ||| S tr:ddlm} || S tdd S )Nr   )resource_sharerz&SCM_RIGHTS appears not to be available)r   Zget_spawning_popenrD   Zduplicate_for_childHAVE_SEND_HANDLE rc   rV   )fdZ	popen_objrc   r   r   r   rD      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    
rk   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%   rm   r   r   r   r   rl      s   rl   c             C   s   t | j| jffS )N)rh   __objclass__r#   )rj   r   r   r   _reduce_method_descriptor   s    ro   c             C   s   t | j| j| jpi ffS )N)_rebuild_partialfuncr   keywords)pr   r   r   _reduce_partial   s    rt   c             C   s   t j| f||S )N)	functoolspartial)rq   r   rr   r   r   r   rp      s    rp   c             C   s   ddl m} t|| ffS )Nr   )	DupSocket)rc   rw   _rebuild_socket)rb   rw   r   r   r   _reduce_socket   s    ry   c             C   s   |   S )N)r<   )Zdsr   r   r   rx      s    rx   c             C   s"   t |  }t|| j| j| jffS )N)rD   r_   rx   familyr   proto)rb   dfr   r   r   ry      s    c             C   s   |   }tj||||dS )N)r_   )r<   rN   )r|   rz   r   r{   rf   r   r   r   rx      s    c               @   s`   e Zd ZeZeZeZeZeZej	dkr4e
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 )AbstractReducerr
   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   rl   rm   rk   rY   appendro   int__add__ru   rv   rt   rN   ry   )r   r   r   r   r   r     s
    zAbstractReducer.__init__N)r#   r$   r%   r   r   r	   r   r   sysplatformr.   r-   r,   rE   rF   rD   rk   ro   rp   ry   rx   r   r   r   r   r   r}      s$   
r}   )	metaclass)N)NF).abcr   r&   ru   r   r=   r(   rN   r   re   r   __all__r   hasattrrd   ZPicklerr   r   r	   r/   r-   r.   r   r   objectr,   rK   rP   rE   rF   rD   rk   rl   r   rm   ro   rY   r~   r   r   rt   rp   rv   ry   rx   r}   r   r   r   r   <module>
   sb   




#
