o
    ‡eêk  ã                   @   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_ptrZloop_handle© r   úAD:\Projects\ConvertPro\env\Lib\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   Z_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   ÚreventsZwatcher_handleZ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ÚlibuvZuv_version_stringÚ
isinstanceÚstrÚdecode)Zuv_bytesZuv_strr   r   r   Úget_versionF   s   

þr0   c                   C   s   dt jt jt jf S )Nzlibuv-%d.%d.%d)r,   ZUV_VERSION_MAJORZUV_VERSION_MINORZUV_VERSION_PATCHr   r   r   r   Úget_header_versionP   ó   r1   c                   C   s   dgS )NÚdefaultr   r   r   r   r   Úsupported_backendsS   s   r4   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!   gü©ñÒMbP?é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   Úflagsr3   r   r   r   r6   q   s   


zloop.__init__c                 C   s   | j  ||f¡ d S r   )rC   Úappend)r   r   r#   r   r   r   r"   {   r2   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,   rA   Zuv_loop_newÚSystemErrorÚ_handle_to_selfr   )r   rD   r3   Ú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   )r@   r   ©r   r   r   r   rH   —   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_initrH   Ú_checkÚuv_check_startZpython_check_callbackÚuv_unrefr   ÚnewÚ_signal_idleZuv_timer_initrG   r   r   Zuv_timer_startÚSIGNAL_CHECK_INTERVAL_MS)r   Z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)rH   r	   ÚparentÚthrowr
   rJ   r   r   r   Z__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_dier=   r>   r?   r<   Z_on_forkÚ_loop__run_queued_callbacksÚ_prepare_ran_callbacksÚsuperr!   Ú_run_callbacks)r   Zcurpidr)   ©Ú	__class__r   r   rY   Æ   s   



zloop._run_callbacksc                 C   s0   t  | j| j¡ t  | jt j¡ t  | j¡ d S r   )r,   Zuv_prepare_initrH   Ú_prepareZuv_prepare_startr   rN   rJ   r   r   r   Ú_init_and_start_prepareè   s   zloop._init_and_start_preparec                 C   s   t  | j| j¡ d S r   )r,   rK   rH   Ú_timer0rJ   r   r   r   Ú_init_callback_timerí   r2   zloop._init_callback_timerc                 C   ó   t  | j¡ d S r   )r,   Úuv_check_stopr^   rJ   r   r   r   Ú_stop_callback_timerð   s   zloop._stop_callback_timerc                 C   s   t  | jt j¡ d S r   )r,   rM   r^   r    rJ   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   )rX   r!   Ú_stop_aux_watchersr\   rL   rP   r,   Zuv_prepare_stopÚuv_refra   Zuv_timer_stopr^   rJ   rZ   r   r   rd   L  s   


zloop._stop_aux_watchersc                 C   ó   |   ¡  t | j¡ d S r   )rc   r,   re   r^   rJ   r   r   r   Ú_setup_for_run_callback\  ó   zloop._setup_for_run_callbackc                 C   s   |S r   r   )r   rH   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,   Zuv_loop_closeZUV_EBUSYrF   Úuv_runÚUV_RUN_ONCEÚUV_RUN_NOWAIT)r   rH   Zclosed_failedZran_has_more_callbacksr   r   r   Z__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   ÚNULLr,   Úuv_stopZgevent_close_all_handlesÚ_loop__close_loopZgevent_zero_checkrL   r^   Zgevent_zero_preparer\   Zgevent_zero_timerrP   Zgevent_zero_loopr:   r<   r9   )r   rH   r   r   r   r   Ú_destroy_loopt  sL   

