o
    U˟iv                     @   s0  d Z ddlZddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ejZejZg ZG dd deZeeeeg dZddlmZ eZddlmZ ejZej Z!ej"Z#dd Z$dd Z%dd Z&e'  eeG dd deZ(dS )z
libuv loop implementation
    N)defaultdict)
namedtuple)implementer)
getcurrent)AbstractCallbacks)AbstractLoop)assign_standard_callbacks)ILoop)LoopExit)	_corecffic                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )

_Callbacksc                 C   s    t d|j}|r| |S d S Nzuv_handle_t*)fficastdatafrom_handle)selfwatcher_ptrloop_handle r   Y/var/www/apps/myagent/mysuperagent/venv/lib/python3.10/site-packages/gevent/libuv/loop.py_find_loop_from_c_watcher   s   z$_Callbacks._find_loop_from_c_watcherc                 C   s   |  td|j  d S r   )r   r   r   r   _sigchld_callback)r   r   _signumr   r   r   python_sigchld_callback!   s   z"_Callbacks.python_sigchld_callbackc                 C   s
   |  |S N)python_prepare_callback)r   r   r   r   r   python_timer0_callback$   s   
z!_Callbacks.python_timer0_callbackc                 C   s"   |j }| |}|j|| d S r   )r   r   loop_queue_callback)r   r   reventswatcher_handlethe_watcherr   r   r   python_queue_callback'   s   
z _Callbacks.python_queue_callbackN)__name__
__module____qualname__r   r   r   r#   r   r   r   r   r      s
    r   )r   r   r#   )EVENTSwatcherc                  C   s6   t t } t| ts| d}d| S | }d| S )Nasciizlibuv-)r   stringlibuvuv_version_string
isinstancestrdecode)uv_bytesuv_strr   r   r   get_versionB   s   

r3   c                   C   s   dt jt jt jf S )Nzlibuv-%d.%d.%d)r,   UV_VERSION_MAJORUV_VERSION_MINORUV_VERSION_PATCHr   r   r   r   get_header_versionL      r7   c                   C   s   dgS )Ndefaultr   r   r   r   r   supported_backendsO   s   r:   c                       s|  e Zd ZdZeejdZdZdZdZ	dZ
dZe	ZdPdd	Zd
d Zdd ZdZedd Zdd Zdd Z fddZdd Zdd Zdd Zdd Z fddZd d! Zd"d# Zd$d% Zd&d' Zed(g d)Z d*d+ Z!d,d- Z"d.d/ Z#dQd0d1Z$d2d3 Z%d4Z&d5d6 Z'dRd7d8Z(d9d: Z)d;d< Z*d=d> Z+dZ,dZ-d?d@ Z.dAdB Z/dCdD Z0dEdF Z1dGdH Z2dSdJdKZ3dLdM Z4dSdNdOZ5  Z6S )Tr   gMbP?d   i,  Nzuv_check_t *zuv_prepare_t *zvoid(*)(void*)c                 C   sP   t | ttt|| tt| _i | _t	 | _
t | _| jt k| _g | _d S r   )r   __init__r   r,   	_watchersr   list_child_watchers_io_watchersset_fork_watchersosgetpid_pid_ptruv_default_loop_default_queued_callbacks)r   flagsr9   r   r   r   r<   m   s   


zloop.__init__c                 C   s   | j ||f d S r   )rI   append)r   r   r    r   r   r   r   w   r8   zloop._queue_callbackc                 C   s:   |d u rd}|rt  }nt  }|std| j|_|S )NTzFailed to get loop)r,   rG   uv_loop_newSystemError_handle_to_selfr   )r   rJ   r9   ptrr   r   r   
_init_loopz   s   
zloop._init_loopc                 C   s$   | j sd S | j r| j jsd | _ | j S r   )rF   r   r   r   r   r   rO      s
   zloop.ptrc                 C   s   t | j| j t | jt j t | j td| _	t 
| j| j	 | j| j	_tdt j}t | j	|| j| j t | j	 d S )Nzuv_timer_t*zvoid(*)(uv_timer_t*))r,   uv_check_initrO   _checkuv_check_startpython_check_callbackuv_unrefr   new_signal_idleuv_timer_initrN   r   r   uv_timer_startSIGNAL_CHECK_INTERVAL_MS)r   sig_cbr   r   r   _init_and_start_check   s   
zloop._init_and_start_checkc                 C   s    | j st jtd d S d S )NzDestroyed during run)rO   r   parentthrowr
   rQ   r   r   r   __check_and_die   s   zloop.__check_and_diec                    sP   |    t }|| jkr|| _| jD ]}|  q|  | _tt	| 
  d S r   )_loop__check_and_dierC   rD   rE   rB   _on_fork_loop__run_queued_callbacks_prepare_ran_callbackssuperr   _run_callbacks)r   curpidr)   	__class__r   r   rf      s   



