a
    xd$                     @   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	 g d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d7ddZejdkr"e
g d7 Z
ddlmZ d8d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/d0 Z,eej-e+ ejdkrd1d2 Z.d3d4 Z/eeje. nd5d2 Z.d6d4 Z/eeje. dS )9    )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__ J/var/www/html/Ranjet/env/lib/python3.9/site-packages/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   
r   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    r	   )	DupHandle	duplicatesteal_handle)_winapiFc                 C   s*   |du 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    
rB   c              	   C   sN   t t jd| }z,t ||t  ddt jt jB W t | S t | 0 dS )z5Steal a handle from process identified by source_pid.Fr   N)rD   OpenProcessPROCESS_DUP_HANDLErF   rE   rG   DUPLICATE_CLOSE_SOURCECloseHandle)Z
source_pidrH   Zsource_process_handler   r   r   rC   v   s    


rC   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    r   c                 C   s   |    S ))Receive a handle over a local connection.)recvdetach)rP   r   r   r   r      s    r   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   sf   |d u rt  }ttjd|}z(tt |||dd| _W t| nt| 0 || _	|| _
d S )NFr   )osgetpidrD   rJ   rK   rF   rE   _handlerM   _access_pid)r   rH   accesspidprocr   r   r   r      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 )z1Get the handle.  This should only be called once.FN)rY   rU   rV   rW   rD   rJ   rK   rF   rE   rX   rL   rM   )r   r\   r   r   r   rT      s    


zDupHandle.detach)N)r0   r1   r2   r3   r   rT   r   r   r   r   rA      s   
rA   )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)sockfdsmsgr   r   r   r^      s
    r^   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sJ t|W S W n ttfy   Y n0 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   
ValueError	frombyteslist
IndexError)rk   sizeaZ
bytes_sizerm   ancdataflagsaddr
cmsg_level	cmsg_type	cmsg_datar   r   r   r_      s4    






r_   c                 C   sJ   |   }t|tjtj}t||g W d   n1 s<0    Y  dS rN   )filenorg   fromfdAF_UNIXSOCK_STREAMr^   )rP   rH   rQ   fdsr   r   r   r      s    c                 C   sL   |   }t|tjtj}t|dd W  d   S 1 s>0    Y  dS )rR   r   r   N)r}   rg   r~   r   r   r_   )rP   r   r   r   r   r   r      s    c                 C   sF   t  }|du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   rq   )r   Z	popen_objr   r   r   r   r]      s    
r]   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__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| 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)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]   r}   r   familyr    proto)r   dfr   r   r   r     s    c                 C   s   |   }tj||||dS )N)r}   )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   rs   appendint__add__r   r   r   r   r   r   r   r   r   <module>	   sj   





#
