o
    tPfk                     @   sP  d Z ddlmZmZ ddlZddlmZ ddlmZ ddlm	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 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
    )absolute_importprint_functionN)defaultdict)
namedtupledelitem)implementer)
getcurrent)LoopExit)_dbg)AbstractLoop)assign_standard_callbacks)AbstractCallbacks)ILoop)	_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   R/var/www/html/humari/django-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_versionF   s   

r7   c                   C   s   dt jt jt jf S )Nzlibuv-%d.%d.%d)r0   UV_VERSION_MAJORUV_VERSION_MINORUV_VERSION_PATCHr   r   r   r   get_header_versionP      r;   c                   C   s   dgS )Ndefaultr   r   r   r   r   supported_backendsS   s   r>   c                       st  e Zd ZdZeejdZdZdZdZ	dZ
dZe	ZdNd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#dOd0d1Z$d2d3 Z%d4Z&d5d6 Z'dPd7d8Z(d9d: Z)d;d< Z*d=d> Z+dZ,dZ-d?d@ Z.dAdB Z/dCdD Z0dEdF Z1dGdH Z2dQdJdKZ3dQdLdMZ4  Z5S )Rr#   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   r0   	_watchersr   list_child_watchers_io_watchersset_fork_watchersosgetpid_pid_ptruv_default_loop_default_queued_callbacks)r   flagsr=   r   r   r   r@   q   s   


zloop.__init__c                 C   s   | j ||f d S r    )rM   append)r   r   r%   r   r   r   r$   {   r<   zloop._queue_callbackc                 C   s:   |d u rd}|rt  }nt  }|std| j|_|S )NTzFailed to get loop)r0   rK   uv_loop_newSystemError_handle_to_selfr   )r   rN   r=   ptrr   r   r   
_init_loop~   s   
zloop._init_loopc                 C   s$   | j sd S | j r| j jsd | _ | j S r    )rJ   r   r   r   r   r   rS      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*))r0   uv_check_initrS   _checkuv_check_startpython_check_callbackuv_unrefr   new_signal_idleuv_timer_initrR   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)rS   r	   parentthrowr
   rU   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_dierG   rH   rI   rF   _on_fork_loop__run_queued_callbacks_prepare_ran_callbackssuperr#   _run_callbacks)r   curpidr-   	__class__r   r   rj      s   



zloop._run_callbacksc                 C   s0   t | j| j t | jt j t | j d S r    )r0   uv_prepare_initrS   _prepareuv_prepare_startr!   rZ   rU   r   r   r   _init_and_start_prepare   s   zloop._init_and_start_preparec                 C   s   t | j| j d S r    )r0   rV   rS   _timer0rU   r   r   r   _init_callback_timer   r<   zloop._init_callback_timerc                 C      t | j d S r    )r0   uv_check_stoprr   rU   r   r   r   _stop_callback_timer   s   zloop._stop_callback_timerc                 C   s   t | jt j d S r    )r0   rX   rr   r"   rU   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    )ri   r#   _stop_aux_watchersro   rW   r\   r0   uv_prepare_stopuv_refru   uv_timer_stoprr   rU   rl   r   r   rx   L  s   


zloop._stop_aux_watchersc                 C      |    t| j d S r    )rw   r0   rz   rr   rU   r   r   r   _setup_for_run_callback\     zloop._setup_for_run_callbackc                 C   s   |S r    r   )r   rS   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)r0   uv_loop_closeUV_EBUSYrQ   uv_runUV_RUN_ONCEUV_RUN_NOWAIT)r   rS   closed_failedran_has_more_callbacksr   r   r   __close_loopc  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   NULLr0   uv_stopgevent_close_all_handles_loop__close_loopgevent_zero_checkrW   rr   gevent_zero_preparero   gevent_zero_timerr\   gevent_zero_looprD   rF   rC   )r   rS   r   r   r   r   _destroy_loopt  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   rO   r/   r0   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*))rS   _HandleStater0   uv_walkr   callbackr   )r   r   r   r   r   debug  s   z
loop.debugc                 C      d S r    r   rU   r   r   r   r     r   zloop.refc                 C   r   r    r   rU   r   r   r   unref  s   z
loop.unrefc                 C   s   | j rt| j  d S d S r    )rS   r0   r   )r   howr   r   r   break_  s   zloop.break_c                 C   rt   r    )r0   uv_loop_forkrS   rU   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)
rM   r   r0   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   )r0   UV_RUN_DEFAULTr   r   rJ   r   rj   rh   r   rM   r   rg   )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     @@)re   r0   uv_nowrS   )r   nowr   r   r   r   A  s   zloop.nowc                 C   r|   r    )re   r0   uv_update_timerS   rU   r   r   r   
update_nowI  r~   zloop.update_nowc                 C   s&   | j rt| j}|dkr|S d S d S )Nr   )rS   r0   uv_backend_fdrJ   )r   fdr   r   r   filenoM  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*)r=   _sigchld_watcherr   r[   r0   uv_signal_initrS   rR   r   rZ   uv_signal_startr   signalSIGCHLDrU   r   r   r   install_sigchldV  s   
zloop.install_sigchldc                 C   s2   | j r| jsd S t| j tj| j | `d S r    )r=   r   r0   uv_signal_stoprA   r-   _watcher_ffi_closerU   r   r   r   reset_sigchldg  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   )rG   wait3WNOHANGOSErrorrC   getrun_callback_set_waitpid_status)r   pidstatus_usagechildren_watchersr-   r   r   r   r   s  s   
zloop._sigchld_callbackc                 C   s   | j |j | d S r    )rC   rI   rO   )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    )rC   rI   remove
ValueErrorrB   )r   r-   r   r   r   r   _unregister_child_watcher  s   
zloop._unregister_child_watcherTc                    sj   | j z  }|jsJ d| W n ty/   | j|  d}| <  fdd|_Y nw ||S )Nz)IO Watcher %s unclosed but should be deadr   c                      s
   t  S r    r   r   r   io_watchersr   r   <lambda>  s   
 zloop.io.<locals>.<lambda>)rD   _multiplex_watchersKeyErrorrA   io_no_more_watchers	multiplex)r   r   eventsr   priority
io_watcherr   r   r   r     s   
zloop.ioc                 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)6r)   r*   r+   approx_timer_resolutionmaxr   CALLBACK_CHECK_COUNTr_   error_handler_CHECK_POINTER_PREPARE_POINTER_PREPARE_CALLBACK_SIG_TIMER_POINTERr@   r$   rT   r\   propertyrS   ra   re   rj   rq   rs   rv   rw   rx   r}   r   r   r   r   r   r   r   r   r   r   rh   rg   r   r   r   r   r   _sigchld_callback_ffir   r   r   r   r   r   r   __classcell__r   r   rl   r   r#   X   sd    


		"Y'

":
r#   )/__doc__
__future__r   r   rG   collectionsr   r   operatorr   r   zope.interfacer   geventr	   gevent.exceptionsr
   gevent._ffir   gevent._ffi.loopr   r   r   gevent._interfacesr   gevent.libuvr   r   libr0   __all__r   r   r,   GEVENT_CORE_EVENTSr-   rA   _events_to_strUV_READABLEREADUV_WRITABLEWRITEr7   r;   r>   gevent_set_uv_allocr#   r   r   r   r   <module>   sH    	
