o
    Zh                     @   s   d Z zddlZW n ey   dZY nw 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 deZG dd	 d	eZdS )
zA parent poller for unix.    N)interrupt_main)Thread)
get_loggerc                       s(   e Zd ZdZ fddZdd Z  ZS )ParentPollerUnixzxA Unix-specific daemon thread that terminates the program immediately
    when the parent process no longer exists.
    c                    s   t    d| _dS )zInitialize the poller.TN)super__init__daemon)self	__class__ M/var/www/html/lang_env/lib/python3.10/site-packages/ipykernel/parentpoller.pyr      s   

zParentPollerUnix.__init__c              
   C   sr   ddl m} 	 zt dkrt d td td W n t	y7 } z|j |kr2W Y d}~q d}~ww q)zRun the poller.r   )EINTRT   -Parent appears to have exited, shutting down.g      ?N)
errnor   osgetppidr   warning_exittimesleepOSError)r	   r   er   r   r   run   s   

zParentPollerUnix.run__name__
__module____qualname____doc__r   r   __classcell__r   r   r
   r   r      s    r   c                       s*   e Zd ZdZd fdd	Zdd Z  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.
    Nc                    s@   |s|sJ t    tdu rd}t|d| _|| _|| _dS )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	   r$   r%   msgr
   r   r   r   5   s   

zParentPollerWindows.__init__c                 C   s0  z
ddl m}m} W n ty   ddlm}m} Y nw g }| jr'|| j | jr0|| j t	 d }|
dr>tjntj}	 tjjt||t| | d|}||  kr`t|k rn n(|||  }|| jkrytttjrxt  n|| jkrt d td n|dk rtjdd	d
 dS qB)z-Run the poll loop. This method never returns.r   )INFINITEWAIT_OBJECT_0Z64TFr   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)Z_winapir'   r(   r#   Z_subprocessr$   appendr%   platformarchitecture
startswithr"   Zc_int64c_intZwindllZkernel32ZWaitForMultipleObjectslencallablesignal	getsignalSIGINTr   r   r   r   r   warningswarn)r	   r'   r(   Zhandlesarchr/   resulthandler   r   r   r   K   sH   


zParentPollerWindows.run)NNr   r   r   r
   r   r!   /   s    r!   )r   r"   r#   r   r,   r2   r   r5   _threadr   	threadingr   Ztraitlets.logr   r   r!   r   r   r   r   <module>   s     