U
    /ex	                     @   sN   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ZG dd dZdS )A trio loop runner.    Nc                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )
TrioRunnerr   c                 C   s   d| _ d| _dS )Initialize the runner.N)_cell_cancel_scope_trio_tokenself r	   9/tmp/pip-unpacked-wheel-g43y689f/ipykernel/trio_runner.py__init__   s    zTrioRunner.__init__c                 C   sT   |j |  |j dd dd |j jjd d< d| _tj|jddd	}|  d
S )r   Z	autoawaittrioc                 S   s   t jdddS )Nz5Autoawait isn't allowed in Trio background loop mode.   )
stacklevel)warningswarn)_r	   r	   r
   <lambda>   s    z'TrioRunner.initialize.<locals>.<lambda>lineFTZTornadoBackground)targetdaemonnameN)	shellZset_trio_runnerZrun_line_magicZmagics_managerZmagicsZ_interrupted	threadingThreadstart)r   kernelZio_loopZ	bg_threadr	   r	   r
   
initialize   s    zTrioRunner.initializec                 C   s"   | j r| j   nd}t|dS )zInteruppt the runner.z)Kernel interrupted but no cell is runningN)r   cancel	Exception)r   signumframemsgr	   r	   r
   	interrupt   s    zTrioRunner.interruptc                    sB   t  t jj}dd   fdd}t| t  t j| dS )zRun the loop.c                 S   s*   d tt| | | j} td|  d S )N
z2An exception occurred in a global nursery task.
%s)join	tracebackformat_exceptiontype__traceback__loggingerror)excr	   r	   r
   log_nursery_exc+   s    z'TrioRunner.run.<locals>.log_nursery_excc               
      sL   t j _t  4 I dH  }  | _| t_t  I dH  W 5 Q I dH R X dS )zRun the main loop.N)	r   ZlowlevelZcurrent_trio_tokenr   Zopen_nurseryZ_add_excbuiltinsZGLOBAL_NURSERYZsleep_forever)Znurseryr,   r   r	   r
   	trio_main/   s
    z!TrioRunner.run.<locals>.trio_mainN)signalSIGINTr"   r   run)r   Zold_sigr/   r	   r.   r
   r2   '   s
    

zTrioRunner.runc                    s     fdd}t jj|| jdS )zHandle a function call.c              
      s8   t   _ j | I dH W  5 Q R  S Q R X d _dS )zA thread runner context.N)r   ZCancelScoper   )coror   r	   r
   loc?   s    
z TrioRunner.__call__.<locals>.loc)Z
trio_token)r   Zfrom_threadr2   r   )r   Zasync_fnr4   r	   r   r
   __call__<   s    zTrioRunner.__call__N)	__name__
__module____qualname____doc__r   r   r"   r2   r5   r	   r	   r	   r
   r      s   r   )	r9   r-   r)   r0   r   r%   r   r   r   r	   r	   r	   r
   <module>   s   