
    oiD                         d 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 ddlmZ  G d de      Z G d d	e      Zy# e$ r dZY Fw xY w)
zA parent poller for unix.    N)interrupt_main)Thread)
get_loggerc                   *     e Zd ZdZd fd	Zd Z xZS )ParentPollerUnixzxA Unix-specific daemon thread that terminates the program immediately
    when the parent process no longer exists.
    c                 >    t         |           || _        d| _        y)zInitialize the poller.

        Parameters
        ----------
        parent_handle : int, optional
            If provided, the program will terminate immediately when
            process parent is no longer this original parent.
        TN)super__init__
parent_piddaemon)selfr   	__class__s     ^/home/ubuntu/docker-apps/notebooks/venv/lib/python3.12/site-packages/ipykernel/parentpoller.pyr
   zParentPollerUnix.__init__   s     	$    c                 <   ddl m} t        j                         }|| j                  k7  rd| _        t               j                  dt        |       j                  | j                         	 	 t        j                         }| j                   xr |dk(  }| j                  xr || j                  k7  }|s|r.t               j                  d       t        j                  d       t        j                  d       # t        $ r}|j                   |k(  rY d}~ d}~ww xY w)zRun the poller.r   )EINTRz6%s: poll for parent change with original parent pid=%d   -Parent appears to have exited, shutting down.g      ?N)errnor   osgetppidr   r   debugtype__name__warning_exittimesleepOSError)r   r   original_ppidppidparent_is_initparent_has_changedes          r   runzParentPollerUnix.run&   s     	  

DOO+DODJOO	
 zz|%)__!4!B%)__%P9P"!%7L(()XYHHQK

3   77e#s   +BC8 8	DDDD)r   r   
__module____qualname____doc__r
   r%   __classcell__r   s   @r   r   r      s    r   r   c                   *     e Zd ZdZd fd	Zd Z xZS )ParentPollerWindowszA Windows-specific daemon thread that listens for a special event that
    signals an interrupt and, optionally, terminates the program immediately
    when the parent process no longer exists.
    c                 ~    |s|sJ t         |           t        d}t        |      d| _        || _        || _        y)a  Create the poller. At least one of the optional parameters must be
        provided.

        Parameters
        ----------
        interrupt_handle : HANDLE (int), optional
            If provided, the program will generate a Ctrl+C event when this
            handle is signaled.
        parent_handle : HANDLE (int), optional
            If provided, the program will terminate immediately when this
            handle is signaled.
        Nz#ParentPollerWindows requires ctypesT)r	   r
   ctypesImportErrorr   interrupt_handleparent_handle)r   r1   r2   msgr   s       r   r
   zParentPollerWindows.__init__K   sG      =00>7Cc"" 0*r   c                    	 ddl m}m} g }| j
                  r|j                  | j
                         | j                  r|j                  | j                         t        j                         d   }|j                  d      rt        j                  nt        j                  }	 t        j                  j                  j!                  t#        |       |t#        |      z  | d|      }||cxk  rt#        |      k  rn n|||z
     }t        j                  j                  j%                  |       || j
                  k(  r7t'        t)        j*                  t(        j,                              rft/                n[|| j                  k(  rLt1               j3                  d       t5        j6                  d       n|dk  rt9        j:                  dd	       y
/# t        $ r ddlm}m} Y w xY w)z-Run the poll loop. This method never returns.r   )INFINITEWAIT_OBJECT_064Fr   r   zParent poll failed.  If the frontend dies,
                the kernel may be left running.  Please let us know
                about your system (bitness, Python, etc.) at
                ipython-dev@scipy.org   )
stacklevelN)_winapir5   r6   r0   _subprocessr1   appendr2   platformarchitecture
startswithr/   c_int64c_intwindllkernel32WaitForMultipleObjectslen
ResetEventcallablesignal	getsignalSIGINTr   r   r   r   r   warningswarn)r   r5   r6   handlesarchrA   resulthandles           r   r%   zParentPollerWindows.runa   s   	<7
   NN4001NN4--.$$&q)"&//$"7V\\ ]]++BBG%W%0	F 5W5 -!78&&11&9T222   0 0 ?@&(t111L(()XYHHQK!)  ! =   	<;;	<s   G G'&G')NNr&   r+   s   @r   r-   r-   E   s    
+,/r   r-   )r)   r/   r0   r   r=   rH   r   rK   _threadr   	threadingr   traitlets.logr   r   r-    r   r   <module>rU      s\     
     "  $.v .bK& K}  Fs   A AA