o
    éT•j«  ã                   @   s¸   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mZmZ ddl	m
Z
 ddl	mZ dgZdZejdko9eed	d
ƒZej ¡  d¡Zdd„ Zeejejƒ Zdd„ ZG dd„ deƒZdS )é    Né   )Ú	reductionÚget_spawning_popenÚset_spawning_popen)Úspawn)ÚutilÚPopeni   Úwin32ÚfrozenFzpythonservice.exec                 C   s    | |kpt j | ¡t j |¡kS ©N)ÚosÚpathÚnormcase)Úp1Úp2© r   ú8/usr/lib/python3.10/multiprocessing/popen_spawn_win32.pyÚ_path_eq   s    r   c                  G   s   | D ]}t  |¡ qd S r   )Ú_winapiÚCloseHandle)ÚhandlesÚhandler   r   r   Ú_close_handles   s   ÿr   c                   @   sJ   e Zd ZdZdZdd„ Zdd„ Zddd	„Zd
d„ Zdd„ Z	e	Z
dd„ ZdS )r   z@
    Start a subprocess to run the code of a process object
    r   c                 C   sl  t  |j¡}t d d¡\}}t |d¡}t jt 	¡ |d�}d 
dd„ |D ƒ¡}t  ¡ }trAt|tjƒrAtj}tj ¡ }tj|d< nd }t|ddd	��b}	zt ||d d d
d|d d ¡	\}
}}}t |¡ W n	   t |¡ ‚ || _d | _|
| _t|
ƒ| _t | t| jt|ƒf¡| _t| ƒ zt  !||	¡ t  !||	¡ W td ƒ ntd ƒ w W d   ƒ d S 1 s¯w   Y  d S )Nr   )Ú
parent_pidÚpipe_handleú c                 s   s   � | ]}d | V  qdS )z"%s"Nr   )Ú.0Úxr   r   r   Ú	<genexpr>9   s   € z!Popen.__init__.<locals>.<genexpr>Ú__PYVENV_LAUNCHER__ÚwbT)ÚclosefdF)"r   Úget_preparation_dataÚ_namer   Ú
CreatePipeÚmsvcrtÚopen_osfhandleÚget_command_liner   ÚgetpidÚjoinÚget_executableÚWINENVr   ÚsysÚ
executableÚ_base_executableÚenvironÚcopyÚopenÚCreateProcessr   ÚpidÚ
returncodeÚ_handleÚintÚsentinelr   ÚFinalizer   Ú	finalizerr   r   Údump)ÚselfÚprocess_objÚ	prep_dataÚrhandleÚwhandleÚwfdÚcmdÚ
python_exeÚenvÚto_childÚhpÚhtr3   Útidr   r   r   Ú__init__,   sH   
ÿ
þ

ÿ"çzPopen.__init__c                 C   s   | t ƒ u sJ ‚t || j¡S r   )r   r   Ú	duplicater7   )r;   r   r   r   r   Úduplicate_for_childa   s   zPopen.duplicate_for_childNc                 C   st   | j d u r7|d u rtj}ntdt|d d ƒƒ}t t| jƒ|¡}|tjkr7t | j¡}|t	kr4t
j }|| _ | j S )Nr   iè  g      à?)r4   r   ÚINFINITEÚmaxr6   ÚWaitForSingleObjectr5   ÚWAIT_OBJECT_0ÚGetExitCodeProcessÚ	TERMINATEÚsignalÚSIGTERM)r;   ÚtimeoutÚmsecsÚresÚcoder   r   r   Úwaite   s   

z
Popen.waitc                 C   s   | j dd�S )Nr   ©rS   )rW   ©r;   r   r   r   Úpollu   ó   z
Popen.pollc                 C   sN   | j d u r%zt t| jƒt¡ W d S  ty$   | jdd�d u r!‚ Y d S w d S )Ng      ð?rX   )r4   r   ÚTerminateProcessr6   r5   rP   ÚOSErrorrW   rY   r   r   r   Ú	terminatex   s   
ÿÿýzPopen.terminatec                 C   s   |   ¡  d S r   )r9   rY   r   r   r   Úclose‚   r[   zPopen.closer   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚmethodrH   rJ   rW   rZ   r^   Úkillr_   r   r   r   r   r   &   s    5
)r   r%   rQ   r,   r   Úcontextr   r   r   Ú r   r   Ú__all__rP   ÚplatformÚgetattrÚWINEXEr-   ÚlowerÚendswithÚ
WINSERVICEr   r.   r+   r   Úobjectr   r   r   r   r   Ú<module>   s     
