o
    dc                     @   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_task_patch_tornadoasyncioget_event_loop_patch_looploop r   Q/var/www/html/visualizacion-main/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rT| t_ t_t_| | t_dt_d	S )z:Patch asyncio module to use pure Python tasks and futures.F)debugc                S   s   zt  }W n ty   t  }t | t| Y nw || t | }z)||W |	 sP|
  tt j || W d    S 1 sJw   Y  S S |	 ss|
  tt j || W d    w 1 snw   Y  w N)r   r	   RuntimeErrornew_event_loopset_event_loopr
   	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                    s    fdd}fdd}dd }t dd t d	d
  dd }t| dr(dS t| tjs6tdt|  | j}||_||_	||_
||_||_d|_tjdkoUt|tj|_tjdk r`|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selfmanage_asyncgens
manage_runr   r   run_foreverF   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   r6   r7   r   result)r9   futuref)r<   r   r   r   N   s   
$z'_patch_loop.<locals>.run_until_completec                 S   s   | 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sy|  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   r7   minmax_whentime	_selectorselect_process_events_clock_resolutionappendrangelenpopleft_run)r9   ready	scheduledtimeout
event_listend_timehandle_r   r   r   r6   \   s<   

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)r9   old_thread_idold_running_loopovr   r   r   r<   {   sL   









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*   rj   _set_coroutine_origin_tracking_debug
_asyncgensset_asyncgen_hooks_asyncgen_firstiter_hook_asyncgen_finalizer_hook)r9   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   r8   r   r   r   _check_running   s   z#_patch_loop.<locals>._check_runningr$   NzCan't patch loop of type %sr   ntr&   T)r   r)   
isinstancer   BaseEventLoop
ValueErrortype	__class__r=   r   r6   rt   _check_runnungr_   osname
issubclassProactorEventLoopr`   r*   r+   _set_coroutine_wrapperrm   r$   )r   r=   r   r6   rt   clsr   r:   r   r
   C   s0   




r
   c                     s   d fdd	} t j}t|drdS tjdkr6 fdd} fdd	}|t j_|t j_t jj |j	| |_	n	|j |j
| |_
d
|_dS )zCPatch the Task's step and enter/leave methods to make it reentrant.Nc              
      sf     | j}z| | W |d u r | jd  d S | | j< d S |d u r- | jd  w | | j< w r   )get_looppop)r   exc	curr_task
curr_tasks	step_origr   r   step   s   z_patch_task.<locals>.stepr$   r&   c                    s   | | < d S r   r   r   r   r   r   r   
enter_task   s   z_patch_task.<locals>.enter_taskc                    s     | d  d S r   )r   r   r   r   r   
leave_task   s   z_patch_task.<locals>.leave_taskTr   )r   r.   r)   r*   r+   r,   _enter_task_leave_taskr4   _Task__step_stepr$   )r   r.   r   r   r   r   r   r      s    



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   r2   FUTURES)tcr   r   r   r      s   
r   r   )__doc__r   asyncio.eventsr   r|   r*   r\   
contextlibr   r   heapqr   r   r   r
   r   r   r   r   r   r   <module>   s    

-{$