
][\jw                 @   sX  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 d d	 l
 m Z m Z d d
 l m Z y2 d d l Z d d l m Z m Z m Z m Z Wn- e k
 r%e j d k r  n  d Z Yn Xd Z d Z e j   Z d Z d g Z e e d  rrd Z e d g 7Z n  e j d k rd Z e d g 7Z n  e d d  Z d d   Z d d   Z  d d   Z! d d   Z" Gd d   d  Z# e rGd d   d e#  Z$ n  Gd  d!   d! e#  Z% Gd" d   d e&  Z' d d d# d   Z( e j d k rgd$ d% d  Z) n d$ d& d  Z) Gd' d(   d( e&  Z* d) d*   Z+ e j d k rGd+ d,   d, e&  Z, d- d.   Z- n  d/ Z. d0 Z/ d1 Z0 d2 Z1 d3 d4   Z2 d5 d6   Z3 Gd7 d8   d8 e&  Z4 d9 d:   Z5 d; d<   Z6 Gd= d>   d> e'  Z7 d? d@   Z8 e j d k rdA dB   Z9 e j: e j; h Z< d dC d  Z= n? d d l> Z> e e> dD  re> j? Z@ n	 e> jA Z@ d dE d  Z= e j d k r,dF dG   ZB dH dI   ZC e jD e% eB  dJ dK   ZE dL dM   ZF e jD e$ eE  n( dN dG   ZB dO dI   ZC e jD e% eB  d S)PClientListenerPipewait    N   )	reduction)util)AuthenticationErrorBufferTooShort)ForkingPickler)WAIT_OBJECT_0WAIT_ABANDONED_0WAIT_TIMEOUTINFINITEwin32i    g      4@AF_INETAF_UNIXAF_PIPEc             C   s   t  j    |  S)N)time)timeout r   0/usr/lib/python3.4/multiprocessing/connection.py_init_timeout;   s    r   c             C   s   t  j    |  k S)N)r   )tr   r   r   _check_timeout>   s    r   c             C   s   |  d k r d S|  d k r8 t  j d d d t j    S|  d k rp t  j d d	 t j   t t  f d d
  St d   d S)z?
    Return an arbitrary free address for the given family
    r   	localhostr   r   prefixz	listener-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_addressE   s     r&   c             C   sr   t  j d k r. |  d k r. t d |    n  t  j d k rn |  d k rn t t |   sn t d |    qn n  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_familyS   s
    r+   c             C   se   t  |   t k r d St  |   t k r; |  j d  r; d St  |   t k rQ d St 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_type_   s    !r1   c               @   s!  e  Z d  Z d Z d 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 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)+_ConnectionBaseNTc             C   sc   | j    } | d k  r' t d   n  | rD | rD t d   n  | |  _ | |  _ | |  _ 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__u   s    		z_ConnectionBase.__init__c             C   s    |  j  d  k	 r |  j   n  d  S)N)r4   _close)r7   r   r   r   __del__   s    z_ConnectionBase.__del__c             C   s"   |  j  d  k r t d   n  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   n  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   n  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   s1   |  j  d k	 r- z |  j   Wd d |  _  Xn  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 rD t t |   } n  t |  } | d k  rk t d   n  | | k  r t d   n  | d k r | | } n: | d k  r t d   n | | | k r t d   n  |  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   r   dumps)r7   objr   r   r   send   s    

z_ConnectionBase.sendc             C   sm   |  j    |  j   | d k	 r; | d k  r; t d   n  |  j |  } | d k rc |  j   n  | 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  rW t d   n | | k rr t d   n  |  j   } | j   } | | | k  r t | j	     n  | j
 d  | j | | | | | |   | SWd QXd S)zr
        Receive bytes data into a writeable buffer-like object.
        Return the number of bytes read.
        r   znegative offsetzoffset too largeN)r?   r@   rF   rG   rI   r$   rT   tellr
   rU   seekreadinto)r7   rK   rL   rN   rG   ZbytesizeresultrM   r   r   r   recv_bytes_into   s"    

	z_ConnectionBase.recv_bytes_intoc             C   s3   |  j    |  j   |  j   } t j | j    S)zReceive a (picklable) object)r?   r@   rT   r   loads	getbuffer)r7   rK   r   r   r   recv   s    

