o
    f                     @   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 sw   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     
