U
    -e%                     @   s8  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k
rT   d dlZY nX 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d6dd	Ze
jd
kr(edddg7 Zd dlZd7ddd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-d. Z-d/d0 Z.ee	j	e- nd1d. Z-d2d0 Z.ee	j	e- G d3d4 d4ed5Z/dS )8    )ABCMetaN   )contextsend_handlerecv_handleForkingPicklerregisterdumpwin32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                    s,   t  j|| | j | _| j| j d S N)super__init___copyreg_dispatch_tablecopydispatch_tableupdate_extra_reducers)selfargskwds	__class__ W/var/www/html/Darija-Ai-Train/env/lib/python3.8/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  }| ||f||| | S r   )ioBytesIOr	   	getbuffer)r   objprotocolr   r   bufr   r   r   dumps3   s    zForkingPickler.dumps)N)__name__
__module____qualname____doc__r   copyregr   r   r   classmethodr   r&   pickleloads__classcell__r   r   r   r   r   $   s   
c                 O   s   t ||f|||  dS )z3Replacement for pickle.dump() using ForkingPickler.N)r   r	   )r#   filer$   r   r   r   r   r   r	   =   s    	DupHandle	duplicatesteal_handleF)source_processc                C   s6   t  }|dkr|}|dk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inheritabler4   current_processr   r   r   r2   J   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)r5   OpenProcessPROCESS_DUP_HANDLECloseHandler7   r6   r8   DUPLICATE_CLOSE_SOURCE)Z
source_pidr9   Zsource_process_handler   r   r   r3   V   s         
c                 C   s   t |tj|}| | dS z&Send a handle over a local connection.N)r1   r5   r8   send)connr9   destination_pidZdhr   r   r   r   b   s    c                 C   s   |    S ))Receive a handle over a local connection.)recvdetach)rB   r   r   r   r   g   s    c                   @   s"   e Zd ZdZdddZdd ZdS )r1   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getpidr5   r<   r=   r>   r7   r6   _handle_access_pid)r   r9   accesspidprocr   r   r   r   m   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)rK   rG   rH   rI   r5   r<   r=   r>   r7   r6   rJ   r?   )r   rN   r   r   r   rF   |   s    
    zDupHandle.detach)N)r'   r(   r)   r*   r   rF   r   r   r   r   r1   k   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   ACKNOWLEDGErE   RuntimeError)sockZfdsmsgr   r   r   rP      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rtdt||d 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.rS   r   rU   zreceived %d items of ancdatar   rT   z Len is {0:n} but msg[0] is {1!r}zInvalid data receivedN)rV   itemsizerecvmsgrY   
CMSG_SPACEEOFErrorr[   rA   rX   r\   rZ   r   
ValueError	frombytesAssertionErrorformatlist
IndexError)r]   sizeaZ
bytes_sizer^   ZancdataflagsaddrZ
cmsg_levelZ	cmsg_typeZ	cmsg_datar   r   r   rQ      s<    




 c              	   C   s2   t |  t jt j}t||g W 5 Q R X dS r@   )rY   fromfdfilenoAF_UNIXSOCK_STREAMrP   )rB   r9   rC   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 )rD   r   r   N)rY   rm   rn   ro   rp   rQ   )rB   rq   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_popenrO   Zduplicate_for_childHAVE_SEND_HANDLE rr   rc   )fdZ	popen_objrr   r   r   r   rO      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'   r(   r)   r}   r   r   r   r   r|      s   r|   c                 C   s   t | j| jffS r   )rw   __objclass__r'   ry   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)rr   r   _rebuild_socket)rq   r   r   r   r   _reduce_socket   s    r   c                 C   s   |   S r   )rF   )Zdsr   r   r   r      s    r   c                 C   s"   t |  }t|| j| j| jffS r   )rO   rn   r   familyr   proto)rq   dfr   r   r   r      s    c                 C   s   |   }tj||||dS )N)rn   )rF   rY   )r   r   r   r   ru   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r8e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   r|   r}   r{   rg   appendr   int__add__r   r   r   rY   r   )r   r   r   r   r   r     s
    zAbstractReducer.__init__N)r'   r(   r)   r*   r   r   r	   r   r   sysplatformr3   r2   r1   rP   rQ   rO   r{   r   r   r   r   r   r   r   r   r   r      s&   
r   )	metaclass)N)NF)0abcr   r+   r   r    rG   Zdillr-   ImportErrorrY   r   rt   r   __all__r   hasattrrs   Picklerr   r   r	   r5   r2   r3   r   r   objectr1   rV   r[   rP   rQ   rO   r{   r|   r   r}   r   rg   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>
   sp   


	
#
