U
    ҥcv                     @   s   d Z zddlZW n ek
r(   dZY nX 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__ 5lib/python3.8/site-packages/ipykernel/parentpoller.pyr      s    
zParentPollerUnix.__init__c              
   C   sz   ddl m} z0t dkr0t d td td W q t	k
rr } z|j |kr`W Y q W 5 d}~X Y qX qdS )zRun the poller.r   )EINTR   -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t t   tdk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)AssertionErrorr   r   ctypesImportErrorr   interrupt_handleparent_handle)r	   r%   r&   msgr
   r   r   r   5   s    
zParentPollerWindows.__init__c                 C   s4  zddl m}m} W n$ tk
r8   ddlm}m} Y nX g }| jrP|| j | jrb|| j t	 d }|
dr~tjntj}tjjt||t| | d|}||  krt|k rn nR|||  }|| jkrtttjrt  n"|| jkr.t d td q|dk rtd dS qdS )	z-Run the poll loop. This method never returns.r   )INFINITEWAIT_OBJECT_0Z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.orgN)Z_winapir(   r)   r$   Z_subprocessr%   appendr&   platformZ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handlesZarchr-   resultZhandler   r   r   r   K   s<    
zParentPollerWindows.run)NNr   r   r   r
   r   r!   /   s   r!   )r   r#   r$   r   r+   r0   r   r3   _threadr   	threadingr   Ztraitlets.logr   r   r!   r   r   r   r   <module>   s   
