o
    éT•j(%  ã                   @   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p@eedƒo@eedƒo@eejd	ƒZG d
d„ dejƒZejZd8dd„Zejdkr~e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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rëd/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                       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 multiprocessing.c                    s*   t ƒ j|Ž  | j ¡ | _| j | j¡ d S ©N)ÚsuperÚ__init__Ú_copyreg_dispatch_tableÚcopyÚdispatch_tableÚupdateÚ_extra_reducers©ÚselfÚargs©Ú	__class__© ú0/usr/lib/python3.10/multiprocessing/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                 C   s    t  ¡ }| ||ƒ |¡ | ¡ S r   )ÚioÚBytesIOr	   Ú	getbuffer)r   ÚobjÚprotocolÚbufr   r   r   Údumps0   s   zForkingPickler.dumpsr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úcopyregr   r   r   Úclassmethodr   r&   ÚpickleÚloadsÚ__classcell__r   r   r   r   r   !   s    
r   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_handleF)Úsource_processc                C   s6   t  ¡ }|du r
|}|du 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)ÚhandleÚtarget_processÚinheritabler4   Úcurrent_processr   r   r   r2   G   s   þr2   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   )r5   ÚOpenProcessÚPROCESS_DUP_HANDLEr7   r6   r8   ÚDUPLICATE_CLOSE_SOURCEÚCloseHandle)Ú
source_pidr9   Úsource_process_handler   r   r   r3   S   s   ÿ

ýr3   c                 C   s   t |tj|ƒ}|  |¡ dS ©z&Send a handle over a local connection.N)r1   r5   r8   Úsend)Úconnr9   Údestination_pidÚdhr   r   r   r   _   s   r   c                 C   s   |   ¡  ¡ S )ú)Receive a handle over a local connection.)ÚrecvÚdetach)rE   r   r   r   r   d   s   r   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   sf   |d u rt  ¡ }t tjd|¡}zt t ¡ |||dd¡| _W t |¡ nt |¡ w || _	|| _
d S )NFr   )ÚosÚgetpidr5   r=   r>   r7   r6   Ú_handler@   Ú_accessÚ_pid)r   r9   ÚaccessÚpidÚprocr   r   r   r   j   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)rO   rK   rL   rM   r5   r=   r>   r7   r6   rN   r?   r@   )r   rR   r   r   r   rJ   y   s   
ÿ
þzDupHandle.detachr   )r'   r(   r)   r*   r   rJ   r   r   r   r   r1   h   s    
r1   )Ú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   ÚACKNOWLEDGErI   ÚRuntimeError)ÚsockÚfdsÚmsgr   r   r   rT   ‘   s   ÿrT   c              	   C   s  t   d¡}|j| }|  dt |¡¡\}}}}|s|st‚z[tr%|  d¡ t|ƒdkr3t	dt|ƒ ƒ‚|d \}}	}
|tj
kro|	tjkrtt|
ƒ|j dkrOt‚| |
¡ t|ƒd |d krjtd t|ƒ|d ¡ƒ‚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.rW   r   rY   zreceived %d items of ancdatar   rX   z Len is {0:n} but msg[0] is {1!r}zInvalid data received)rZ   ÚitemsizeÚrecvmsgr]   Ú
CMSG_SPACEÚEOFErrorr_   rD   r\   r`   r^   r   Ú
ValueErrorÚ	frombytesÚAssertionErrorÚformatÚlistÚ
IndexError)ra   ÚsizeÚaÚ
bytes_sizerc   ÚancdataÚflagsÚaddrÚ
cmsg_levelÚ	cmsg_typeÚ	cmsg_datar   r   r   rU   ™   sB   


ÿ


ÿÿ
÷õþþrU   c                 C   sH   t  |  ¡ t jt j¡�}t||gƒ W d  ƒ dS 1 sw   Y  dS rC   )r]   ÚfromfdÚfilenoÚAF_UNIXÚSOCK_STREAMrT   )rE   r9   rF   Úsr   r   r   r   µ   s   "ÿc                 C   sH   t  |  ¡ t jt j¡�}t|dƒd W  d  ƒ S 1 sw   Y  dS )rH   r   r   N)r]   rw   rx   ry   rz   rU   )rE   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_popenrS   Úduplicate_for_childÚHAVE_SEND_HANDLEÚ r|   rh   )ÚfdÚ	popen_objr|   r   r   r   rS   ¿   s   
rS   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__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ß   ó   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   )rJ   )Údsr   r   r   r–   í   s   r–   c                 C   s"   t |  ¡ ƒ}t|| j| j| jffS r   )rS   rx   r–   Úfamilyr   Úproto)r{   Údfr   r   r   r—   ò   s   c                 C   s   |   ¡ }tj||||d�S )N)rx   )rJ   r]   )r›   r™   r   rš   r�   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re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 )ÚAbstractReducerz�Abstract base class for use in implementing a Reduction class
    suitable for use in replacing the standard reduction mechanism
    used in multiprocessing.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ˆ   rl   ÚappendrŒ   ÚintÚ__add__r“   r”   r‘   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   rT   rU   rS   rˆ   rŒ   r�   r—   r–   r   r   r   r   r   rœ   û   s(    
rœ   )Ú	metaclassr   )NF).Úabcr   r+   r“   r    rK   r-   r]   r    r€   r   Ú__all__r¡   Úhasattrr   ÚPicklerr   r   r	   r5   r2   r3   r   r   Úobjectr1   rZ   r_   rT   rU   rS   rˆ   r‰   r   rŠ   rŒ   rl   r�   rž   rŸ   r‘   r�   r”   r—   r–   rœ   r   r   r   r   Ú<module>   sl   	

ÿ
ý	

ÿ#

