509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3

  \
$  ã               @   s  d dl mZ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d5dd	„Ze	jd
k�redddg7 Zd dlZd6d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.d/„ Z-eeje,ƒ nd0d-„ Z,d1d/„ Z-eeje,ƒ G d2d3„ d3ed4�Z.dS )7é    )ÚABCMetaÚabstractmethodNé   )Ú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j| jƒ d S )N)ÚsuperÚ__init__Ú_copyreg_dispatch_tableÚcopyÚdispatch_tableÚupdateÚ_extra_reducers)ÚselfÚargs)Ú	__class__© ú1/usr/lib64/python3.6/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 jƒ }| ||ƒj|ƒ |jƒ S )N)Ú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 ||ƒj| ƒ dS )z3Replacement for pickle.dump() using ForkingPickler.N)r   r
   )r    Úfiler!   r   r   r   r
   :   s    Ú	DupHandleÚ	duplicateÚsteal_handleFc             C   s*   |dkrt jƒ }t jt jƒ | |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inheritabler   r   r   r.   G   s
    
c             C   sB   t jt jd| ƒ}z t j||t jƒ ddt jt jB ƒS t j|ƒ X dS )z5Steal a handle from process identified by source_pid.Fr   N)r0   ÚOpenProcessÚPROCESS_DUP_HANDLEr2   r1   r3   ÚDUPLICATE_CLOSE_SOURCEÚCloseHandle)Z
source_pidr4   Zsource_process_handler   r   r   r/   O   s    
c             C   s   t |tj|ƒ}| j|ƒ dS )z&Send a handle over a local connection.N)r-   r0   r3   Úsend)Úconnr4   Údestination_pidZdhr   r   r   r   [   s    c             C   s   | j ƒ jƒ S )z)Receive a handle over a local connection.)ÚrecvÚdetach)r:   r   r   r   r   `   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 jƒ }tjtjd|ƒ}ztjtjƒ |||ddƒ| _W d tj|ƒ X || _	|| _
d S )NFr   )ÚosÚgetpidr0   r5   r6   r2   r1   Ú_handler8   Ú_accessÚ_pid)r   r4   ÚaccessÚpidÚprocr   r   r   r   f   s    zDupHandle.__init__c             C   sV   | j tjƒ kr| jS tjtjd| j ƒ}ztj|| jtjƒ | j	dtj
ƒS tj|ƒ X dS )z1Get the handle.  This should only be called once.FN)rB   r>   r?   r@   r0   r5   r6   r2   r1   rA   r7   r8   )r   rE   r   r   r   r=   u   s    
zDupHandle.detach)N)r#   r$   r%   r&   r   r=   r   r   r   r   r-   d   s   
ÚDupFdÚsendfdsÚrecvfdsÚdarwinc             C   sV   t j d|ƒ}tt|ƒd gƒ}| j|gtjtj|fgƒ trR| j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   ÚACKNOWLEDGEr<   ÚRuntimeError)ÚsockZfdsÚmsgr   r   r   rG   �   s
    c             C   sô   t j dƒ}|j| }| jdtj|ƒƒ\}}}}| r>| r>t‚y�trN| jdƒ t|ƒdkrjt	dt|ƒ ƒ‚|d \}}	}
|tj
krÌ|	tjkrÌt|
ƒ|j dkr¢t‚|j|
ƒ t|ƒd |d ksÄt‚t|ƒ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.rJ   r   rL   zreceived %d items of ancdatar   rK   zInvalid data receivedN)rM   ÚitemsizeZrecvmsgrP   Z
CMSG_SPACEÚEOFErrorrR   r9   rO   rS   rQ   r   Ú
ValueErrorZ	frombytesÚAssertionErrorÚlistÚ
IndexError)rT   ÚsizeÚaZ
bytes_sizerU   ZancdataÚflagsZaddrZ
cmsg_levelZ	cmsg_typeZ	cmsg_datar   r   r   rH   •   s,    





c          
   C   s2   t j| jƒ t jt jƒ�}t||gƒ W dQ R X dS )z&Send a handle over a local connection.N)rP   ÚfromfdÚfilenoÚAF_UNIXÚSOCK_STREAMrG   )r:   r4   r;   Úsr   r   r   r   ®   s    c          
   C   s0   t j| jƒ t jt jƒ�}t|dƒd S Q R X dS )z)Receive a handle over a local connection.r   r   N)rP   r_   r`   ra   rb   rH   )r:   rc   r   r   r   r   ³   s    c             C   sF   t jƒ }|dk	r |j|j| ƒƒS tr:ddlm} |j| ƒ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_popenrF   Zduplicate_for_childÚHAVE_SEND_HANDLEÚ rd   rX   )ÚfdZ	popen_objrd   r   r   r   rF   ¸   s    
c             C   s2   | j d krt| j| jjffS t| j | jjffS d S )N)Ú__self__Úgetattrr   Ú__func__r#   )Úmr   r   r   Ú_reduce_methodÇ   s    
rl   c               @   s   e Zd Zdd„ ZdS )Ú_Cc             C   s   d S )Nr   )r   r   r   r   ÚfÍ   s    z_C.fN)r#   r$   r%   rn   r   r   r   r   rm   Ì   s   rm   c             C   s   t | j| jffS )N)ri   Ú__objclass__r#   )rk   r   r   r   Ú_reduce_method_descriptorÒ   s    rp   c             C   s   t | j| j| jpi ffS )N)Ú_rebuild_partialÚfuncr   Úkeywords)Úpr   r   r   Ú_reduce_partialØ   s    ru   c             C   s   t j| f|ž|ŽS )N)Ú	functoolsÚpartial)rr   r   rs   r   r   r   rq   Ú   s    rq   c             C   s   ddl m} t|| ƒffS )Nr   )Ú	DupSocket)rd   rx   Ú_rebuild_socket)rc   rx   r   r   r   Ú_reduce_socketã   s    rz   c             C   s   | j ƒ S )N)r=   )Zdsr   r   r   ry   æ   s    ry   c             C   s"   t | jƒ ƒ}t|| j| j| jffS )N)rF   r`   ry   Úfamilyr   Úproto)rc   Údfr   r   r   rz   ë   s    c             C   s   | j ƒ }tj||||d�S )N)r`   )r=   rP   )r}   r{   r   r|   rg   r   r   r   ry   î   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 )N)r	   r   rm   rn   rl   rZ   Úappendrp   ÚintÚ__add__rv   rw   ru   rP   rz   )r   r   r   r   r   r     s
    zAbstractReducer.__init__N)r#   r$   r%   r&   r   r	   r
   r   r   ÚsysÚplatformr/   r.   r-   rG   rH   rF   rl   rp   rq   rz   ry   r   r   r   r   r   r~   ô   s&   
r~   )Ú	metaclass)N)NF)/Úabcr   r   r'   rv   r   r>   r)   rP   r‚   rf   r   Ú__all__rƒ   Úhasattrre   ZPicklerr   r	   r
   r0   r.   r/   r   r   Úobjectr-   rM   rR   rG   rH   rF   rl   rm   r   rn   rp   rZ   r   r€   r�   ru   rq   rw   rz   ry   r~   r   r   r   r   Ú<module>
   sb   




#