zloop._run_callbacksc                 C   s0   t | j| j t | jt j t | j d S r   )r,   uv_prepare_initrO   _prepareuv_prepare_startr   rV   rQ   r   r   r   _init_and_start_prepare   s   zloop._init_and_start_preparec                 C   s   t | j| j d S r   )r,   rR   rO   _timer0rQ   r   r   r   _init_callback_timer   r8   zloop._init_callback_timerc                 C      t | j d S r   )r,   uv_check_stoprn   rQ   r   r   r   _stop_callback_timer   s   zloop._stop_callback_timerc                 C   s   t | jt j d S r   )r,   rT   rn   r   rQ   r   r   r   _start_callback_timer   s   Vzloop._start_callback_timerc                    s   t t|   | jsJ | jsJ | jsJ t| j t| j t	| j t| j t
| j t| j t	| j d S r   )re   r   _stop_aux_watchersrk   rS   rX   r,   uv_prepare_stopuv_refrq   uv_timer_stoprn   rQ   rh   r   r   rt   H  s   


zloop._stop_aux_watchersc                 C      |    t| j d S r   )rs   r,   rv   rn   rQ   r   r   r   _setup_for_run_callbackX     zloop._setup_for_run_callbackc                 C   s   |S r   r   )r   rO   r   r   r   _can_destroy_loop\     zloop._can_destroy_loopc                 C   sZ   d}|r+t |}|sd S |t jkrtd|t |t j}|r't |t j |sd S d S )N   zUnknown close failure reason)r,   uv_loop_closeUV_EBUSYrM   uv_runUV_RUN_ONCEUV_RUN_NOWAIT)r   rO   closed_failedran_has_more_callbacksr   r   r   __close_loop_  s   


zloop.__close_loopc              	   C   s
  |j }tj|_ z|rt| t| W tj|_ ntj|_ w z7|r'| | W |rGt| j t| j	 t
| j t| j t| | `| `| `| `	| `| `| `d S |rvt| j t| j	 t
| j t| j t| | `| `| `| `	| `| `| `w r   )r   r   NULLr,   uv_stopgevent_close_all_handles_loop__close_loopgevent_zero_checkrS   rn   gevent_zero_preparerk   gevent_zero_timerrX   gevent_zero_loopr@   rB   r?   )r   rO   r   r   r   r   _destroy_loopp  sL   




zloop._destroy_loopHandleState)handletyper)   refactiveclosingc                    sB   | j sdgS | j g  fdd}t| j td|tj S )zL
        Return all the handles that are open and their ref status.
        zLoop has been destroyedc                    sV   | j }|rt|}nd } | tt| j|t| t	| t
|  d S r   )r   r   r   rK   r+   r,   uv_handle_type_namer   
uv_has_refuv_is_activeuv_is_closing)r   _argr   r)   handle_statehandlesr   r   walk  s   
zloop.debug.<locals>.walkzvoid(*)(uv_handle_t*,void*))rO   _HandleStater,   uv_walkr   callbackr   )r   r   r   r   r   debug  s   z
loop.debugc                 C      d S r   r   rQ   r   r   r   r     r|   zloop.refc                 C   r   r   r   rQ   r   r   r   unref  s   z
loop.unrefc                 C   s   | j rt| j  d S d S r   )rO   r,   r   )r   howr   r   r   break_  s   zloop.break_c                 C   rp   r   )r,   uv_loop_forkrO   rQ   r   r   r   reinit  s   zloop.reinitFc              	   C   s   | j sdS | j d d  }| j d d = |D ]E\}}|j}|s%t|r$J qt||}|dkr6t|| q|dkrYt|sY|j}z|rN||krNt| W tj	|_qtj	|_w qdS )NFr}   T)
rI   r   r,   r   
_callbackspython_callbackpython_handle_errorpython_stopr   r   )r   cbsr   argr   valhandle_after_callbackr   r   r   __run_queued_callbacks  s,   

