
    G@d                     V    d Z ddlZddlZddlmZ ddlZddlmZ  G d de          ZdS )zKernel Manager subclass.    N)run_sync)QtKernelManagerc                       e Zd ZdZd Zeej        dddfd            Zdde	ddfd	Z
 ee
          Zdde	ddfd
Z ee          ZdS )SpyderKernelManagerak  
    Spyder kernels that live in a conda environment are now properly activated
    with custom activation scripts located at plugins/ipythonconsole/scripts.

    However, on windows the batch script is terminated but not the kernel it
    started so this subclass overrides the `_kill_kernel` method to properly
    kill the started kernels by using psutil.
    c                 :    d| _         t          j        | g|R i |S )NF)shutting_downr   __init__)selfargskwargss      Klib/python3.11/site-packages/spyder/plugins/ipythonconsole/utils/manager.pyr	   zSpyderKernelManager.__init__   s+    "'>t>>>v>>>    TNc                   K   | t          j                    k    sJ 	 t          j        |           }n# t          j        $ r g g fcY S w xY w|                    d          }|r|                    |           |D ]3}	 |                    |           # t          j        $ r	 g g fcY c S w xY wt          j	        |||          \  }}	||	fS )a,  
        Kill a process tree (including grandchildren) with sig and return a
        (gone, still_alive) tuple.

        "on_terminate", if specified, is a callabck function which is called
        as soon as a child terminates.

        This is an new method not present in QtKernelManager.
        T)	recursive)timeoutcallback)
osgetpidpsutilProcessNoSuchProcesschildrenappendsend_signalAccessDenied
wait_procs)
pidsiginclude_parentr   on_terminateparentr   child_processgonealives
             r   kill_proc_treez"SpyderKernelManager.kill_proc_tree#   s      bikk!!!!
	^C((FF# 	 	 	8OOO	 ??T?22 	$OOF###% 	  	 M ))#....&      Bx  '!
 
 
e e}s!   2 AA=BB+*B+Frestartreturnc                   K   | j         r| j        J |                     | j        j        j                   d{V  | j                            |           d{V  ddl}	 |                    |                                 d           d{V  | j         r!| j        	                                 d{V  dS dS # |j
        $ r | j                            d           Y dS w xY wdS )zKill the running kernel.
        Override private method of jupyter_client 7 to be able to correctly
        close kernel that was started via a batch/bash script for correct conda
        env activation.
        N)r&   r   g      @)r   z>Wait for final termination of kernel timed out - continuing...)
has_kernelprovisionerr%   processr   killasynciowait_for_async_waitwaitTimeoutErrorlogwarning)r
   r&   r-   s      r   _async_kill_kernelz&SpyderKernelManager._async_kill_kernelO   sZ      ? 	2#/// %%d&6&>&BCCCCCCCCC"'''888888888 NNN2&&t'7'7'9'93&GGGGGGGGG ? 2*//111111111112 2 '       "8 9 9 9	2 	2s   #/B< <$C$#C$c                    K   | j         r5| j        J |                     | j        j        j                   d{V  dS dS )zIsimilar to _kill_kernel, but with sigterm (not sigkill), but do not blockN)r)   r*   r%   r+   r   )r
   r&   s     r   _async_send_kernel_sigtermz.SpyderKernelManager._async_send_kernel_sigtermo   sc      ? 	D#/// %%d&6&>&BCCCCCCCCCCC	D 	Dr   )F)__name__
__module____qualname____doc__r	   staticmethodsignalSIGTERMr%   boolr4   r   _kill_kernelr6   _send_kernel_sigterm r   r   r   r      s         ? ? ? &,nT%)) ) ) \)V2 2 2 2 2 2 2< 8.//LD D D D D D D $8$>??r   r   )	r:   r   r<   jupyter_client.utilsr   r   qtconsole.managerr   r   rA   r   r   <module>rD      s      
			  * ) ) ) ) )  - - - - - -c@ c@ c@ c@ c@/ c@ c@ c@ c@ c@r   