
    MhB                     r    d Z ddlZddlmZ ddlZddlZddlZddlmZm	Z	 ddl
mZ d
dZd Zd Zd Zd	 ZdS )z*Patch asyncio to allow nested event loops.    N)contextmanagersuppress)heappopc                     t                       t                       t                       | pt          j                    } t          |            dS )z/Patch asyncio to make its event loop reentrant.N)_patch_asyncio_patch_policy_patch_tornadoasyncioget_event_loop_patch_looploops    L/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/nest_asyncio.pyapplyr      sJ    OOO+7)++D    c                     ddd} dd}t          t          d          rdS t          j        dk    rzt          j        j        xt          _        xt          j        _        t          j        _        t          j        j	        xt          _
        xt          j        _        t          j        _
        t          j        d	k     rEt          j        j        j        t          j        _        t          j        j        j        t          _        t          j        d
k    r$|xt          _        xt          _        t          _        | t          _        dt          _        dS )z:Patch asyncio module to use pure Python tasks and futures.F)debugc                l   t          j                    }|                    |           t          j        |           }	 |                    |          |                                s[|                                 t          t           j                  5  |                    |           d d d            S # 1 swxY w Y   S S # |                                s[|                                 t          t           j                  5  |                    |           d d d            w # 1 swxY w Y   w w xY wN)	r
   r   	set_debugensure_futurerun_until_completedonecancelr   CancelledError)mainr   r   tasks       r   runz_patch_asyncio.<locals>.run   s   %''u$T**	2**40099;; 2g455 2 2++D1112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 22499;; 2g455 2 2++D1112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 22sB   C B55B9	<B9	AD3D&D3&D**D3-D*.D3   c                 z    t          j                    }|%t          j                                                    }|S r   )events_get_running_loopget_event_loop_policyr   )
stacklevelr   s     r   _get_event_loopz'_patch_asyncio.<locals>._get_event_loop%   s4    '))</11@@BBDr   _nest_patchedN)r      r   r      r   )r   	   r   T)r   )hasattrr
   sysversion_infotasks_PyTaskTask_CTaskfutures	_PyFutureFuture_CFuture_current_tasks	all_tasksr!   r%   r   r   r&   )r   r%   s     r   r   r      s    ! 
2 
2 
2 
2 
2    w(( 
9$$M!	" 	"w}+gm.@ O%	& 	&1GO4J
)##'.}'9'H$#M.8
9$$%4	5 	5!6"GK Gr   c                  J    d } t          j                    }| |j        _        dS )z1Patch the policy to always return a patched loop.c                     | j         j        8|                                 }t          |           |                     |           | j         j        S r   )_local_loopnew_event_loopr   set_event_loop)selfr   s     r   r   z%_patch_policy.<locals>.get_event_loop@   sK    ;$&&((D%%%{  r   N)r!   r#   	__class__r   )r   policys     r   r   r   =   s2    ! ! ! )++F&4F###r   c                    fd}fd}fd}t           d             t           d             d }t          | d          rdS t          | t          j                  st          d	t          |           z            | j        }||_        ||_	        ||_
        ||_        ||_        |                                 rd
