509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
öLÖjVy  ã               @   s  d dddg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Zddl	Z	ddl
mZ ddl
mZmZ dd	lmZ ejZy$ddlZdd
lmZmZmZmZ W n$ ek
rÊ   ejdkrÂ‚ dZY nX dZdZdZejƒ ZdZdgZe edƒ�rdZedg7 Zejdk�rdZedg7 Zefdd„Z!dd„ Z"dd„ Z#dd„ Z$dd„ Z%G dd„ dƒZ&e�rnG dd„ de&ƒZ'G d d!„ d!e&ƒZ(G d"d„ de)ƒZ*dPd#d „Z+ejdk�r°dQd%d„Z,n
dRd&d„Z,G d'd(„ d(e)ƒZ-d)d*„ Z.ejdk�röG d+d,„ d,e)ƒZ/d-d.„ Z0d/Z1d0Z2d1Z3d2Z4d3d4„ Z5d5d6„ Z6G d7d8„ d8e)ƒZ7d9d:„ Z8d;d<„ Z9G d=d>„ d>e*ƒZ:d?d@„ Z;ejdk�rzdAdB„ Z<ej=ej>hZ?dSdCd„Z@n,ddlAZAe eAdDƒ�r–eAjBZCneAjDZCdTdEd„Z@ejdk�rìdFdG„ ZEdHdI„ ZFejGe(eEƒ dJdK„ ZHdLdM„ ZIejGe'eHƒ ndNdG„ ZEdOdI„ ZFejGe(eEƒ dS )UÚClientÚListenerÚPipeÚwaité    Né   )Úutil)ÚAuthenticationErrorÚBufferTooShort)Ú	reduction)ÚWAIT_OBJECT_0ÚWAIT_ABANDONED_0ÚWAIT_TIMEOUTÚINFINITEÚwin32i    g      4@Zsha256ÚAF_INETÚAF_UNIXÚAF_PIPEc             C   s   t jƒ |  S )N)ÚtimeÚ	monotonic)Útimeout© r   ú2/usr/lib64/python3.6/multiprocessing/connection.pyÚ_init_timeout?   s    r   c             C   s   t jƒ | kS )N)r   r   )Útr   r   r   Ú_check_timeoutB   s    r   c             C   sX   | dkrdS | dkr&t jdtjƒ d�S | dkrLt jdtjƒ ttƒf d	d�S td
ƒ‚dS )z?
    Return an arbitrary free address for the given family
    r   Ú	localhostr   r   z	listener-)ÚprefixÚdirr   z\\.\pipe\pyc-%d-%d-Ú zunrecognized familyN)r   r   )	ÚtempfileZmktempr   Zget_temp_dirÚosÚgetpidÚnextÚ_mmap_counterÚ
ValueError)Úfamilyr   r   r   Úarbitrary_addressI   s    r&   c             C   sJ   t jdkr| dkrtd|  ƒ‚t jdkrF| dkrFtt| ƒsFtd|  ƒ‚dS )zD
    Checks if the family is valid for the current environment.
    r   r   zFamily %s is not recognized.r   N)ÚsysÚplatformr$   ÚhasattrÚsocket)r%   r   r   r   Ú_validate_familyW   s
    
r+   c             C   sJ   t | ƒtkrdS t | ƒtkr*| jdƒr*dS t | ƒtkr:dS td|  ƒ‚dS )z]
    Return the types of the address

    This can be 'AF_INET', 'AF_UNIX', or 'AF_PIPE'
    r   z\\r   r   zaddress type of %r unrecognizedN)ÚtypeÚtupleÚstrÚ
