B
     S]                 @   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oreed	d
Zej dZdd Zeedoe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   Zwin32frozenFzpythonservice.exec             C   s    | |kpt j| t j|kS )N)ospathnormcase)Zp1Zp2 r   2lib/python3.7/multiprocessing/popen_spawn_win32.py_path_eq   s    r   _base_executablec              G   s   x| D ]}t | qW d S )N)_winapiCloseHandle)Z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   sP  t |j}td d\}}t|d}t jt	 |d}d
dd |D }t  }trt|tjrtj}tj }tj|d< nd }t|ddd	}	y0t|||d d
dd d d 	\}
}}}t| W n   t|  Y nX || _d | _|
| _t|
| _t| tj| jf| _t|  zt ||	 t ||	 W d td  X W d Q R X d S )Nr   )Z
parent_pidZpipe_handle c             s   s   | ]}d | V  qdS )z"%s"Nr   ).0xr   r   r   	<genexpr>6   s    z!Popen.__init__.<locals>.<genexpr>__PYVENV_LAUNCHER__wbT)closefdF)!r   Zget_preparation_data_namer   Z
CreatePipemsvcrtZopen_osfhandleZget_command_liner
   getpidjoinZget_executableWINENVr   sys
executabler   environcopyopenZCreateProcessr   pid
returncode_handleintsentinelr   ZFinalize	finalizerr   r   dump)selfZprocess_objZ	prep_dataZrhandleZwhandleZwfdcmdZ
python_exeenvZto_childZhpZhtr&   tidr   r   r   __init__-   s>    



zPopen.__init__c             C   s   | t  kstt|| jS )N)r   AssertionErrorr   Z	duplicater*   )r-   r   r   r   r   duplicate_for_child]   s    zPopen.duplicate_for_childNc             C   st   | j d krn|d krtj}ntdt|d d }tt| j|}|tjkrnt| j}|t	krht
j }|| _ | j S )Nr   i  g      ?)r'   r   ZINFINITEmaxr)   ZWaitForSingleObjectr(   ZWAIT_OBJECT_0ZGetExitCodeProcess	TERMINATEsignalSIGTERM)r-   timeoutZmsecsZrescoder   r   r   waita   s    

z
Popen.waitc             C   s   | j ddS )Nr   )r8   )r:   )r-   r   r   r   pollq   s    z
Popen.pollc             C   sL   | j d krHytt| jt W n& tk
rF   | jddd krB Y nX d S )Ng      ?)r8   )r'   r   ZTerminateProcessr)   r(   r5   OSErrorr:   )r-   r   r   r   	terminatet   s    
zPopen.terminatec             C   s   |    d S )N)r+   )r-   r   r   r   close~   s    zPopen.close)N)__name__
__module____qualname____doc__methodr1   r3   r:   r;   r=   killr>   r   r   r   r   r   '   s   0
)r
   r   r6   r!   r   contextr   r   r    r   r   __all__r5   platformgetattrZWINEXEr"   lowerendswithZ
WINSERVICEr   hasattrr   r    r   objectr   r   r   r   r   <module>   s    

