B
    U[O                 @   s   yd dl Z W n   dZ Y nX d dlZd dlZd dlZd dlZyd dlmZ W n  ek
rn   d dlmZ Y nX d dl	m
Z
 d dlmZ d dlZG dd de
ZG dd de
ZdS )	    N)interrupt_main)Thread)
get_loggerc                   s(   e Zd ZdZ fddZdd Z  ZS )ParentPollerUnixzy A Unix-specific daemon thread that terminates the program immediately
    when the parent process no longer exists.
    c                s   t t|   d| _d S )NT)superr   __init__daemon)self)	__class__ 5lib/python3.7/site-packages/ipykernel/parentpoller.pyr      s    zParentPollerUnix.__init__c          
   C   sx   ddl m} xfy0t dkr2t d td td W q t	k
rn } z|j |kr\w W d d }~X Y qX qW d S )Nr   )EINTR   z-Parent appears to have exited, shutting down.g      ?)
errnor   osgetppidr   warning_exittimeZ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 )ParentPollerWindowsz A 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|   tdkr*td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   r   ctypesImportErrorr   interrupt_handleparent_handle)r	   r!   r"   )r
   r   r   r   4   s    zParentPollerWindows.__init__c             C   s8  y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}xtjjt||t| | d|}||  krt|k rn nR|||  }|| jkrtttjrt  n"|| jkr0t d td q|dk rtd dS qW dS )	z7 Run the poll loop. This method never returns.
        r   )WAIT_OBJECT_0INFINITEZ64Fz-Parent appears to have exited, shutting down.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   J   s:    
zParentPollerWindows.run)NN)r   r   r   r   r   r   r   r   r   )r
   r   r   .   s   r   )r   r   r&   r+   r   _threadr   r    ZthreadZ	threadingr   Ztraitlets.logr   r.   r   r   r   r   r   r   <module>   s    