startswithr$   )Úaddressr   r   r   Úaddress_typec   s    r1   c               @   s¾   e Zd ZdZd+dd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	e
dd„ ƒZe
dd„ ƒZe
dd„ ƒZdd„ Zdd„ Zd,dd„Zdd„ Zd-dd„Zd.d d!„Zd"d#„ Zd/d%d&„Zd'd(„ Zd)d*„ ZdS )0Ú_ConnectionBaseNTc             C   sB   |j ƒ }|dk rtdƒ‚| r,| r,tdƒ‚|| _|| _|| _d S )Nr   zinvalid handlez6at least one of `readable` and `writable` must be True)Ú	__index__r$   Ú_handleÚ	_readableÚ	_writable)ÚselfÚhandleÚreadableÚwritabler   r   r   Ú__init__y   s    z_ConnectionBase.__init__c             C   s   | j d k	r| jƒ  d S )N)r4   Ú_close)r7   r   r   r   Ú__del__†   s    
z_ConnectionBase.__del__c             C   s   | j d krtdƒ‚d S )Nzhandle is closed)r4   ÚOSError)r7   r   r   r   Ú_check_closedŠ   s    
z_ConnectionBase._check_closedc             C   s   | j stdƒ‚d S )Nzconnection is write-only)r5   r>   )r7   r   r   r   Ú_check_readableŽ   s    z_ConnectionBase._check_readablec             C   s   | j stdƒ‚d S )Nzconnection is read-only)r6   r>   )r7   r   r   r   Ú_check_writable’   s    z_ConnectionBase._check_writablec             C   s"   | j rd| _n| jƒ  tdƒ‚d S )NFzbad message length)r6   r5   Úcloser>   )r7   r   r   r   Ú_bad_message_length–   s    z#_ConnectionBase._bad_message_lengthc             C   s
   | j dkS )z True if the connection is closedN)r4   )r7   r   r   r   Úclosed�   s    z_ConnectionBase.closedc             C   s   | j S )z"True if the connection is readable)r5   )r7   r   r   r   r9   ¢   s    z_ConnectionBase.readablec             C   s   | j S )z"True if the connection is writable)r6   )r7   r   r   r   r:   §   s    z_ConnectionBase.writablec             C   s   | j ƒ  | jS )z+File descriptor or handle of the connection)r?   r4   )r7   r   r   r   Úfileno¬   s    z_ConnectionBase.filenoc             C   s$   | j dk	r z| jƒ  W dd| _ X dS )zClose the connectionN)r4   r<   )r7   r   r   r   rB   ±   s    
z_ConnectionBase.closer   c             C   s¨   | j ƒ  | jƒ  t|ƒ}|jdkr.tt|ƒƒ}t|ƒ}|dk rFtdƒ‚||k rVtdƒ‚|dkrh|| }n&|dk rztdƒ‚n|| |krŽtdƒ‚| j|||| … ƒ dS )z,Send the bytes data from a bytes-like objectr   r   zoffset is negativezbuffer length < offsetNzsize is negativezbuffer length < offset + size)r?   rA   Ú
memoryviewÚitemsizeÚbytesÚlenr$   Ú_send_bytes)r7   ÚbufÚoffsetÚsizeÚmÚnr   r   r   Ú
send_bytes¹   s"    


z_ConnectionBase.send_bytesc             C   s$   | j ƒ  | jƒ  | jtj|ƒƒ dS )zSend a (picklable) objectN)r?   rA   rJ   Ú_ForkingPicklerÚdumps)r7   Úobjr   r   r   ÚsendÎ   s    z_ConnectionBase.sendc             C   sJ   | j ƒ  | jƒ  |dk	r(|dk r(tdƒ‚| j|ƒ}|dkrB| jƒ  |jƒ S )z7
        Receive bytes data as a bytes object.
        Nr   znegative maxlength)r?   r@   r$   Ú_recv_bytesrC   Úgetvalue)r7   Z	maxlengthrK   r   r   r   Ú
recv_bytesÔ   s    
z_ConnectionBase.recv_bytesc             C   s¬   | j ƒ  | jƒ  t|ƒ�Š}|j}|t|ƒ }|dk r>tdƒ‚n||krNtdƒ‚| jƒ }|jƒ }||| k rvt|j	ƒ ƒ‚|j
dƒ |j||| || | … ƒ |S Q R X dS )zq
        Receive bytes data into a writeable bytes-like object.
        Return the number of bytes read.
        r   znegative offsetzoffset too largeN)r?   r@   rF   rG   rI   r$   rU   Útellr	   rV   ÚseekÚreadinto)r7   rK   rL   rN   rG   ZbytesizeÚresultrM   r   r   r   Úrecv_bytes_intoá   s"    


