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ZddlmZm	Z	m
Z
 dZejeZdddd	d
dZdddddZejdkreeddZdddddZndddddZdddddZd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.
    )annotationsN)AnyOptionalSequence
   zsubprocess.Popen[Any]zOptional[float]zOptional[int])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-36gvocj8/pymongo/daemon.py_popen_wait"   s    r   zOptional[subprocess.Popen[Any]]None)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   zSequence[str])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_popeno   s    

r2   c                 C  s   t jrt|  nt|  dS )zSpawn a daemon process (Unix).N)r-   r.   r2   r,   )r   r   r   r   r*   x   s    

__main__setsid   )__doc__
__future__r   r!   r   r-   r&   typingr   r   r   r1   pathrealpath__file__r/   r   r   platformgetattrr$   r*   r,   r2   __name__hasattrr4   OSErrorargv_exitr   r   r   r   <module>   s0   	
	
