o
    !ifB                     @   sz   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dZdd Zd	d
 Zdd Zdd ZdS )z*Patch asyncio to allow nested event loops.    N)contextmanagersuppress)heappopc                 C   s*   t   t  t  | pt } 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loop r   E/var/www/html/corbot_env/lib/python3.10/site-packages/nest_asyncio.pyapply   s
   r   c                  C   s   dddd} ddd}t tdrd	S tjd
kr2tjj t_ tj_tj_tjj	 t_
 tj_tj_
tjdk rDtjjjtj_tjjjt_tjdkrR| t_ t_t_| t_dt_d	S )z:Patch asyncio module to use pure Python tasks and futures.F)debugc                S   s   t  }|| t | }z)||W | s7|  tt j || W d    S 1 s1w   Y  S S | sZ|  tt j || W d    w 1 sUw   Y  w N)	r   r	   	set_debugensure_futurerun_until_completedonecancelr   CancelledError)mainr   r   taskr   r   r   run   s   



z_patch_asyncio.<locals>.run   c                 S   s    t  }|d u rt   }|S r   )events_get_running_loopget_event_loop_policyr	   )
stacklevelr   r   r   r   _get_event_loop%   s   z'_patch_asyncio.<locals>._get_event_loop_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    r   r   r   r      s$   





r   c                  C   s   dd } t  }| |j_dS )z1Patch the policy to always return a patched loop.c                 S   s.   | j jd u r|  }t| | | | j jS r   )_local_loopnew_event_loopr
   set_event_loop)selfr   r   r   r   r	   @   s
   
z%_patch_policy.<locals>.get_event_loopN)r   r   	__class__r	   )r	   policyr   r   r   r   =   s   r   c                    s   fdd}fdd} fdd}t dd t d	d
 dd }t| dr*dS t| tjs8tdt|  | j}||_||_	||_
||_||_|  rPdnd|_tjdko]t|tj|_tjdk rh|j|_tjdkrqtjjntjj d|_dS )z Patch loop to make it reentrant.c              	      sn   | &  |  	 |    | jrnqW d    n1 sw   Y  W d    n1 s-w   Y  d| _d S )NTF)	_run_once	_stoppingr7   )manage_asyncgens
manage_runr   r   run_foreverN   s    
z _patch_loop.<locals>.run_foreverc                    s    | 2 t j|| d}||urd|_| s#|   | jrn| r| s+td| W  d    S 1 s9w   Y  d S )Nr   Fz+Event loop stopped before Future completed.)r   r   _log_destroy_pendingr   r:   r;   RuntimeErrorresult)r7   futuref)r>   r   r   r   V   s   
$z'_patch_loop.<locals>.run_until_completec           	   
      s0  | j }| j}|r|d jrt| |r|d js|s| jrdn|r0tt|d j|   ddnd}| j	
|}| | |  | j }|r_|d j|k r_t|}|| |r_|d j|k sMtt|D ].}|sn d}dS | }|js | d}z|  W |dur| | < qe|dur| | < w qed}dS )zu
        Simplified re-implementation of asyncio's _run_once that
        runs handles as they become ready.
        r   iQ N)_ready
_scheduled
_cancelledr   r;   minmax_whentime	_selectorselect_process_events_clock_resolutionappendrangelenpopleftpop_run)	r7   ready	scheduledtimeout
event_listend_timehandle_	curr_task)
curr_tasksr   r   r:   d   sJ   



z_patch_loop.<locals>._run_oncec              	   s   s:   |    | j}t }z]t | _t|  |  jd7  _| jr,| j	du r,| 
| j dV  W || _t| |  jd8  _| jrd| jdkrf| j	durh| j	j}| j	  |dur_| j| d| _	dS dS dS dS || _t| |  jd8  _| jr| jdkr| j	dur| j	j}| j	  |dur| j| d| _	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)r7   old_thread_idold_running_loopovr   r   r   r>      sJ   











z_patch_loop.<locals>.manage_runc              	   s   s    t tdsd S t }z+| | j | jd ur!tj| j| jd d V  W | d | jd ur6tj|  d S d S | d | jd urHtj|  w w )Nget_asyncgen_hooks)	firstiter	finalizerF)	r&   r'   rp   _set_coroutine_origin_tracking_debug
_asyncgensset_asyncgen_hooks_asyncgen_firstiter_hook_asyncgen_finalizer_hook)r7   old_agen_hooksr   r   r   r=      s(   





z%_patch_loop.<locals>.manage_asyncgensc                 S   s   dS )z2Do not throw exception if loop is already running.Nr   r<   r   r   r   _check_running   s   z#_patch_loop.<locals>._check_runningr!   NzCan't patch loop of type %sr_   r   ntr#   T)r   r&   
isinstancer   BaseEventLoop
ValueErrortyper8   r?   r   r:   rz   _check_runnung
is_runningre   osname
issubclassProactorEventLooprf   r'   r(   _set_coroutine_wrapperrs   r)   r1   r+   r!   )r   r?   r   r:   rz   clsr   )r^   r=   r>   r   r
   K   s8   )





r
   c                  C   sH   dt jv r ddlm}  tj| _tj| jvr"|  jtjf7  _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   r/   FUTURES)tcr   r   r   r      s   
r   r   )__doc__r   asyncio.eventsr   r   r'   rb   
contextlibr   r   heapqr   r   r   r   r
   r   r   r   r   r   <module>   s    

' 