z_ConnectionBase.recvg        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__)__name__
__module____qualname__r4   r;   r=   r?   r@   rA   rC   propertyrD   r9   r:   rE   rB   rP   rS   rV   r[   r^   r`   ra   re   r   r   r   r   r2   r   s(   r2   c               @   sa   e  Z d  Z d Z d Z e j 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 \ } } z_ yC | t  j k rf t  j | j g d t  } | t k sf t  n  Wn | j	     Yn XWd  | j
 d  \ } } X| d k s t  | t |  k s t  d  S)N
overlappedTFr   )_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 \ } } z_ yC | t j k r t j | j	 g d t
  } | t k s t  n  Wn | j     Yn XWd  | j d  \ } } | d k rt j   } | j | j    | S| t j k r&|  j | |  SXWnC t k
 rm} z# | j t j k rXt  n   WYd  d  } ~ Xn Xt d   d  S)NF   rk   Tr   z.shouldn't get here; expected KeyboardInterrupt)_got_empty_messageioBytesIOminrl   ReadFiler4   rm   rn   ro   r   r   rp   rq   rr   writer]   ZERROR_MORE_DATA_get_more_datar>   winerrorERROR_BROKEN_PIPEEOFErrorRuntimeError)	r7   maxsizeZbsizers   rt   ru   Znreadfer   r   r   rT   &  s6    		
!
	zPipeConnection._recv_bytesc             C   s?   |  j  s% t j |  j  d d k r) d St t |  g |   S)Nr   T)rw   rl   PeekNamedPiper4   boolr   )r7   r   r   r   r   r_   F  s    	zPipeConnection._pollc             C   s   | j    } t j   } | j |  t j |  j  d } | d k sM t  | d  k	 r| t |  | | k r| |  j	   n  t j
 |  j | d d \ } } | j d  \ } } | d k s t  | | k s t  | j | j     | S)Nr   r   rk   T)r]   rx   ry   r|   rl   r   r4   rp   rI   rC   r{   rr   )r7   rs   r   rK   r   leftrt   Zrbytesr   r   r   r}   L  s    "!zPipeConnection._get_more_data)rf   rg   rh   __doc__rw   rl   CloseHandler<   rJ   rT   r_   r}   r   r   r   r   rj     s    rj   c               @   s   e  Z d  Z d Z e r? e j d d  Z e j Z	 e j
 Z n$ e j d d  Z e j Z	 e j Z e	 d d  Z e 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<   c  s    zConnection._closec             C   s   | |  j   d  S)N)r4   )r7   r<   r   r   r   r<   h  s    c             C   sn   t  |  } x[ y | |  j |  } Wn t k
 r< w Yn X| | 8} | d k rW Pn  | | d   } q d  S)Nr   )rI   r4   InterruptedError)r7   rK   r|   	remainingrO   r   r   r   _sendm  s    
zConnection._sendc             C   s   t  j   } |  j } | } x | d k r y | | |  } Wn t k
 rT w Yn Xt |  } | d k r | | k r t  q t d   n  | j |  | | 8} q W| S)Nr   zgot end of file during message)rx   ry   r4   r   rI   r   r>   r|   )r7   rM   readrK   r8   r   chunkrO   r   r   r   _recvy  s     		zConnection._recvc             C   s   t  |  } t j d |  } | d k r9 | | g } n% | d k rU | | g } n	 | g } x | D] } |  j |  qe Wd  S)Nz!ii @  r   )rI   structZpackr   )r7   rK   rO   headerZchunksr   r   r   r   rJ     s    	zConnection._send_bytesNc             C   sS   |  j  d  } t j d | j    \ } | d  k	 rF | | k rF d  S|  j  |  S)N   z!i)r   r   ZunpackrU   )r7   r   rK   rM   r   r   r   rT     s
    zConnection._recv_bytesc             C   s   t  |  g |  } t |  S)N)r   r   )r7   r   rr   r   r   r_     s    zConnection._poll)rf   rg   rh   r   rl   _multiprocessingZclosesocketr<   rS   Z_writer^   Z_readr    rB   r|   r   r   r   rJ   rT   r_   r   r   r   r   r   \  s   			r   c               @   s   e  Z d  Z d Z d d d 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   s   | p | r t  |  p t } | p- t |  } t |  | d k r[ t | |  |  _ n t | | |  |  _ | d  k	 r t | t  r t	 d   n  | |  _
 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   n  |  j  j   } |  j rY t | |  j  t | |  j  n  | 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( |  j  j   d |  _  n  d S)zA
        Close the bound socket or named pipe of `self`.
        N)r   rB   )r7   r   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   ra     s    zListener.__enter__c             C   s   |  j    d  S)N)rB   )r7   rb   rc   rd   r   r   r   re     s    zListener.__exit__)rf   rg   rh   r   r;   r   rB   ri   r0   Zlast_acceptedra   re   r   r   r   r   r     s   c             C   s   | p t  |   } t |  | d k r7 t |   } n t |   } | d k	 rn t | t  rn t d   n  | d k	 r t | |  t | |  n  | 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   s   |  rY t  j   \ } } | j d  | j d  t | j    } t | j    } n6 t j   \ } } t | d d } t | d d } | | f S)zL
        Returns pair of connection objects at either end of a pipe
        Tr:   Fr9   )r*   Z
socketpairsetblockingr   detachr    pipe)duplexs1s2c1c2Zfd1Zfd2r   r   r   r     s    c          	   C   sS  t  d  } |  r; t j } t j t j B} t t } } n t j } t j } d t } } t j | | t j Bt j	 Bt j
 t j Bt j Bd | | 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   Nrk   Tr:   r9   )r&   rl   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ConnectNamedPiperr   rp   rj   )r   r0   ZopenmodeaccessZobsizeZibsizeZh1Zh2rk   _rt   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  |   |  _ yt t j d k rL |  j j t  j t  j d  n  |  j j d  |  j j	 |  |  j j
 |  |  j j   |  _ Wn" t k
 r |  j j     Yn X| |  _ d  |  _ | d k r t j |  t j d | f d d |  _ n	 d  |  _ d  S)Nposixr   Tr   argsexitpriorityr   )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   sU   x5 y |  j  j   \ } |  _ Wn t k
 r3 Yq XPq | j d  t | j    S)NT)r   r   r   r   r   r   r   )r7   sr   r   r   r   X  s    zSocketListener.acceptc             C   s-   |  j  j   |  j d  k	 r) |  j   n  d  S)N)r   rB   r   )r7   r   r   r   rB   c  s    zSocketListener.closeN)rf   rg   rh   r   r;   r   rB   r   r   r   r   r   <  s   r   c          	   C   s[   t  |   } t j t t |   1 } | j d  | j |   t | j    SWd QXd 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   i  s
    r   c               @   sR   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   sq   | |  _  |  j d d  g |  _ d  |  _ t j d |  j   t j |  t j d |  j |  j  f d d |  _	 d  S)NfirstTz 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;   }  s    		zPipeListener.__init__Fc          	   C   se   t  j t  j B} | r& | t  j O} n  t  j |  j | t  j t  j Bt  j Bt  j	 t
 t
 t  j t  j  S)N)rl   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 } Wn= t k
 r } z | j t j k rn   n  WYd  d  } ~ Xnt XzH y t j	 | j
 g d t  } Wn" | j   t j |    Yn XWd  | j d  \ } } | d k s t  Xt |  S)Nr   rk   TF)r   appendr   poprl   r   r>   r~   ZERROR_NO_DATArn   ro   r   rq   r   rr   rp   rj   )r7   r8   rs   r   resr   rt   r   r   r   r     s"    
zPipeListener.acceptc             C   s2   t  j d |  x |  D] } t j |  q Wd  S)Nz closing listener with address=%r)r   r   rl   r   )Zqueuer0   r8   r   r   r   r     s    z$PipeListener._finalize_pipe_listener)	rf   rg   rh   r   r;   r   r   staticmethodr   r   r   r   r   r   y  s
   r   c             C   s   t    } x yK t j |  d  t j |  t j t j Bd t j t j t j t j  } WnR t	 k
 r } z2 | j
 t j t j f k s t |  r   n  WYd d } ~ Xq XPq   t j | t j d d  t |  S)zU
        Return a connection object connected to the pipe given by `address`
        i  r   N)r   rl   ZWaitNamedPiper   r   r   r   r   r   r>   r~   ZERROR_SEM_TIMEOUTZERROR_PIPE_BUSYr   r   r   rj   )r0   r   hr   r   r   r   r     s"    	r      s   #CHALLENGE#s	   #WELCOME#s	   #FAILURE#c             C   s   d d  l  } t | t  s! t  t j t  } |  j t |  | j	 | | d  j
   } |  j d  } | | k r |  j t  n |  j t  t d   d  S)Nr   md5   zdigest received was wrong)hmacr   rH   rp   r    urandomMESSAGE_LENGTHrP   	CHALLENGEnewdigestrV   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 | | d  j   } |  j	 |  |  j d  } | t
 k r t d   n  d  S)Nr   r   zmessage = %rr   zdigest sent was rejected)r   r   rH   rp   rV   rI   r   r   r   rP   r   r	   )r   r   r   r   r   r   r   r   r   r     s    ,r   c               @   s4   e  Z d  Z d d   Z d d   Z d d   Z d S)ConnectionWrapperc             C   sO   | |  _  | |  _ | |  _ x- d D]% } t | |  } t |  | |  q" Wd  S)NrE   rB   r`   rV   rP   )zfilenozclosezpollz
