
][\                 @   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 o e e d
 d  Z e j j   j d  Z Gd d   d e  Z d S)    N   )context)spawn)	reduction)utilPopeni   Zwin32frozenFzpythonservice.exec               @   s[   e  Z d  Z d Z 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   c             C   s  t  j | j  } t j d  d  \ } } t j | d  } t  j d t j	   d |  } d j
 d d   | D  } t | d d d	  } yJ t j t  j   | d  d  d
 d d  d  d  	 \ } }	 }
 } t j |	  Wn t j |    Yn X|
 |  _ d  |  _ | |  _ t |  |  _ t j |  t j |  j f  t j |   z$ t j | |  t j | |  Wd  t j d   XWd  QXd  S)Nr   Z
parent_pidZpipe_handle c             s   s   |  ] } d  | Vq d S)z"%s"N ).0xr
   r
   7/usr/lib/python3.4/multiprocessing/popen_spawn_win32.py	<genexpr>*   s    z!Popen.__init__.<locals>.<genexpr>wbclosefdTF)r   Zget_preparation_data_name_winapiZ
CreatePipemsvcrtZopen_osfhandleZget_command_lineosgetpidjoinopenZCreateProcessZget_executableZCloseHandlepid
returncode_handleintsentinelr   ZFinalizer   Zset_spawning_popenr   dump)selfZprocess_objZ	prep_dataZrhandleZwhandleZwfdcmdZto_childZhpZhtr   tidr
   r
   r   __init__!   s2    	'			zPopen.__init__c             C   s+   |  t  j   k s t  t j | |  j  S)N)r   Zget_spawning_popenAssertionErrorr   Z	duplicater   )r   Zhandler
   r
   r   duplicate_for_childF   s    zPopen.duplicate_for_childNc             C   s   |  j  d  k r | d  k r' t j } n t d t | d d   } t j t |  j  |  } | t j k r t j |  j  } | t	 k r t
 j } n  | |  _  q n  |  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   waitJ   s    z
Popen.waitc             C   s   |  j  d d  S)Nr(   r   )r*   )r   r
   r
   r   pollZ   s    z
Popen.pollc             C   sf   |  j  d  k rb y t j t |  j  t  Wqb t k
 r^ |  j d d  d  k rZ   n  Yqb Xn  d  S)Nr(   g      ?)r   r   ZTerminateProcessr   r   r%   OSErrorr*   )r   r
   r
   r   	terminate]   s    zPopen.terminate)
__name__
__module____qualname____doc__methodr!   r#   r*   r+   r-   r
   r
   r
   r   r      s   %)r   r   r&   sysr    r   r   r   r   __all__r%   platformgetattrZWINEXE
executablelowerendswithZ
WINSERVICEobjectr   r
   r
   r
   r   <module>   s   	!