a
    ze(%                     @   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
 g d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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nFe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win32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__ //usr/lib/python3.9/multiprocessing/reduction.pyr   &   s    zForkingPickler.__init__c                 C   s   || j |< d S r   )r   )clstypereducer   r   r   r   +   s    zForkingPickler.registerNc                 C   s    t  }| ||| | S r   )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   
r   c                 C   s   t |||  d S r   )r   r	   )r#   filer$   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 )Nr   )_winapiGetCurrentProcessDuplicateHandleDUPLICATE_SAME_ACCESS)handleZtarget_processinheritabler3   current_processr   r   r   r1   G   s    r1   c              	   C   sN   t t jd| }z,t ||t  ddt jt jB W t | S t | 0 d S NFr   )r4   OpenProcessPROCESS_DUP_HANDLEr6   r5   r7   DUPLICATE_CLOSE_SOURCECloseHandle)Z
source_pidr8   Zsource_process_handler   r   r   r2   S   s    


r2   c                 C   s   t |tj|}| | d S r   )r0   r4   r7   send)connr8   destination_pidZdhr   r   r   r   _   s    r   c                 C   s   |    S r   )recvdetach)rA   r   r   r   r   d   s    r   c                   @   s   e Zd ZdddZdd ZdS )r0   Nc              	   C   sf   |d u rt  }ttjd|}z(tt |||dd| _W t| nt| 0 || _	|| _
d S r;   )osgetpidr4   r<   r=   r6   r5   _handler?   _access_pid)r   r8   accesspidprocr   r   r   r   j   s    
zDupHandle.__init__c              	   C   sb   | j t kr| jS ttjd| j }z*t|| jt | j	dtj
W t| S t| 0 d S )NF)rI   rE   rF   rG   r4   r<   r=   r6   r5   rH   r>   r?   )r   rL   r   r   r   rD   y   s    


zDupHandle.detach)N)r'   r(   r)   r   rD   r   r   r   r   r0   h   s   
r0   )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   ACKNOWLEDGErC   RuntimeError)sockfdsmsgr   r   r   rN      s
    rN   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rtdt||d t|W S W n ttfy   Y n0 t	dd S )	NrQ   r   rS   zreceived %d items of ancdatar   rR   z Len is {0:n} but msg[0] is {1!r}zInvalid data received)rT   itemsizerecvmsgrW   
CMSG_SPACEEOFErrorrY   r@   rV   rZ   rX   r   
ValueError	frombytesAssertionErrorformatlist
IndexError)r[   sizea
bytes_sizer]   ancdataflagsaddr
cmsg_level	cmsg_type	cmsg_datar   r   r   rO      s:    




rO   c                 C   sF   t |  t jt j}t||g W d    n1 s80    Y  d S r   )rW   fromfdfilenoAF_UNIXSOCK_STREAMrN   )rA   r8   rB   sr   r   r   r      s    c                 C   sH   t |  t jt j}t|dd W  d    S 1 s:0    Y  d S )Nr   r   )rW   rq   rr   rs   rt   rO   )rA   ru   r   r   r   r      s    c                 C   sF   t  }|d ur ||| S tr:ddlm} || S tdd S )Nr   )resource_sharerz&SCM_RIGHTS appears not to be available)r   get_spawning_popenrM   duplicate_for_childHAVE_SEND_HANDLE rv   rb   )fd	popen_objrv   r   r   r   rM      s    
rM   c                 C   s2   | j d u 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'   r(   r)   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| g|R i |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)rv   r   _rebuild_socket)ru   r   r   r   r   _reduce_socket   s    r   c                 C   s   |   S r   )rD   )Zdsr   r   r   r      s    r   c                 C   s"   t |  }t|| j| j| jffS r   )rM   rr   r   familyr   proto)ru   dfr   r   r   r      s    c                 C   s   |   }tj||||dS )N)rr   )rD   rW   )r   r   r   r   r{   r   r   r   r      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 r   )r   r   r   r   r   rf   appendr   int__add__r   r   r   rW   r   r   r   r   r   r     s
    zAbstractReducer.__init__N)r'   r(   r)   r   r   r	   r   r   sysplatformr2   r1   r0   rN   rO   rM   r   r   r   r   r   r   r   r   r   r   r      s$   
r   )	metaclass)N)NF).abcr   r*   r   r    rE   r,   rW   r   rz   r   __all__r   hasattrry   Picklerr   r   r	   r4   r1   r2   r   r   objectr0   rT   rY   rN   rO   rM   r   r   r   r   r   rf   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>
   sj   


	
#
