
    ^h                         S r  SSKrSSKrSSKrSSKrSSKrSSKrSSKJ	r	  SSK
Jr  SSKJr   " S S\5      r " S S	\5      rg! \ a    Sr NGf = f)
zA parent poller for unix.    N)interrupt_main)Thread)
get_loggerc                   6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )ParentPollerUnix   zpA Unix-specific daemon thread that terminates the program immediately
when the parent process no longer exists.
c                 <   > [         TU ]  5         Xl        SU l        g)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     P/home/james-whalen/.local/lib/python3.13/site-packages/ipykernel/parentpoller.pyr   ParentPollerUnix.__init__   s     	$    c                 z   SSK Jn  [        R                  " 5       nX R                  :w  a  SU l        [        5       R                  S[        U 5      R                  U R                  5          [        R                  " 5       nU R                  (       + =(       a    US:H  nU R                  =(       a    X0R                  :g  nU(       d  U(       a/  [        5       R                  S5        [        R                  " S5        [        R                  " S5        M  ! [         a  nUR                   U:X  a   SnAM  e SnAff = f)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   runParentPollerUnix.run&   s     	  

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

3   77e#s   ,B&D 
D:D54D55D:)r   r   )r   	r   
__module____qualname____firstlineno____doc__r   r'   __static_attributes____classcell__r   s   @r   r   r      s     r   r   c                   6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )ParentPollerWindowsE   zA 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                    > U(       d	  U(       d   e[         TU ]  5         [        c  Sn[        U5      eSU l        Xl        X l        g)ak  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   r7   r8   msgr   s       r   r   ParentPollerWindows.__init__K   sC      =00>7Cc"" 0*r   c                     SSK JnJn  / nU R
                  (       a  UR                  U R
                  5        U R                  (       a  UR                  U R                  5        [        R                  " 5       S   nUR                  S5      (       a  [        R                  O[        R                  n [        R                  R                  R!                  [#        U5      U[#        U5      -  " U6 SU5      nX&s=::  a  [#        U5      :  a  O  OX6U-
     nXpR
                  :X  a=  [%        [&        R(                  " [&        R*                  5      5      (       a
  [-        5         O[XpR                  :X  a/  [/        5       R1                  S5        [2        R4                  " S5        OUS:  a  [6        R8                  " SSS	9  g
GM  ! [         a    SSKJnJn   GNf = f)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)_winapir<   r=   r6   _subprocessr7   appendr8   platformarchitecture
startswithr5   c_int64c_intwindllkernel32WaitForMultipleObjectslencallablesignal	getsignalSIGINTr   r   r   r   r   warningswarn)r   r<   r=   handlesarchrH   resulthandles           r   r'   ParentPollerWindows.runa   sh   	<7
   NN4001NN4--.$$&q)"&//$"7"7V\\ ]]++BBGW%0	F 5W5 -!78222   0 0 ?@@&(111L(()XYHHQK!)  ! ;   	<;;	<s   G   GG)r   r7   r8   )NNr)   r0   s   @r   r2   r2   E   s    
+,. .r   r2   )r-   r5   r6   r   rD   rN   r   rQ   _threadr   	threadingr   traitlets.logr   r   r2    r   r   <module>r\      s\     
     "  $.v .bJ& J}  Fs   A AA