U
    dQ                     @   sB  d Z ddlZddlZddlZddlZddlmZmZ dZej	
eZejee ee dddZeej ddd	d
ZejdkreeddZee ddddZnee eej dddZee ddddZee ddddZedkr>eedrze  W n ek
r   Y nX eeejdd  ed dS )zSupport for spawning a daemon process.

PyMongo only attempts to spawn the mongocryptd daemon process when automatic
client-side field level encryption is enabled. See
:ref:`automatic-client-side-encryption` for more info.
    N)OptionalSequence
   )popentimeoutreturnc                 C   s,   z| j |dW S  tjk
r&   Y dS X dS )z,Implement wait timeout support for Python 3.)r   N)wait
subprocessTimeoutExpired)r   r    r   2/tmp/pip-unpacked-wheel-oblwsawz/pymongo/daemon.py_popen_wait!   s    r   )r   r   c                 C   s   | dk	rd| _ dS )zpSilence Popen's ResourceWarning.

    Note this should only be used if the process was created as a daemon.
    Nr   )
returncode)r   r   r   r   _silence_resource_warning*   s    
r   win32ZDETACHED_PROCESS   )argsr   c              
   C   s   z8t tjd"}tj| t|||d}t| W 5 Q R X W nB tk
rz } z$tj	d| d  d| t
dd W 5 d}~X Y nX dS )	z!Spawn a daemon process (Windows).r+b)creationflagsstdinstderrstdoutFailed to start r   +: is it on your $PATH?
Original exception:    
stacklevelN)openosdevnullr	   Popen_DETACHED_PROCESSr   FileNotFoundErrorwarningswarnRuntimeWarning)r   r   r   excr   r   r   _spawn_daemon<   s     r'   c              
   C   s   z:t tjd$}tj| d|||dW  5 Q R  W S Q R X W nB tk
r| } z$tjd| d  d| tdd W 5 d	}~X Y nX d	S )
z,Spawn the process and silence stdout/stderr.r   T)	close_fdsr   r   r   r   r   r   r   r   N)	r   r   r   r	   r    r"   r#   r$   r%   )r   r   r&   r   r   r   _spawn[   s         r)   c                 C   s0   t jtg}||  tj|dd}t|t dS )z7Spawn a daemon process using a double subprocess.Popen.T)r(   N)sys
executable
_THIS_FILEextendr	   r    r   _WAIT_TIMEOUT)r   Zspawner_argsZ	temp_procr   r   r   _spawn_daemon_double_popenj   s    

r/   c                 C   s   t jrt|  nt|  dS )zSpawn a daemon process (Unix).N)r*   r+   r/   r)   )r   r   r   r   r'   s   s    

__main__setsid   )__doc__r   r	   r*   r#   typingr   r   r.   pathrealpath__file__r,   r    floatintr   r   platformgetattrr!   strr'   r)   r/   __name__hasattrr1   OSErrorargv_exitr   r   r   r   <module>   s.   	
	