recv_bytesz
send_bytes)_conn_dumps_loadsr   setattr)r7   connrQ   r\   attrrR   r   r   r   r;     s    			zConnectionWrapper.__init__c             C   s#   |  j  |  } |  j j |  d  S)N)r   r   rP   )r7   rR   r   r   r   r   rS     s    zConnectionWrapper.sendc             C   s   |  j  j   } |  j |  S)N)r   rV   r   )r7   r   r   r   r   r^     s    zConnectionWrapper.recvN)rf   rg   rh   r;   rS   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)	xmlrpclibrQ   encode)rR   r   r   r   
_xml_dumps  s    r   c             C   s%   t  j |  j d   \ \ } } | S)Nzutf-8)r   r\   decode)r   rR   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   rR   r   r   r   r   
  s    zXmlListener.acceptN)rf   rg   rh   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@ Pnr t | k oa t t |  k  n rs | t 8} n? t | k o t t |  k  n r | t 8} n t d   | j | |  | | d d   } d } q W| S)NFzShould not get herer   r   )	listrl   rn   r   r   rI   r   r   r   )Zhandlesr   Lreadyr   r   r   r   _exhaustive_wait  s    	&&
r   c       
          s  | d k r t  } n) | d k  r* d } n t | d d  } t |   }  i   g  } t     t   } zx |  D] } y t | d  } Wn" t k
 r |  | j   <Yqr Xy" t j |   d d  \ } } Wn@ t	 k
 r} z  | j
 } | t k r  n  WYd d } ~ Xn X| t j k rA| j |  |  | j <qr   j |  d } qr Wt  j   |  } Wd x | D] } | j   qxWx | D] } y | j d  \ }	 } Wn@ t	 k
 r} z  | j
 } | t k r  n  WYd d } ~ Xn X| t j k r | j }   j |  | d k rKt | d  rHd | _ qHqKqqWX  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   Trw   c             3   s   |  ] }   | Vq d  S)Nr   ).0r   )waithandle_to_objr   r   	<genexpr>s  s    zwait.<locals>.<genexpr>c                s"   g  |  ] } |   k r |  q Sr   r   )r   o)ready_objectsr   r   
