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Zd dlZd dlZd dlm	Z	 d dl
mZmZ d dlmZ ejdkr~d dlmZ dadag Zdd Zd	d
 Zdd Zdd Zdd ZdS )    N)launcher)log	messaging)outputwin32)winapic                   C   s   dt j dS )NzDebuggee[PID=])processpid r   r   =/tmp/pip-unpacked-wheel-dg3irmqq/debugpy/launcher/debuggee.pydescribe$   s    r   c                 C   s  t d|| t }z,|rRt \}}t \}}	|||||	hO }t||	d}
ni }
t	j
dkrtdd }|
j|d ztj|f|d	d
|
aW n4 tk
r } ztd||W 5 d }~X Y nX t dt  t	j
dkrztjd d at }tt|}tjttjt||t| |j jtj tj!B O  _tj"ttjt|| tj#tj$tj%B dtj&}tj't| W n$ tk
r   t jddd Y nX t()t* t+j,-dddtj&| t./dd d |r$d|t	j0fd|t	j1ffD ](\}}}t23t ||| |4| qt5j6t7dd}d|_8|9  W 5 |D ]8}zt| W n" tk
r|   t jdd Y nX qHX d S )NzOSpawning debuggee process:

Command line: {0!r}

Environment variables: {1!r}

warninglevel)stdoutstderrr   c               
   S   s   zbt   ttjtj} z4t dt j}zt |t 	  W 5 t | X W 5 ttj|  X W n" t
k
r   tjddd Y nX d S )Nz/dev/ttyzFailed to set up process groupinfor   )ossetpgrpsignalSIGTTOUSIG_IGNopenO_RDWRclose	tcsetpgrpgetpgrp	Exceptionr   swallow_exception)Zold_handlerttyr   r   r   
preexec_fn?   s     zspawn.<locals>.preexec_fn)r!   r   )envbufsizez0Couldn't spawn debuggee: {0}

Command line:{1!r}zSpawned {0}.FzFailed to set up job objectr	   ZlaunchTP   )ZstartMethodZisLocalProcessZsystemProcessIdnameZpointerSizer   r   zwait_for_exit())targetr&   ):r   r   setr   r   r   r   pipedictsysplatformupdate
subprocessPopenr	   r   ZMessageHandlingErrorformatr   r   kernel32ZCreateJobObjectA
job_handleZ$JOBOBJECT_EXTENDED_LIMIT_INFORMATIONZDWORDctypessizeofZQueryInformationJobObjectZ!JobObjectExtendedLimitInformationpointerZBasicLimitInformationZ
LimitFlagsZ"JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSEZJOB_OBJECT_LIMIT_BREAKAWAY_OKZSetInformationJobObjectZOpenProcessZPROCESS_TERMINATEZPROCESS_SET_QUOTAr
   ZAssignProcessToJobObjectatexitregisterkillr   channel
send_eventstructcalcsizer   r   r   ZCaptureOutputremove	threadingThreadwait_for_exitdaemonstart)Zprocess_nameZcmdliner"   Zredirect_output	close_fdsfdZstdout_rZstdout_wZstderr_rZstderr_wkwargsr!   excZjob_infoZjob_info_sizeZprocess_handlecategoryteeZwait_threadr   r   r   spawn(   s    
 



rI   c                   C   s|   t d krd S zHt  d krRtdt  tjdkrBtj	t
d ntt jtj W n" tk
rv   tdt  Y nX d S )NzKilling {0}r   r   zFailed to kill {0})r	   pollr   r   r   r+   r,   r   r1   ZTerminateJobObjectr2   r   killpgr
   r   SIGKILLr   r   r   r   r   r   r8      s    
r8   c                     s   z&t   tjdkr$ dk r$ dM  W n" tk
rH   td d Y nX tdt   t	
  t fddtD } ztjd	d
 i W n tk
r   Y nX | rt  ztjd W n tk
r   Y nX d S )Nr   r      z$Couldn't determine process exit codez{0} exited with code {1}c                 3   s   | ]}| V  qd S )Nr   ).0predcoder   r   	<genexpr>   s     z wait_for_exit.<locals>.<genexpr>ZexitedZexitCodeZ
terminated)r	   waitr+   r,   r   r   r   r   r   r   Zwait_for_remaining_outputanywait_on_exit_predicatesr   r9   r:   _wait_for_user_input)Zshould_waitr   rQ   r   r@      s(    

r@   c                  C   s   t jrt jrt j rddlm}  zdd l}W n tk
rF   d}Y nX d}|rz| d t j	d t j
  |  n,| d t j	d t j
  t jd	 d S )
Nr   )r   FTz5msvcrt available - waiting for user input via getch()z Press any key to continue . . . z8msvcrt not available - waiting for user input via read()zPress Enter to continue . . .    )r+   r   stdinisattydebugpy.commonr   msvcrtImportErrordebugwriteflushZgetchread)r   r\   Z	can_getchr   r   r   rW      s     





rW   )r6   r3   r   r   r;   r.   r+   r>   Zdebugpyr   r[   r   r   Zdebugpy.launcherr   r,   r   r	   r2   rV   r   rI   r8   r@   rW   r   r   r   r   <module>   s*   
 
"