zloop.__run_queued_callbacksc                 C   s   t j}|rt j}|rt j}|t jkrI| jrG| jjrG|   d| _| js)| j	s)t jnt j}t 
| j|}|  }|s@|s@| js@|S | jrG| jjsdS t 
| j|}|   |S )NFr   )r,   UV_RUN_DEFAULTr   r   rF   r   rf   rd   r   rI   r   rc   )r   nowaitoncemoderun_mode
ran_statusran_callbacksresultr   r   r   run  s0   
*zloop.runc                 C   s   |    t| j}|d S )Ng     @@)ra   r,   uv_nowrO   )r   nowr   r   r   r   =  s   zloop.nowc                 C   rx   r   )ra   r,   uv_update_timerO   rQ   r   r   r   
update_nowE  rz   zloop.update_nowc                 C   s&   | j rt| j}|dkr|S d S d S )Nr   )rO   r,   uv_backend_fdrF   )r   fdr   r   r   filenoI  s   zloop.filenoc                 C   s^   | j sd S | jr
d S td| _t| j| j | j| j_t	| j t
| jtjtj d S )Nzuv_signal_t*)r9   _sigchld_watcherr   rW   r,   uv_signal_initrO   rN   r   rV   uv_signal_startr   signalSIGCHLDrQ   r   r   r   install_sigchldR  s   
zloop.install_sigchldc                 C   s2   | j r| jsd S t| j tj| j | `d S r   )r9   r   r,   uv_signal_stopr=   r)   _watcher_ffi_closerQ   r   r   r   reset_sigchldc  s
   zloop.reset_sigchldc                 C   s|   	 zt t j\}}}W n
 ty   Y d S w |dkrd S | j|g | jdg  }|D ]
}| |j|| q-g | jd< q)NTr   )rC   wait3WNOHANGOSErrorr?   getrun_callback_set_waitpid_status)r   pidstatus_usagechildren_watchersr)   r   r   r   r   o  s   
zloop._sigchld_callbackc                 C   s   | j |j | d S r   )r?   rE   rK   )r   r)   r   r   r   _register_child_watcher  s   zloop._register_child_watcherc                 C   sP   z| j |j | W n	 ty   Y nw t| j D ]}| j | s%| j |= qd S r   )r?   rE   remove
ValueErrorr>   )r   r)   r   r   r   r   _unregister_child_watcher  s   
zloop._unregister_child_watcherTc                    st   | j z  }|jsJ d| W n" ty4   | j|  d}| < t| fdd|_Y nw ||S )Nz)IO Watcher %s unclosed but should be deadr   c                      s    t  kr S d S r   )idr   popr   r   io_watchers
watcher_idr   r   <lambda>  s   
zloop.io.<locals>.<lambda>)r@   _multiplex_watchersKeyErrorr=   ior   _no_more_watchers	multiplex)r   r   eventsr   priority
io_watcherr   r   r   r     s   
zloop.ioc                    sh   zj  }W n
 ty   Y dS w |j}|r2 fdd}   || fdd}||_|S )NFc                    sx   z2|  d |   |   dt| v r| `dt| v r| `j| us(J W       d S       w )Nl    _check_fd_validr   )	_io_callbackstop	close_allvarsr   r   r@   r   closer(   checkr   r   r   r   do_it  s   

zloop.closing_fd.<locals>.do_itc                      s   t tjd f )Nz9The file descriptor %s is in the process of being closed.)r   errnoEBADFr   )r   r   r   	not_valid  s   z"loop.closing_fd.<locals>.not_valid)r@   r   r   r   startr   )r   r   r)   
must_deferr   r   r   r   r   
closing_fd  s   
zloop.closing_fdc                 C   s   t d)Nzhprepare watchers are not currently supported in libuv. If you need them, please contact the maintainers.)	TypeError)r   r   r   r   r   r   prepare  s   zloop.prepare)NNr   )FF)TN)7r$   r%   r&   approx_timer_resolutionmaxr   CALLBACK_CHECK_COUNTr[   error_handler_CHECK_POINTER_PREPARE_POINTER_PREPARE_CALLBACK_SIG_TIMER_POINTERr<   r   rP   rX   propertyrO   r]   ra   rf   rm   ro   rr   rs   rt   ry   r{   r   r   r   r   r   r   r   r   r   rd   rc   r   r   r   r   r   _sigchld_callback_ffir   r   r   r   r   r   r   r   __classcell__r   r   rh   r   r   T   sf    


		"Y'

":
5r   ))__doc__r   rC   r   collectionsr   r   zope.interfacer   geventr   gevent._ffi.loopr   r   r   gevent._interfacesr	   gevent.exceptionsr
   gevent.libuvr   r   libr,   __all__r   r   r'   GEVENT_CORE_EVENTSr)   r=   _events_to_strUV_READABLEREADUV_WRITABLEWRITEr3   r7   r:   gevent_set_uv_allocr   r   r   r   r   <module>   sD    	