z_ConnectionBase.recv_bytes_intoc             C   s&   | j ƒ  | jƒ  | jƒ }tj|jƒ ƒS )zReceive a (picklable) object)r?   r@   rU   rQ   ÚloadsÚ	getbuffer)r7   rK   r   r   r   Úrecvú   s    z_ConnectionBase.recvç        c             C   s   | j ƒ  | jƒ  | j|ƒS )z/Whether there is any input available to be read)r?   r@   Ú_poll)r7   r   r   r   r   Úpoll  s    z_ConnectionBase.pollc             C   s   | S )Nr   )r7   r   r   r   Ú	__enter__  s    z_ConnectionBase.__enter__c             C   s   | j ƒ  d S )N)rB   )r7   Úexc_typeÚ	exc_valueÚexc_tbr   r   r   Ú__exit__
  s    z_ConnectionBase.__exit__)TT)r   N)N)r   )r`   )Ú__name__Ú
__module__Ú__qualname__r4   r;   r=   r?   r@   rA   rC   ÚpropertyrD   r9   r:   rE   rB   rP   rT   rW   r\   r_   rb   rc   rg   r   r   r   r   r2   v   s(   




r2   c               @   sD   e Zd ZdZdZejfdd„Zdd„ Zddd	„Z	d
d„ Z
dd„ ZdS )ÚPipeConnectionzª
        Connection class based on a Windows named pipe.
        Overlapped I/O is used, so the handles must have been created
        with FILE_FLAG_OVERLAPPED.
        Fc             C   s   || j ƒ d S )N)r4   )r7   Z_CloseHandler   r   r   r<     s    zPipeConnection._closec             C   s�   t j| j|dd�\}}zHy,|t jkrBt j|jgdtƒ}|tksBt‚W n   |j	ƒ  ‚ Y nX W d |j
dƒ\}}X |dks|t‚|t|ƒksŒt‚d S )NT)Ú
overlappedFr   )Ú_winapiZ	WriteFiler4   ÚERROR_IO_PENDINGÚWaitForMultipleObjectsÚeventr   r   ÚAssertionErrorÚcancelÚGetOverlappedResultrI   )r7   rK   ÚovÚerrÚwaitresZnwrittenr   r   r   rJ     s    
zPipeConnection._send_bytesNc       	      C   s  | j rd| _ tjƒ S |d kr dnt|dƒ}y¬tj| j|dd�\}}zHy,|tjkrntj|j	gdt
ƒ}|tksnt‚W n   |jƒ  ‚ Y nX W d |jdƒ\}}|dkr¼tjƒ }|j|jƒ ƒ |S |tjkrÒ| j||ƒS X W n: tk
�r } z|jtjk� rþt‚n‚ W Y d d }~X nX tdƒ‚d S )NFé€   T)rm   r   z.shouldn't get here; expected KeyboardInterrupt)Ú_got_empty_messageÚioÚBytesIOÚminrn   ÚReadFiler4   ro   rp   rq   r   r   rr   rs   rt   Úwriter^   ZERROR_MORE_DATAÚ_get_more_datar>   ÚwinerrorÚERROR_BROKEN_PIPEÚEOFErrorÚRuntimeError)	r7   ÚmaxsizeZbsizeru   rv   rw   ZnreadÚfÚer   r   r   rU   *  s6    


zPipeConnection._recv_bytesc             C   s.   | j stj| jƒd dkrdS tt| g|ƒƒS )Nr   T)ry   rn   ÚPeekNamedPiper4   Úboolr   )r7   r   r   r   r   ra   J  s    zPipeConnection._pollc             C   s¤   |j ƒ }tjƒ }|j|ƒ tj| jƒd }|dks6t‚|d k	rVt|ƒ| |krV| j	ƒ  tj
| j|dd�\}}|jdƒ\}}|dks†t‚||ks’t‚|j|j ƒ ƒ |S )Nr   r   T)rm   )r^   rz   r{   r~   rn   r‡   r4   rr   rI   rC   r}   rt   )r7   ru   r„   rK   r…   Úleftrv   Zrbytesr   r   r   r   P  s    
zPipeConnection._get_more_data)N)rh   ri   rj   Ú__doc__ry   rn   ÚCloseHandler<   rJ   rU   ra   r   r   r   r   r   rl     s   
 rl   c               @   s|   e Zd ZdZer,ejfdd„ZejZ	ej
Znejfdd„ZejZ	ejZe	fdd„Zefdd„Zd	d
„ Zddd„Zdd„ ZdS )Ú
Connectionzo
    Connection class based on an arbitrary file descriptor (Unix only), or
    a socket handle (Windows).
    c             C   s   || j ƒ d S )N)r4   )r7   r<   r   r   r   r<   g  s    zConnection._closec             C   s   || j ƒ d S )N)r4   )r7   r<   r   r   r   r<   l  s    c             C   s<   t |ƒ}x.|| j|ƒ}||8 }|dkr(P ||d … }q
W d S )Nr   )rI   r4   )r7   rK   r~   Ú	remainingrO   r   r   r   Ú_sendq  s    zConnection._sendc             C   sf   t jƒ }| j}|}xN|dkr`|||ƒ}t|ƒ}|dkrL||krDt‚ntdƒ‚|j|ƒ ||8 }qW |S )Nr   zgot end of file during message)rz   r{   r4   rI   r‚   r>   r~   )r7   rM   ÚreadrK   r8   r�   ÚchunkrO   r   r   r   Ú_recvz  s    