€
€
ñ
zloop._destroy_loopZ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   rE   r+   r,   Zuv_handle_type_namert   Z
uv_has_refÚuv_is_activeZuv_is_closing)rs   Z_argr   r)   ©Zhandle_stateZhandlesr   r   Úwalk­  s   
ûzloop.debug.<locals>.walkzvoid(*)(uv_handle_t*,void*))rH   Ú_HandleStater,   Zuv_walkr   Úcallbackro   )r   rz   r   ry   r   Údebug¢  s   ÿýz
loop.debugc                 C   ó   d S r   r   rJ   r   r   r   ru   À  rj   zloop.refc                 C   r~   r   r   rJ   r   r   r   ÚunrefÃ  s   z
loop.unrefc                 C   s   | j rt | j ¡ d S d S r   )rH   r,   rp   )r   Úhowr   r   r   Úbreak_Ç  s   ÿzloop.break_c                 C   r`   r   )r,   Zuv_loop_forkrH   rJ   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 )NFéÿÿÿÿrk   T)
rC   r   r,   rx   Ú
_callbacksZpython_callbackZpython_handle_errorZpython_stopr   ro   )r   Zcbsr   Úargrs   ÚvalZhandle_after_callbackr   r   r   Z__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,   ZUV_RUN_DEFAULTrm   rn   r@   r   rY   rW   r„   rC   rl   rV   )r   ZnowaitÚonceÚmodeZrun_modeZ
ran_statusZran_callbacksÚresultr   r   r   Úrun  s0   
ÿÿý×*zloop.runc                 C   s   |   ¡  t | j¡}|d S )Ng     @@)rU   r,   Zuv_nowrH   )r   Únowr   r   r   r‹   A  s   zloop.nowc                 C   rf   r   )rU   r,   Zuv_update_timerH   rJ   r   r   r   Ú
update_nowI  rh   zloop.update_nowc                 C   s&   | j rt | j¡}|dkr|S d S d S )Nr   )rH   r,   Zuv_backend_fdr@   )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*)r3   Ú_sigchld_watcherr   rO   r,   Zuv_signal_initrH   rG   r   rN   Zuv_signal_startr   ÚsignalZSIGCHLDrJ   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   )r3   r   r,   Zuv_signal_stopr7   r)   Z_watcher_ffi_closerJ   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   )r=   Zwait3ZWNOHANGÚOSErrorr9   ÚgetZrun_callbackZ_set_waitpid_status)r   ÚpidÚstatusZ_usageZchildren_watchersr)   r   r   r   r   s  s   þ
òzloop._sigchld_callbackc                 C   s   | j |j  |¡ d S r   )r9   r?   rE   )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   )r9   r?   ÚremoveÚ
ValueErrorr8   )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   Zio_watchersr   r   Ú<lambda>¦  s   
 zloop.io.<locals>.<lambda>)r:   Z_multiplex_watchersÚKeyErrorr7   ÚioZ_no_more_watchersZ	multiplex)r   r   Úeventsru   ÚpriorityZ
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   ru   r    r   r   r   Úprepareª  s   zloop.prepare)NNr   )FF)TN)6r%   r&   r'   Zapprox_timer_resolutionÚmaxr   ZCALLBACK_CHECK_COUNTrQ   Zerror_handlerZ_CHECK_POINTERZ_PREPARE_POINTERZ_PREPARE_CALLBACK_SIGZ_TIMER_POINTERr6   r"   rI   rP   ÚpropertyrH   rR   rU   rY   r]   r_   rb   rc   rd   rg   ri   rq   rr   r   r{   r}   ru   r   r   r‚   rW   rV   rŠ   r‹   rŒ   rŽ   r   Z_sigchld_callback_ffir‘   r’   r   r—   rš   rž   r¢   Ú__classcell__r   r   rZ   r   r!   X   sd    


		"Y'ÿ

":
r!   )/Ú__doc__Ú
__future__r   r   r=   Úcollectionsr   r   Úoperatorr   r   Zzope.interfacer   Zgeventr	   Zgevent.exceptionsr
   Zgevent._ffir   Zgevent._ffi.loopr   r   r   Zgevent._interfacesr   Zgevent.libuvr   r   Úlibr,   Ú__all__r   r„   r(   ZGEVENT_CORE_EVENTSr)   r7   Z_events_to_strZUV_READABLEÚREADZUV_WRITABLEÚWRITEr0   r1   r4   Zgevent_set_uv_allocr!   r   r   r   r   Ú<module>   sH    þ	
