U
    d                     @   s   d dl mZ 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oe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eZdS )    )absolute_importN   )context)spawn)	reduction)_winapiPopeni   win32frozenFzpythonservice.exe)CreateProcessGetExitCodeProcessc                 C   s   |    d S N)Close)handle r   >/tmp/pip-unpacked-wheel-lulkwrw3/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__1   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   closeW   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   waitb   s    


z
Popen.waitc                 C   s   | j ddS )Nr   r8   )r<   r0   r   r   r   pollr   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'   r5   OSErrorr<   r0   r   r   r   	terminateu   s    
zPopen.terminate)N)__name__
__module____qualname____doc__methodr)   r/   r1   r3   r<   r>   r@   r   r   r   r   r   *   s   &
)
__future__r   r!   r   r   r6   sys r   r   r   compatr   __all__r5   platformgetattrZWINEXE
executablelowerendswithZ
WINSERVICEr   r   r$   r   ImportErrorZ_subprocessobjectr   r   r   r   r   <module>   s*   