zConnection._recvc             C   sD   t |ƒ}tjd|ƒ}|dkr2| j|ƒ | j|ƒ n| j|| ƒ d S )Nz!ii @  )rI   ÚstructZpackrŽ   )r7   rK   rO   Úheaderr   r   r   rJ   Š  s    
zConnection._send_bytesNc             C   s:   | j dƒ}tjd|jƒ ƒ\}|d k	r0||kr0d S | j |ƒS )Né   z!i)r‘   r’   ZunpackrV   )r7   r„   rK   rM   r   r   r   rU   š  s
    
zConnection._recv_bytesc             C   s   t | g|ƒ}t|ƒS )N)r   rˆ   )r7   r   Úrr   r   r   ra   ¡  s    zConnection._poll)N)rh   ri   rj   rŠ   rn   Ú_multiprocessingZclosesocketr<   rT   Z_writer_   Z_readr    rB   r~   r�   rŽ   r‘   rJ   rU   ra   r   r   r   r   rŒ   `  s   	
rŒ   c               @   sR   e Zd ZdZddd„Zdd„ Zdd	„ Zed
d„ ƒZedd„ ƒZ	dd„ Z
dd„ ZdS )r   z•
    Returns a listener object.

    This is a wrapper for a bound socket which is 'listening' for
    connections, or for a Windows named pipe.
    Nr   c             C   sr   |p|rt |ƒpt}|pt|ƒ}t|ƒ |dkr>t||ƒ| _nt|||ƒ| _|d k	rht|tƒ rht	dƒ‚|| _
d S )Nr   zauthkey should be a byte string)r1   Údefault_familyr&   r+   ÚPipeListenerÚ	_listenerÚSocketListenerÚ
isinstancerH   Ú	TypeErrorÚ_authkey)r7   r0   r%   ÚbacklogÚauthkeyr   r   r   r;   ±  s    zListener.__init__c             C   s>   | j dkrtdƒ‚| j jƒ }| jr:t|| jƒ t|| jƒ |S )zz
        Accept a connection on the bound socket or named pipe of `self`.

        Returns a `Connection` object.
        Nzlistener is closed)r™   r>   Úacceptr�   Údeliver_challengeÚanswer_challenge)r7   Úcr   r   r   r    Á  s    

zListener.acceptc             C   s    | j }|dk	rd| _ |jƒ  dS )zA
        Close the bound socket or named pipe of `self`.
        N)r™   rB   )r7   Zlistenerr   r   r   rB   Ï  s    zListener.closec             C   s   | j jS )N)r™   Ú_address)r7   r   r   r   Ú<lambda>Ø  s    zListener.<lambda>c             C   s   | j jS )N)r™   Ú_last_accepted)r7   r   r   r   r¥   Ù  s    c             C   s   | S )Nr   )r7   r   r   r   rc   Û  s    zListener.__enter__c             C   s   | j ƒ  d S )N)rB   )r7   rd   re   rf   r   r   r   rg   Þ  s    zListener.__exit__)NNr   N)rh   ri   rj   rŠ   r;   r    rB   rk   r0   Zlast_acceptedrc   rg   r   r   r   r   r   ª  s   
	c             C   sj   |p
t | ƒ}t|ƒ |dkr&t| ƒ}nt| ƒ}|dk	rJt|tƒ rJtdƒ‚|dk	rft||ƒ t||ƒ |S )z=
    Returns a connection to the address of a `Listener`
    r   Nzauthkey should be a byte string)	r1   r+   Ú
PipeClientÚSocketClientr›   rH   rœ   r¢   r¡   )r0   r%   rŸ   r£   r   r   r   r   â  s    


Tc             C   sj   | r>t jƒ \}}|jdƒ |jdƒ t|jƒ ƒ}t|jƒ ƒ}n$tjƒ \}}t|dd�}t|dd�}||fS )zL
        Returns pair of connection objects at either end of a pipe
        TF)r:   )r9   )r*   Z
socketpairÚsetblockingrŒ   Údetachr    Úpipe)ÚduplexÚs1Ús2Úc1Úc2Zfd1Zfd2r   r   r   r   ù  s    

c          	   C   sî   t dƒ}| r*tj}tjtjB }tt }}ntj}tj}dt }}tj||tjB tj	B tj
tjB tjB d||tjtjƒ}tj||dtjtjtjtjƒ}tj|tjddƒ tj|dd�}|jdƒ\}	}
|
dksÎt‚t|| d�}t|| d�}||fS )	zL
        Returns pair of connection objects at either end of a pipe
        r   r   r   NT)rm   )r:   )r9   )r&   rn   ÚPIPE_ACCESS_DUPLEXÚGENERIC_READÚGENERIC_WRITEÚBUFSIZEZPIPE_ACCESS_INBOUNDÚCreateNamedPipeÚFILE_FLAG_OVERLAPPEDÚFILE_FLAG_FIRST_PIPE_INSTANCEÚPIPE_TYPE_MESSAGEÚPIPE_READMODE_MESSAGEÚ	PIPE_WAITÚNMPWAIT_WAIT_FOREVERÚNULLÚ
CreateFileÚOPEN_EXISTINGÚSetNamedPipeHandleStateÚConnectNamedPipert   rr   rl   )r¬   r0   ZopenmodeÚaccessZobsizeZibsizeZh1Zh2rm   Ú_rv   r¯   r°   r   r   r   r     s4    



c               @   s*   e Zd ZdZd
dd„Zdd„ Zdd„ Zd	S )rš   zO
    Representation of a socket which is bound to an address and listening
    r   c             C   s¾   t j tt |ƒƒ| _yRtjdkr2| jjt jt jdƒ | jjdƒ | jj	|ƒ | jj
|ƒ | jjƒ | _W n  tk
r„   | jjƒ  ‚ Y nX || _d | _|dkr´tj| tj|fdd�| _nd | _d S )NÚposixr   Tr   r   )ÚargsÚexitpriority)r*   ÚgetattrÚ_socketr    ÚnameZ
setsockoptZ
SOL_SOCKETZSO_REUSEADDRr©   ZbindZlistenZgetsocknamer¤   r>   rB   Z_familyr¦   r   ÚFinalizeÚunlinkÚ_unlink)r7   r0   r%   rž   r   r   r   r;   <  s$    



zSocketListener.__init__c             C   s&   | j jƒ \}| _|jdƒ t|jƒ ƒS )NT)rÇ   r    r¦   r©   rŒ   rª   )r7   Úsr   r   r   r    T  s    
zSocketListener.acceptc             C   s0   z| j jƒ  W d | j}|d k	r*d | _|ƒ  X d S )N)rÇ   rB   rË   )r7   rÊ   r   r   r   rB   Y  s    zSocketListener.closeN)r   )rh   ri   rj   rŠ   r;   r    rB   r   r   r   r   rš   8  s   
rš   c          	   C   sD   t | ƒ}tjtt|ƒƒ�"}|jdƒ |j| ƒ t|jƒ ƒS Q R X dS )zO
    Return a connection object connected to the socket given by `address`
    TN)r1   r*   rÆ   r©   ZconnectrŒ   rª   )r0   r%   rÌ   r   r   r   r¨   c  s
    

r¨   c               @   s8   e Zd ZdZddd„Zddd„Zdd	„ Zed
d„ ƒZdS )r˜   z0
        Representation of a named pipe
        Nc             C   sL   || _ | jdd�g| _d | _tjd| j ƒ tj| tj| j| j fdd�| _	d S )NT)Úfirstz listener created with address=%rr   )rÄ   rÅ   )
r¤   Ú_new_handleÚ_handle_queuer¦   r   Ú	sub_debugrÉ   r˜   Ú_finalize_pipe_listenerrB   )r7   r0   rž   r   r   r   r;   w  s    zPipeListener.__init__Fc          	   C   sH   t jt jB }|r|t jO }t j| j|t jt jB t jB t j	t
t
t jt jƒS )N)rn   r±   r¶   r·   rµ   r¤   r¸   r¹   rº   ZPIPE_UNLIMITED_INSTANCESr´   r»   r¼   )r7   rÍ   Úflagsr   r   r   rÎ   ‚  s    

zPipeListener._new_handlec             C   sÂ   | j j| jƒ ƒ | j jdƒ}ytj|dd�}W n0 tk
r^ } z|jtjkrN‚ W Y d d }~X n\X z<ytj	|j
gdtƒ}W n    |jƒ  tj|ƒ ‚ Y nX W d |jdƒ\}}|dks¸t‚X t|ƒS )Nr   T)rm   F)rÏ   ÚappendrÎ   Úpoprn   rÀ   r>   r€   ZERROR_NO_DATArp   rq   r   rs   r‹   rt   rr   rl   )r7   r8   ru   r†   ÚresrÂ   rv   r   r   r   r    Ž  s"    
zPipeListener.acceptc             C   s(   t jd|ƒ x| D ]}tj|ƒ qW d S )Nz closing listener with address=%r)r   rÐ   rn   r‹   )Zqueuer0   r8   r   r   r   rÑ   ¥  s    
z$PipeListener._finalize_pipe_listener)N)F)	rh   ri   rj   rŠ   r;   rÎ   r    ÚstaticmethodrÑ   r   r   r   r   r˜   s  s
   

r˜   c             C   s    t ƒ }x~y6tj| dƒ tj| tjtjB dtjtjtjtjƒ}W n> t	k
r| } z"|j
tjtjfksjt|ƒrl‚ W Y dd}~X qX P qW ‚ tj|tjddƒ t|ƒS )zU
        Return a connection object connected to the pipe given by `address`
        iè  r   N)r   rn   ZWaitNamedPiper½   r²   r³   r¼   r¾   r¶   r>   r€   ZERROR_SEM_TIMEOUTZERROR_PIPE_BUSYr   r¿   r¹   rl   )r0   r   Úhr†   r   r   r   r§   «  s"    
r§   é   s   #CHALLENGE#s	   #WELCOME#s	   #FAILURE#c             C   st   dd l }t|tƒst‚tjtƒ}| jt| ƒ |j	||t
ƒjƒ }| jdƒ}||kr^| jtƒ n| jtƒ tdƒ‚d S )Nr   é   zdigest received was wrong)Úhmacr›   rH   rr   r    ÚurandomÚMESSAGE_LENGTHrP   Ú	CHALLENGEÚnewÚHMAC_DIGEST_NAMEÚdigestrW   ÚWELCOMEÚFAILUREr   )Ú
connectionrŸ   rÚ   Úmessagerà   Úresponser   r   r   r¡   Ð  s    


r¡   c             C   sŠ   dd l }t|tƒst‚| jdƒ}|d ttƒ… tks@td| ƒ‚|ttƒd … }|j||tƒj	ƒ }| j
|ƒ | jdƒ}|tkr†tdƒ‚d S )Nr   rÙ   zmessage = %rzdigest sent was rejected)rÚ   r›   rH   rr   rW   rI   rÝ   rÞ   rß   rà   rP   rá   r   )rã   rŸ   rÚ   rä   rà   rå   r   r   r   r¢   Ý  s    
 

r¢   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚConnectionWrapperc             C   s:   || _ || _|| _x"dD ]}t||ƒ}t| ||ƒ qW d S )NrE   rB   rb   rW   rP   )rE   rB   rb   rW   rP   )Ú_connÚ_dumpsÚ_loadsrÆ   Úsetattr)r7   ÚconnrR   r]   ÚattrrS   r   r   r   r;   î  s    

zConnectionWrapper.__init__c             C   s   | j |ƒ}| jj|ƒ d S )N)rè   rç   rP   )r7   rS   rÌ   r   r   r   rT   õ  s    
zConnectionWrapper.sendc             C   s   | j jƒ }| j|ƒS )N)rç   rW   ré   )r7   rÌ   r   r   r   r_   ø  s    
zConnectionWrapper.recvN)rh   ri   rj   r;   rT   r_   r   r   r   r   ræ   í  s   ræ   c             C   s   t j| fd d d dƒjdƒS )Nr   zutf-8)Ú	xmlrpclibrR   Úencode)rS   r   r   r   Ú
_xml_dumpsü  s    rï   c             C   s   t j| jdƒƒ\\}}|S )Nzutf-8)rí   r]   Údecode)rÌ   rS   Úmethodr   r   r   Ú
_xml_loadsÿ  s    rò   c               @   s   e Zd Zdd„ ZdS )ÚXmlListenerc             C   s    dd l jatj| ƒ}t|ttƒS )Nr   )Úxmlrpc.clientÚclientrí   r   r    ræ   rï   rò   )r7   rS   r   r   r   r      s    

zXmlListener.acceptN)rh   ri   rj   r    r   r   r   r   ró     s   ró   c              O   s   dd l jatt| |ŽttƒS )Nr   )rô   rõ   rí   ræ   r   rï   rò   )rÄ   Úkwdsr   r   r   Ú	XmlClient
  s    
r÷   c             C   s²   t | ƒ}g }x |r¬tj|d|ƒ}|tkr,P n\t|  koFtt|ƒ k n  rV|t8 }n2t|  koptt|ƒ k n  r€|t8 }ntdƒ‚|j|| ƒ ||d d … }d}qW |S )NFzShould not get herer   r   )	Úlistrn   rp   r   r   rI   r   rƒ   rÓ   )Zhandlesr   ÚLÚreadyrÕ   r   r   r   Ú_exhaustive_wait  s     
 
rû   c       
   .      sn  |dkrt }n|dk rd}nt|d d ƒ}t| ƒ} i ‰g }tƒ ‰ tƒ }�zH�x2| D �](}yt|dƒ}W n  tk
rˆ   |ˆ|jƒ < Y qTX ytj|ƒ ddƒ\}}W n8 t	k
rÚ } zd|j
 }}|tkrÊ‚ W Y dd}~X nX |tjkrü|j|ƒ |ˆ|j< qT|�rptjƒ dd… dk�rpy|jd	ƒ\}	}W n* t	k
�rT } z|j
}W Y dd}~X nX | �rpt|d
ƒ�rpd|_ˆ j|ƒ d}qTW tˆjƒ |ƒ}W dx|D ]}|jƒ  �qšW x”|D ]Œ}y|jdƒ\}	}W n6 t	k
�rþ } z|j
}|tk�rî‚ W Y dd}~X nX |tjk�r²ˆ|j }ˆ j|ƒ |dk�r²t|d
ƒ�r²d|_�q²W X ˆ j‡fdd„|D ƒƒ ‡ fdd„| D ƒS )z—
        Wait till an object in object_list is ready/readable.

        Returns list of those objects in object_list which are ready/readable.
        Nr   iè  g      à?rE   Té   é   Fry   c             3   s   | ]}ˆ | V  qd S )Nr   )Ú.0r×   )Úwaithandle_to_objr   r   ú	<genexpr>v  s    zwait.<locals>.<genexpr>c                s   g | ]}|ˆ kr|‘qS r   r   )rþ   Úo)Úready_objectsr   r   ú
<listcomp>w  s    zwait.<locals>.<listcomp>)rý   rü   )r   Úintrø   ÚsetrÆ   ÚAttributeErrorr3   rn   r}   r>   r€   Ú_ready_errorsro   rÓ   rq   r'   Zgetwindowsversionrt   r)   ry   Úaddrû   Úkeysrs   ZERROR_OPERATION_ABORTEDÚupdate)
Úobject_listr   Zov_listZready_handlesr  rE   ru   rv   r†   rÂ   r   )r  rÿ   r   r   +  sh    








ÚPollSelectorc             C   sˆ   t ƒ �x}x| D ]}|j|tjƒ qW |dk	r8tjƒ | }x@|j|ƒ}|rVdd„ |D ƒS |dk	r:|tjƒ  }|dk r:|S q:W W dQ R X dS )z—
        Wait till an object in object_list is ready/readable.

        Returns list of those objects in object_list which are ready/readable.
        Nc             S   s   g | ]\}}|j ‘qS r   )Zfileobj)rþ   ÚkeyZeventsr   r   r   r  •  s    zwait.<locals>.<listcomp>r   )Ú_WaitSelectorÚregisterÚ	selectorsZ
EVENT_READr   r   Zselect)r  r   ZselectorrS   Zdeadlinerú   r   r   r   r   …  s    

c             C   sN   | j ƒ }tj|tjtjƒ�*}ddlm} |j|ƒ}t|| j	| j
ffS Q R X d S )Nr   )Úresource_sharer)rE   r*   Zfromfdr   ZSOCK_STREAMr   r  Z	DupSocketÚrebuild_connectionr9   r:   )rë   r8   rÌ   r  Údsr   r   r   Úreduce_connection¡  s
    
r  c             C   s   | j ƒ }t|j ƒ ||ƒS )N)rª   rŒ   )r  r9   r:   Zsockr   r   r   r  §  s    r  c             C   sB   | j rtjnd| jrtjndB }tj| jƒ |ƒ}t|| j | jffS )Nr   )	r9   rn   ZFILE_GENERIC_READr:   ZFILE_GENERIC_WRITEr
   Z	DupHandlerE   Úrebuild_pipe_connection)rë   rÁ   Údhr   r   r   Úreduce_pipe_connection¬  s    r  c             C   s   | j ƒ }t|||ƒS )N)rª   rl   )r  r9   r:   r8   r   r   r   r  ±  s    r  c             C   s    t j| jƒ ƒ}t|| j| jffS )N)r
   ZDupFdrE   r  r9   r:   )rë   Údfr   r   r   r  ·  s    c             C   s   | j ƒ }t|||ƒS )N)rª   rŒ   )r  r9   r:   Úfdr   r   r   r  º  s    )NN)T)T)N)N)JÚ__all__rz   r    r'   r*   r’   r   r   Ú	itertoolsr–   r   r   r   r	   Úcontextr
   ZForkingPicklerrQ   rn   r   r   r   r   ÚImportErrorr(   r´   ZCONNECTION_TIMEOUTrß   Úcountr#   r—   Zfamiliesr)   r   r   r&   r+   r1   r2   rl   rŒ   Úobjectr   r   r   rš   r¨   r˜   r§   rÜ   rÝ   rá   râ   r¡   r¢   ræ   rï   rò   ró   r÷   rû   r�   ZERROR_NETNAME_DELETEDr  r   r  r  r  ZSelectSelectorr  r  r  r  r  r   r   r   r   Ú<module>
   s¤   



 PJ8

,+8	P
