o
    svXjÕ$  ã                   @   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pCeedƒoCeed	ƒoCeejd
ƒZerTd 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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/d0„ Z,eej-e+ƒ ejdkrþd1d2„ Z.d3d4„ Z/eeje.ƒ dS 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__© úO/var/www/html/myproject/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   0   s   úForkingPickler.registerNc                 C   ó    t  ¡ }| ||ƒ |¡ | ¡ S r   )ÚioÚBytesIOr	   Ú	getbuffer©r   ÚobjÚprotocolÚbufr   r   r   Údumps5   ó   ú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+   r1   Ú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   r#   r   )r$   r%   r	   Úgetvaluer'   r   r   r   r+   O   r,   r-   c                 C   r.   r   )r/   rA   r0   r   r   r   r1   U   r2   r3   c                 C   s   t |tjƒr
| ¡ }||ƒS r   )Ú
isinstancer$   r%   rA   )r   r*   r/   r   r   r   r/   Y   s   zForkingPickler.loadsr   )r4   r5   r6   r7   r:   ÚPicklerr@   r   r9   r   r+   r1   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   )rH   ÚGetCurrentProcessÚDuplicateHandleÚDUPLICATE_SAME_ACCESS)ÚhandleÚtarget_processÚinheritabler   r   r   rF   n   s   
þrF   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   )rH   ÚOpenProcessÚPROCESS_DUP_HANDLErJ   rI   rK   ÚDUPLICATE_CLOSE_SOURCEÚCloseHandle)Ú
source_pidrL   Úsource_process_handler   r   r   rG   v   s   ÿ

ýrG   c                 C   s   t |tj|ƒ}|  |¡ dS ©z&Send a handle over a local connection.N)rE   rH   rK   Úsend)ÚconnrL   Údestination_pidÚdhr   r   r   r   ‚   s   r   c                 C   s   |   ¡  ¡ S )ú)Receive a handle over a local connection.)ÚrecvÚdetach)rW   r   r   r   r   ‡   s   r   c                   @   s"   e Zd ZdZddd„Zdd„ ZdS )rE   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ÚgetpidrH   rO   rP   rJ   rI   Ú_handlerR   Ú_accessÚ_pid)r   rL   Ú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)ra   r]   r^   r_   rH   rO   rP   rJ   rI   r`   rQ   rR   )r   rd   r   r   r   r\   œ   s   
ÿ
þzDupHandle.detachr   )r4   r5   r6   r7   r   r\   r   r   r   r   rE   ‹   s    
rE   )Ú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   ÚACKNOWLEDGEr[   ÚRuntimeError)ÚsockÚfdsÚmsgr   r   r   rf   ´   s   ÿrf   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.ri   r   rk   zreceived %d items of ancdatar   rj   zInvalid data received)rl   ÚitemsizeÚrecvmsgro   r   ÚEOFErrorrq   rV   rn   rr   rp   r   Ú
ValueErrorÚ	frombytesÚlistÚ
IndexError)rs   ÚsizeÚaÚ
bytes_sizeru   ÚancdataÚflagsÚaddrÚ
cmsg_levelÚ	cmsg_typeÚ	cmsg_datar   r   r   rg   ¼   s<   


ÿ

ÿ



ú	øþþrg   c                 C   sL   |   ¡ }t |tjtj¡�}t||gƒ W d  ƒ dS 1 sw   Y  dS rU   )Úfilenoro   ÚfromfdÚAF_UNIXÚSOCK_STREAMrf   )rW   rL   rX   Ú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 )rZ   r   r   N)r†   ro   r‡   rˆ   r‰   rg   )rW   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_popenre   Úduplicate_for_childÚHAVE_SEND_HANDLEÚ rŒ   ry   )rŠ   Ú	popen_objrŒ   r   r   r   re   ä   s   
re   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__r4   ©Ú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)r4   r5   r6   r™   r   r   r   r   r˜   û   s    r˜   c                 C   s   t | j| jffS r   )r“   Ú__objclass__r4   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   )re   r†   r¥   Úfamilyr    Úproto)r‹   Údfr   r   r   r¦     s   c                 C   s   |   ¡ }tj||||d�S )N)r†   )r\   ro   )rª   r¨   r    r©   rŠ   r   r   r   r¥   #  s   r   )NF)0Ú
__future__r   r¢   r$   r]   r:   ro   Úsysr�   r   Ú__all__Úversion_infoÚPY3ÚplatformÚhasattrr�   r8   rC   r   r   r	   ÚcompatrH   rF   rG   r   r   ÚobjectrE   rl   rq   rf   rg   re   r—   r˜   r    r™   r›   r{   ÚappendÚintÚ__add__r    rœ   r£   r¦   r¥   r   r   r   r   Ú<module>   sl   

ÿ
ý



#

