
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    ¡ê,a(%  ã                   @   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
 ddddd	g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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Úwin32Z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__© ú>/opt/alt/python38/lib64/python3.8/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ÚprotocolZbufr   r   r   Údumps0   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                 C   s   t ||ƒ | ¡ dS )z3Replacement for pickle.dump() using ForkingPickler.N)r   r	   )r"   Úfiler#   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_processZinheritabler2   Zcurrent_processr   r   r   r0   G   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)r3   ÚOpenProcessÚPROCESS_DUP_HANDLEÚCloseHandler5   r4   r6   ÚDUPLICATE_CLOSE_SOURCE)Z
source_pidr7   Zsource_process_handler   r   r   r1   S   s      ÿ   
ýc                 C   s   t |tj|ƒ}|  |¡ dS ©z&Send a handle over a local connection.N)r/   r3   r6   Úsend)Úconnr7   Údestination_pidZdhr   r   r   r   _   s    c                 C   s   |   ¡  ¡ S )ú)Receive a handle over a local connection.)ÚrecvÚdetach)r>   r   r   r   r   d   s    c                   @   s"   e Zd ZdZddd„Zdd„ ZdS )r/   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Úgetpidr3   r8   r9   r:   r5   r4   Ú_handleÚ_accessÚ_pid)r   r7   ÚaccessÚpidÚprocr   r   r   r   j   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)rG   rC   rD   rE   r3   r8   r9   r:   r5   r4   rF   r;   )r   rJ   r   r   r   rB   y   s    
ÿ    þzDupHandle.detach)N)r%   r&   r'   r(   r   rB   r   r   r   r   r/   h   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   ÚACKNOWLEDGErA   ÚRuntimeError)ÚsockZfdsÚmsgr   r   r   rL   ‘   s
    c              	   C   s  t   d¡}|j| }|  dt |¡¡\}}}}|s:|s:t‚z¦trJ|  d¡ t|ƒdkrft	dt|ƒ ƒ‚|d \}}	}
|tj
krÞ|	tjkrÞt|
ƒ|j dkržt‚| |
¡ t|ƒd |d krÔt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.rO   r   rQ   zreceived %d items of ancdatar   rP   z Len is {0:n} but msg[0] is {1!r}zInvalid data receivedN)rR   ÚitemsizeZrecvmsgrU   Z
CMSG_SPACEÚEOFErrorrW   r=   rT   rX   rV   r   Ú
ValueErrorZ	frombytesÚAssertionErrorÚformatÚlistÚ
IndexError)rY   ÚsizeÚaZ
bytes_sizerZ   ZancdataÚflagsZaddrZ
cmsg_levelZ	cmsg_typeZ	cmsg_datar   r   r   rM   ™   s<    


ÿ
ÿ
 ÿÿc              	   C   s2   t  |  ¡ t jt j¡�}t||gƒ W 5 Q R X dS r<   )rU   ÚfromfdÚfilenoÚAF_UNIXÚSOCK_STREAMrL   )r>   r7   r?   Ú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 )r@   r   r   N)rU   re   rf   rg   rh   rM   )r>   ri   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_popenrK   Zduplicate_for_childÚHAVE_SEND_HANDLEÚ rj   r]   )ÚfdZ	popen_objrj   r   r   r   rK   ¿   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    
rs   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'   ru   r   r   r   r   rt   Ó   s   rt   c                 C   s   t | j| jffS r   )ro   Ú__objclass__r%   rq   r   r   r   Ú_reduce_method_descriptorÙ   s    rw   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)ry   r   rz   r   r   r   rx   á   s    rx   c                 C   s   ddl m} t|| ƒffS )Nr   )Ú	DupSocket)rj   r   Ú_rebuild_socket)ri   r   r   r   r   Ú_reduce_socketê   s    r�   c                 C   s   |   ¡ S r   )rB   )Zdsr   r   r   r€   í   s    r€   c                 C   s"   t |  ¡ ƒ}t|| j| j| jffS r   )rK   rf   r€   Úfamilyr   Úproto)ri   Údfr   r   r   r�   ò   s    c                 C   s   |   ¡ }tj||||d�S )N)rf   )rB   rU   )r„   r‚   r   rƒ   rm   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 )Ú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   rt   ru   rs   r`   Úappendrw   ÚintÚ__add__r}   r~   r|   rU   r�   r   r   r   r   r     s
    zAbstractReducer.__init__N)r%   r&   r'   r(   r   r   r	   r   r   ÚsysÚplatformr1   r0   r/   rL   rM   rK   rs   rw   rx   r�   r€   r   r   r   r   r   r…   û   s&   
r…   )Ú	metaclass)N)NF).Úabcr   r)   r}   r   rC   r+   rU   r‰   rl   r   Ú__all__rŠ   Úhasattrrk   ZPicklerr   r   r	   r3   r0   r1   r   r   Úobjectr/   rR   rW   rL   rM   rK   rs   rt   r   ru   rw   r`   r†   r‡   rˆ   r|   rx   r~   r�   r€   r…   r   r   r   r   Ú<module>
   sj   

ÿ
ý	
ÿ#
