U
    .e                     @   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 ddlmZ ddlmZ ddl	m
Z
 dgZdZejd	koveed
dZej dZejd	krzd dl
mZmZ e
jZW n, ek
r   d dlmZmZ dd ZY nX G dd dZdS )    N   )context)spawn)	reduction)_winapiPopeni   win32frozenFzpythonservice.exe)CreateProcessGetExitCodeProcessc                 C   s   |    d S N)Close)handle r   >/tmp/pip-unpacked-wheel-39f38r4u/billiard/popen_spawn_win32.pyclose_thread_handle$   s    r   c                   @   sJ   e Zd ZdZdZdZdd Zdd Zdd	 Zdd
dZ	dd Z
dd ZdS )r   z@
    Start a subprocess to run the code of a process object
    r   Nc                 C   s  dt jd< t  t|j}td d\}}t	|d}tj
t  |d}ddd |D }tj|dd	d
}z0tt |d d ddd d d 	\}}	}
}t|	 W n   t|  Y nX |
| _d | _|| _t|| _t|  zt|| t|| W 5 td  X W 5 Q R X d S )N1ZMULTIPROCESSING_FORKING_DISABLEr   )Z
parent_pidZpipe_handle c                 s   s   | ]}d | V  qdS )z"%s"Nr   ).0xr   r   r   	<genexpr>:   s     z!Popen.__init__.<locals>.<genexpr>wbT)closefdF)osenvironr   Z_Django_old_layout_hack__saveZget_preparation_data_namer   Z
CreatePipemsvcrtopen_osfhandleZget_command_linegetpidjoinioopenr
   get_executabler   CloseHandlepid
returncode_handleintsentinelr   Zset_spawning_popenr   dump)selfZprocess_objZ	prep_dataZrhandleZwhandleZwfdcmdZto_childhpZhtr$   tidr   r   r   __init__/   sF    

       


zPopen.__init__c                 C   s(   | j d k	r$zt| j  W 5 d | _ X d S r   )r(   r   r#   r*   r   r   r   closeU   s    
zPopen.closec                 C   s   | t  kstt|| jS r   )r   Zget_spawning_popenAssertionErrorr   Z	duplicater(   )r*   r   r   r   r   duplicate_for_child\   s    zPopen.duplicate_for_childc                 C   sr   | j d krl|d krtj}ntdt|d d }tt| j|}|tjkrlt| j}|t	krft
j }|| _ | j S )Nr   i  g      ?)r%   r   ZINFINITEmaxr'   ZWaitForSingleObjectr&   ZWAIT_OBJECT_0r   	TERMINATEsignalSIGTERM)r*   timeoutmsecsrescoder   r   r   wait`   s    


z
Popen.waitc                 C   s   | j ddS )Nr   r7   )r;   r/   r   r   r   pollp   s    z
Popen.pollc                 C   sL   | j d krHztt| jt W n& tk
rF   | jddd krB Y nX d S )Ng      ?r<   )r%   r   ZTerminateProcessr'   r&   r4   OSErrorr;   r/   r   r   r   	terminates   s    
zPopen.terminate)N)__name__
__module____qualname____doc__methodr(   r.   r0   r2   r;   r=   r?   r   r   r   r   r   (   s   &
)r    r   r   r5   sys r   r   r   compatr   __all__r4   platformgetattrZWINEXE
executablelowerendswithZ
WINSERVICEr
   r   r#   r   ImportErrorZ_subprocessr   r   r   r   r   <module>   s(   

