o
    h$                     @   s  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p=eedo=eedo=eejd	Ze
rNd dlZG d
d dejZn	G dd dejZejZd6ddZejdkreg d7 ZddlmZ d7ddZdd Zdd Zdd ZG dd d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rd0d1 Z+d2d3 Z,eeje+ dS d4d1 Z+d5d3 Z,eeje+ dS )8    N   )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__ T/var/www/html/optinet_system/venv/lib/python3.10/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   /   s   ForkingPickler.registerNc                 C       t  }| ||| | S r   )ioBytesIOr   	getbufferr   objprotocolbufr   r   r   dumps4      ForkingPickler.dumpsc                 C      |  | S r   )loadsr%   r   r)   r(   r   r   r   loadbuf:      ForkingPickler.loadbufr   )__name__
__module____qualname____doc__r   copyregr   r   r   classmethodr   r*   r0   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   
dispatcherI   s   z+ForkingPickler.register.<locals>.dispatcherN)dispatch)r   r   r    r>   r   r=   r   r   F   s   r!   Nc                 C   r"   r   )r#   r$   r   getvaluer&   r   r   r   r*   N   r+   r,   c                 C   r-   r   )r.   r@   r/   r   r   r   r0   T   r1   r2   c                 C   s   t |tjr
| }||S r   )
isinstancer#   r$   r@   )r   r)   r.   r   r   r   r.   X   s   zForkingPickler.loadsr   )r3   r4   r5   r6   r9   Picklerr?   r   r8   r   r*   r0   r.   r   r   r   r   r   B   s    
c                 C   s   t |||  dS )z3Replacement for pickle.dump() using ForkingPickler.N)r   r   )r'   filer(   r   r   r   r   `   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   )rG   GetCurrentProcessDuplicateHandleDUPLICATE_SAME_ACCESS)handletarget_processinheritabler   r   r   rE   m   s   
rE   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   )rG   OpenProcessPROCESS_DUP_HANDLErI   rH   rJ   DUPLICATE_CLOSE_SOURCECloseHandle)
source_pidrK   source_process_handler   r   r   rF   u   s   

rF   c                 C   s   t |tj|}| | dS z&Send a handle over a local connection.N)rD   rG   rJ   send)connrK   destination_piddhr   r   r   r      s   r   c                 C   s   |    S ))Receive a handle over a local connection.)recvdetach)rV   r   r   r   r      s   r   c                   @   s"   e Zd ZdZdddZdd ZdS )rD   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getpidrG   rN   rO   rI   rH   _handlerQ   _access_pid)r   rK   accesspidprocr   r   r   r      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)r`   r\   r]   r^   rG   rN   rO   rI   rH   r_   rP   rQ   )r   rc   r   r   r   r[      s   

zDupHandle.detachr   )r3   r4   r5   r6   r   r[   r   r   r   r   rD      s    
rD   )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   ACKNOWLEDGErZ   RuntimeError)sockfdsmsgr   r   r   re      s   re   c              	   C   s   t  d}|j| }| dt|\}}}}|s|stzQtr%| d t|dkr3t	dt| |d \}}	}
|tj
kre|	tjkrjt|
|j dkrOt||
 t|d |d ks`J 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.rh   r   rj   zreceived %d items of ancdatar   ri   zInvalid data received)rk   itemsizerecvmsgrn   r   EOFErrorrp   rU   rm   rq   ro   r   
ValueError	frombyteslist
IndexError)rr   sizea
bytes_sizert   ancdataflagsaddr
cmsg_level	cmsg_type	cmsg_datar   r   r   rf      s<   








	rf   c                 C   sL   |   }t|tjtj}t||g W d   dS 1 sw   Y  dS rT   )filenorn   fromfdAF_UNIXSOCK_STREAMre   )rV   rK   rW   fdsr   r   r   r      s   "c                 C   sL   |   }t|tjtj}t|dd W  d   S 1 sw   Y  dS )rY   r   r   N)r   rn   r   r   r   rf   )rV   r   r   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   get_spawning_popenrd   duplicate_for_childHAVE_SEND_HANDLE r   rx   )r   	popen_objr   r   r   r   rd      s   
rd   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__r3   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)r3   r4   r5   r   r   r   r   r   r      s    r   c                 C   s   t | j| jffS r   )r   __objclass__r3   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     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)r   r   _rebuild_socket)r   r   r   r   r   _reduce_socket  s   r   c                 C   s   |   S r   )r[   )dsr   r   r   r     s   r   c                 C   s"   t |  }t|| j| j| jffS r   )rd   r   r   familyr   proto)r   dfr   r   r   r     s   c                 C   s   |   }tj||||dS )N)r   )r[   rn   )r   r   r   r   r   r   r   r   r   "  s   r   )NF)-r   r#   r\   r9   rn   sysr   r   __all__version_infoPY3platformhasattrr   r7   rB   r   r   r   compatrG   rE   rF   r   r   rD   rk   rp   re   rf   rd   r   r   r   r   r   rz   appendint__add__r   r   r   r   r   r   r   r   r   <module>   sj   	






#

