U
    dA                     @   sv   d Z ddlZddlZddlZddlmZmZ eedoBej	d Z
eedeZeee ddd	ZG d
d dZdS )zSelect / poll helper    N)AnyOptionalpolljavaerror)excreturnc                 C   s$   t | dr| jS | jr | jd S d S )Nerrnor   )hasattrr	   args)r    r   :/tmp/pip-unpacked-wheel-oblwsawz/pymongo/socket_checker.py_errno_from_exception   s
    

r   c                   @   sF   e Zd ZddddZdeeeee eddd	Zeed
ddZ	dS )SocketCheckerN)r   c                 C   s   |  t rt | _nd | _d S )N)
_HAVE_POLLselectr   _poller)selfr   r   r   __init__%   s    zSocketChecker.__init__Fr   )sockreadwritetimeoutr   c              
   C   s  z| j rtjtjB }|r(|tjB tjB }|r6|tjB }| j || z.|dkrRdn|d }| j 	|}t
|W W S | j | X n8|r|gng }|r|gng }	t||	|g|}t|W S W q  ttfk
r }
 z"t|
tjtjfkrW Y q  W 5 d}
~
X Y q X q dS )zSelect for reads or writes with a timeout in seconds (or None).

        Returns True if the socket is readable/writable, False on timeout.
        Ni  )r   r   POLLERRPOLLHUPPOLLINPOLLPRIPOLLOUTregister
unregisterr   boolany_SelectErrorOSErrorr   r	   ZEINTREAGAIN)r   r   r   r   r   maskZtimeout_resZrlistZwlistr   r   r   r   r   ,   s*    	
zSocketChecker.select)r   r   c              	   C   sX   z| j |ddW S  ttfk
r*    Y n* tk
r>   Y dS  tk
rR   Y dS X dS )z?Return True if we know socket has been closed, False otherwise.T)r   N)r   RuntimeErrorKeyError
ValueError	Exception)r   r   r   r   r   socket_closedV   s    zSocketChecker.socket_closed)FFr   )
__name__
__module____qualname__r   r   r    r   floatr   r+   r   r   r   r   r   $   s           *r   )__doc__r	   r   systypingr   r   r
   platform
startswithr   getattrr#   r"   BaseExceptionintr   r   r   r   r   r   <module>   s   