<listcomp>t  s   	 zwait.<locals>.<listcomp>)r   intr   setr   AttributeErrorr3   rl   r{   r>   r~   _ready_errorsrm   r   ro   addr   keysrq   rr   ZERROR_OPERATION_ABORTEDr)   rw   update)
object_listr   Zov_listZready_handlesr   rE   rs   rt   r   r   r   )r   r   r   r   1  sZ    				"	
	 PollSelectorc             C   s   t     } x! |  D] } | j | t j  q W| d k	 rO t j   | } n  xX | j |  } | rx d d   | D S| d k	 rR | t j   } | d k  r | SqR qR Wd QXd 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 Sr   )Zfileobj)r   keyZeventsr   r   r   r     s   	 zwait.<locals>.<listcomp>r   )_WaitSelectorregister	selectorsZ
EVENT_READr   Zselect)r  r   ZselectorrR   Zdeadliner   r   r   r   r     s    c             C   sl   |  j    } t j | t j t j  ? } d d l m } | j |  } t | |  j	 |  j
 f f SWd  QXd  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   s_   |  j  r t j n d |  j r' t j n d B} t j |  j   |  } t | |  j  |  j f f S)Nr   )	r9   rl   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   rj   )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    )G__all__rx   r    r'   r*   r   r   r   	itertoolsr   r   r   r   r	   r
   r   rl   r   r   r   r   ImportErrorr(   r   ZCONNECTION_TIMEOUTcountr#   r   Zfamiliesr)   r   r   r&   r+   r1   r2   rj   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S7,-8	G	