nd|_        t          j        dk    ot#          |t          j                  |_        t(          j        dk     r|j        |_        t(          j        dk    rt          j        j        nt          j        j        d|_        dS )z Patch loop to make it reentrant.c                      |           5   |           5  	 |                                   | j        rn	 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d| _        d S )NTF)	_run_once	_stopping)r>   manage_asyncgens
manage_runs    r   run_foreverz _patch_loop.<locals>.run_foreverN   s   Z 	 	//55 	 	   >  		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 s3   AAAA			AA		AA #A c                     |           5  t          j        ||           }||urd|_        |                                s0|                                  | j        rn|                                0|                                st          d          |                                cd d d            S # 1 swxY w Y   d S )Nr   Fz+Event loop stopped before Future completed.)r
   r   _log_destroy_pendingr   rC   rD   RuntimeErrorresult)r>   futurefrF   s      r   r   z'_patch_loop.<locals>.run_until_completeV   s   Z 	 	%f4888A).&ffhh    >  ffhh  6688 C"AC C C88::	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   BB66B:=B:c                 @   | j         }| j        }|r+|d         j        rt          |           |r|d         j        |s| j        rdnA|r>t          t          |d         j        |                                 z
  d          d          nd}| j	        
                    |          }|                     |           |                                 | j        z   }|rH|d         j        |k     r7t          |          }|                    |           |r|d         j        |k     7t          t          |                    D ]`}|s n[|                                }|j        s?	                    | d          }	 |                                 ||	| <   T# ||	| <   w xY wad}dS )zu
        Simplified re-implementation of asyncio's _run_once that
        runs handles as they become ready.
        r   iQ N)_ready
_scheduled
_cancelledr   rD   minmax_whentime	_selectorselect_process_events_clock_resolutionappendrangelenpopleftpop_run)
r>   ready	scheduledtimeout
event_listend_timehandle_	curr_task
curr_taskss
            r   rC   z_patch_loop.<locals>._run_onced   s   
 O	 	IaL3 	I  	IaL3 	  $. AA@IS!"TYY[[0!5 56;= = =	 	
 ^**733
Z(((99;;!77 	!IaL.99Y''FLL     	!IaL.99 s5zz"" 	5 	5A ]]__F$ 
5 'NN466	5KKMMM !,+4
4( !,+4
4(4444
5 s   3F	Fc              3   ~  K   |                                   | j        }t          j                    }	 t	          j                    | _        t          j        |            | xj        dz  c_        | j        r!| j	        | 
                    | j                   dV  || _        t          j        |           | xj        dz  c_        | j        r\| j        dk    rS| j	        N| j	        j        }| j	                                         || j                            |           d| _	        dS dS dS dS # || _        t          j        |           | xj        dz  c_        | j        rZ| j        dk    rO| j	        H| j	        j        }| j	                                         || j                            |           d| _	        w xY w)zSet up the loop for running.   Nr   )_check_closed
_thread_idr!   r"   	threading	get_ident_set_running_loop_num_runs_pending_is_proactorloop_self_reading_future	call_soon_loop_self_reading_ovr   	_proactor_unregister)r>   old_thread_idold_running_loopovs       r   rF   z_patch_loop.<locals>.manage_run   s      	!355	5'133DO$T***""a'""$ <,4NN4#:;;;EEE+DO$%5666""a'""$ 5*a// 5A26B-44666~22266604D---5 5//AA ,DO$%5666""a'""$ 5*a// 5A26B-44666~22266604D-4444s   A(D. .BF<c              3     K   t          t          d          sd S t          j                    }	 |                     | j                   | j         t          j        | j        | j                   d V  |                     d           | j        t          j        |  d S d S # |                     d           | j        t          j        |  w w xY w)Nget_asyncgen_hooks)	firstiter	finalizerF)	r+   r,   r|   _set_coroutine_origin_tracking_debug
_asyncgensset_asyncgen_hooks_asyncgen_firstiter_hook_asyncgen_finalizer_hook)r>   old_agen_hookss     r   rE   z%_patch_loop.<locals>.manage_asyncgens   s      s011 	F/11
	8//<<<*&";";= = = = EEE//666*&7777 +* //666*&777 +s   AB! !-Cc                     dS )z2Do not throw exception if loop is already running.N )r>   s    r   _check_runningz#_patch_loop.<locals>._check_running   s    r   r&   NzCan't patch loop of type %srj   r   ntr(   T)r   r+   
isinstancer
   BaseEventLoop
ValueErrortyper?   rG   r   rC   r   _check_runnung
is_runningrp   osname
issubclassProactorEventLooprq   r,   r-   _set_coroutine_wrapperr   r.   r6   r0   r&   )	r   rG   r   rC   r   clsrh   rE   rF   s	         @@@r   r   r   K   s            ' ' ' ' 'R 5 5 ^54 8 8 ^8"   t_%% dG122 F7$t**DEEE
.C!CO/CCM'C'C!%!2!29AAC
4FJsG,EFF 
)##-0-G*y(( --.5l.I Cr   c                      dt           j        v rGddlm}  t          j        | _        t          j        | j        vr| xj        t          j        fz  c_        dS dS dS )zo
    If tornado is imported before nest_asyncio, make tornado aware of
    the pure-Python asyncio Future.
    tornador   N)r,   modulestornado.concurrent
concurrentr
   r4   FUTURES)tcs    r   r	   r	      sd    
 CK''''''N	>++JJ7>++JJJJ	   ,+r   r   )__doc__r
   asyncio.eventsr!   r   r,   rm   
contextlibr   r   heapqr   r   r   r   r   r	   r   r   r   <module>r      s    0 0        				 



     / / / / / / / /         $! $! $!N5 5 5D D DN	, 	, 	, 	, 	,r   