U
    ~fh                     @  s   d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	 e
edoRejd ZeedeZdd	d
ddZG dd dZdS )zSelect / poll helper    )annotationsN)AnyOptionalcastpolljavaerrorBaseExceptionzOptional[int])excreturnc                 C  s0   t | drtt| jS | jr,tt| jd S d S )Nerrnor   )hasattrr   intr   args)r
    r   :/tmp/pip-unpacked-wheel-36gvocj8/pymongo/socket_checker.py_errno_from_exception   s
    
r   c                   @  sB   e Zd ZddddZddddd	dd
ddZdddddZdS )SocketCheckerNone)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   r   boolzOptional[float])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   r   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_closedW   s    zSocketChecker.socket_closedN)FFr   )__name__
__module____qualname__r   r   r0   r   r   r   r   r   %   s        *r   )__doc__
__future__r   r   r   systypingr   r   r   r   platform
startswithr   getattrr(   r'   r   r   r   r   r   r   <module>   s   