B
    H/\h                 @   s  d dl mZmZ d dlZd dlZd dlmZ g ZejZej	Z
d dlmZ d dlmZ e ZejddejZe
jdfe
jd	fgZd
d ZG dd deZG dd deZG dd deZG dd dejZG dd dejeZG dd deZG dd deej eZ!G dd deej"eZ#G dd dej$eZ%e%e& d< G dd  d ej'eZ(G d!d" d"ej)eZ*G d#d$ d$ej+eZ,G d%d& d&ej-eZ.G d'd( d(ej/eZ0G d)d* d*e0Z1G d+d, d,ej2eZ3dS )-    )absolute_importprint_functionN)	_corecffi)watcher)_dbg_uv_close_callback)nameZREADZWRITEc             C   s   t | tS )N)_baseZevents_to_str_events)events r   3lib/python3.7/site-packages/gevent/libuv/watcher.py_events_to_str$   s    r   c               @   s   e Zd ZdS )UVFuncallErrorN)__name__
__module____qualname__r   r   r   r   r   '   s   r   c               @   s   e Zd Zdd Zdd ZdS )libuv_error_wrapperc             C   s
   || _ d S )N)_libuv)selfuvr   r   r   __init__2   s    zlibuv_error_wrapper.__init__c                s2   t | j| t  fdd}t| || |S )Nc                 s   | rt | d tr| dd  }  | |}|d k	r|dk rtttt|dd tt	|d d t
|  d t
| |S )Nr      ascii z Args: z	 KWARGS: )
isinstancer   r   strffistringlibuvuv_err_namedecodeuv_strerrorrepr)argskwargsZres)
libuv_funcr   r   wrap8   s    
Nz-libuv_error_wrapper.__getattr__.<locals>.wrap)getattrr   	functoolswrapssetattr)r   r   r'   r   )r&   r   __getattr__5   s    zlibuv_error_wrapper.__getattr__N)r   r   r   r   r,   r   r   r   r   r   *   s   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )ffi_unwrapperc             C   s
   || _ d S )N)_ffi)r   Zffr   r   r   r   O   s    zffi_unwrapper.__init__c             C   s   t | j|S )N)r(   r.   )r   r   r   r   r   r,   R   s    zffi_unwrapper.__getattr__c             C   s   t |tst| jt|S )N)r   r   AssertionErrorr.   	addressofr   )r   libr   r   r   r   r0   U   s    zffi_unwrapper.addressofN)r   r   r   r   r,   r0   r   r   r   r   r-   K   s   r-   c               @   s   e Zd ZeeZeeZdZ	dZ
edd Zdd Zdd Zd	d
 Zdd Zejdd Zejdd Zdd Zdd Zdd Zdd ZeeeZdd ZdS )r   r   z%s_tc             C   sB   | j d|}|jr6t|s6t| t|tj t	j
|_d S )Nzuv_handle_t*)_FFIcasttyper   uv_is_closing_closing_watchersaddZuv_closer   r   NULLdata)clsZffi_watcherZffi_handle_watcherr   r   r   _watcher_ffi_closea   s
    
zwatcher._watcher_ffi_closec             C   s
   || _ d S )N)ref)r   r<   r   r   r   _watcher_ffi_set_init_ref   s    z!watcher._watcher_ffi_set_init_refc             C   s   | j | jj| jf| S )N)_watcher_initloopptr_watcher)r   r$   r   r   r   _watcher_ffi_init   s    
zwatcher._watcher_ffi_initc             C   s   |  | j| j d S )N)_watcher_startrA   _watcher_callback)r   r   r   r   _watcher_ffi_start   s    zwatcher._watcher_ffi_startc             C   s   | j r| | j  d S )N)rA   Z_watcher_stop)r   r   r   r   _watcher_ffi_stop   s    zwatcher._watcher_ffi_stopc             C   s   t | j d S )N)r   Zuv_refrA   )r   r   r   r   _watcher_ffi_ref   s    zwatcher._watcher_ffi_refc             C   s   t | j d S )N)r   Zuv_unrefrA   )r   r   r   r   _watcher_ffi_unref   s    zwatcher._watcher_ffi_unrefc             C   s   d S )Nr   )r   r   r   r   _watcher_ffi_start_unref   s    z watcher._watcher_ffi_start_unrefc             C   s   d S )Nr   )r   r   r   r   _watcher_ffi_stop_ref   s    zwatcher._watcher_ffi_stop_refc             C   s   | j d krd S tt| j S )N)rA   boolr   Z
uv_has_ref)r   r   r   r   _get_ref   s    
zwatcher._get_refc             C   s   |r|    n|   d S )N)rG   rH   )r   valuer   r   r   _set_ref   s    
zwatcher._set_refc             G   s   t dd S )NzNot implemented)	Exception)r   Z_reventsZ	_callback_argsr   r   r   feed   s    zwatcher.feedN)r   r   r   r-   r   r2   r   r   _LIBZ_watcher_prefixZ_watcher_struct_patternclassmethodr;   r=   rB   rE   rF   r	   Zonly_if_watcherrG   rH   rI   rJ   rL   rN   propertyr<   rQ   r   r   r   r   r   Z   s"   *
r   c                   s   e Zd ZdZdZdZejejB ej	B Z
dZd& fdd	Zd	d
 Zejdd Zdd Zdd ZeeeZdd ZejdrejjZG dd de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&  Z'S )'ioZpollZ_gevent_poll_callback2Fr   TNc                s4   t t| j||||||fd || _|| _g | _d S )N)r<   priorityrP   )superrU   r   _fdr
   _multiplex_watchers)r   r?   fdr   r<   rV   )	__class__r   r   r      s    zio.__init__c             C   s   | j S )N)rX   )r   r   r   r   _get_fd   s    z
io._get_fdc             C   s   || _ | |f d S )N)rX   rB   )r   rZ   r   r   r   _set_fd   s    z
io._set_fdc             C   s   | j S )N)r
   )r   r   r   r   _get_events   s    zio._get_eventsc             C   s@   || j krd S || _ | jr<| jd k	s(t| | j| j | j d S )N)r
   activeZ_handler/   rC   rA   rD   )r   r   r   r   r   _set_events   s    
zio._set_eventsc             C   s   |  | j| j| j d S )N)rC   rA   r
   rD   )r   r   r   r   rE     s    zio._watcher_ffi_startZwin32c               @   s~   e Zd ZdZdZdZdZdd Zedd e	
d	d Zd
d Zdd Zdd Zedd Zedd Zedd dd ZdS )zio._multiplexwatcherNr   FTc             C   s   || _ || _d S )N)r
   _watcher_ref)r   r   r   r   r   r   r   ,  s    zio._multiplexwatcher.__init__c             C   s   | j S )N)r
   )r   r   r   r   <lambda>7  s    zio._multiplexwatcher.<lambda>c             C   s   t | d|S )Nr
   )r+   )r   nvr   r   r   rb   8  s    c             O   sB   | d| _|| _|| _| j}|d k	r>|js6|  n|  d S )Npass_events)getrd   callbackr$   ra   r_   	_io_start_calc_and_update_events)r   rf   r$   r%   r   r   r   r   start:  s    
zio._multiplexwatcher.startc             C   s,   d | _ d | _d | _| j}|d k	r(|  d S )N)rf   rd   r$   ra   _io_maybe_stop)r   r   r   r   r   stopG  s    zio._multiplexwatcher.stopc             C   s    | j d k	r| j |  d | _ d S )N)ra   _multiplex_closed)r   r   r   r   closeO  s    
zio._multiplexwatcher.closec             C   s
   | j d k	S )N)rf   )r   r   r   r   r_   T  s    zio._multiplexwatcher.activec             C   s   | j jS )N)ra   rA   )r   r   r   r   rA   X  s    zio._multiplexwatcher._watcherc             C   s   t | jddS )NrX   )r(   ra   )r   r   r   r   rb   _  s    c             C   s   | j |S )N)ra   r]   )r   rc   r   r   r   rb   `  s    )r   r   r   rf   r$   rd   r<   r   rT   r	   not_while_activer   ri   rk   rm   r_   rA   rZ   r   r   r   r   _multiplexwatcher%  s   
rp   c             C   s2   |    x| jD ]}|jd k	rd S qW |   d S )N)rh   rY   rf   rk   )r   wr   r   r   rj   b  s
    
zio._io_maybe_stopc             C   s   |    | j| jdd d S )NT)rd   )rh   ri   _io_callback)r   r   r   r   rg   m  s    zio._io_startc             C   s6   d}x"| j D ]}|jd k	r||jO }qW | | d S )Nr   )rY   rf   r   r`   )r   r   r   r   r   r   rh   q  s
    
zio._calc_and_update_eventsc             C   s$   |  || }| j| |   |S )N)rp   rY   appendrh   )r   r   r   r   r   r   	multiplexz  s    zio.multiplexc                s   t t|   | `d S )N)rW   rU   rm   rY   )r   )r[   r   r   rm     s    zio.closec             C   s8   | j | | j s,|   |   |   n|   d S )N)rY   removerk   _no_more_watchersrm   rh   )r   r   r   r   r   rl     s    
zio._multiplex_closedc             C   s   d S )Nr   )r   r   r   r   rv     s    zio._no_more_watchersc          	   C   s   |dk r0t d| jtt|tt| xj| jD ]`}|jsDq8|j	| ks\t
| |j	f||j@ pl|dk }|r8|js|j|j  q8|j|f|j  q8W d S )Nr   zCallback error on)r   rX   r   r   r   r    r"   rY   rf   ra   r/   r   rd   r$   )r   r   r   Z
send_eventr   r   r   rr     s    zio._io_callback)TN)(r   r   r   _watcher_type_watcher_callback_nameZ&_watcher_registers_with_loop_on_creater   UV_READABLEUV_WRITABLEZUV_DISCONNECTZ
EVENT_MASKrY   r   r\   r	   ro   r]   r^   r`   rT   r   rE   sysplatform
startswithr   rR   Zuv_poll_init_socketr>   objectrp   rj   rg   rh   rt   rm   rl   rv   rr   __classcell__r   r   )r[   r   rU      s.   "

=	rU   c                   sx   e Zd ZdZ fddZdd Zedd Zdd	 Zd
d Z	edd Z
dd Zdd Zdd Zdd Zdd Z  ZS )_SimulatedWithAsyncMixinTc                sD   |  | _ytt| j|f|| W n   | j   Y nX d S )N)async__asyncrW   r   r   rm   )r   r?   r$   r%   )r[   r   r   r     s    

z!_SimulatedWithAsyncMixin.__init__c             C   s   d S )Nr   )r   rP   r   r   r   _watcher_create  s    z(_SimulatedWithAsyncMixin._watcher_createc             C   s   d S )Nr   )r   r   r   r   _watcher_handle  s    z(_SimulatedWithAsyncMixin._watcher_handlec             C   s   d S )Nr   )r   rP   r   r   r   rB     s    z*_SimulatedWithAsyncMixin._watcher_ffi_initc             C   s   || j _d S )N)r   r<   )r   r<   r   r   r   r=     s    z2_SimulatedWithAsyncMixin._watcher_ffi_set_init_refc             C   s   | j jS )N)r   r_   )r   r   r   r   r_     s    z_SimulatedWithAsyncMixin.activec             G   s*   |    || _|| _| jj|f|  d S )N)_register_loop_callbackrf   r$   r   ri   )r   cbr$   r   r   r   ri     s    z_SimulatedWithAsyncMixin.startc             C   s"   |    d | _d | _| j  d S )N)_unregister_loop_callbackrf   r$   r   rk   )r   r   r   r   rk     s    z_SimulatedWithAsyncMixin.stopc             C   s   | j d k	r| j }|  d S )N)r   rm   )r   ar   r   r   rm     s    
z_SimulatedWithAsyncMixin.closec             C   s
   t  d S )N)NotImplementedError)r   r   r   r   r     s    z0_SimulatedWithAsyncMixin._register_loop_callbackc             C   s
   t  d S )N)r   )r   r   r   r   r     s    z2_SimulatedWithAsyncMixin._unregister_loop_callback)r   r   r   _watcher_skip_ffir   r   rT   r   rB   r=   r_   ri   rk   rm   r   r   r   r   r   )r[   r   r     s   r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	forkFc             C   s   | j j|  d S )N)r?   _fork_watchersr7   )r   r   r   r   r     s    zfork._register_loop_callbackc             C   s,   y| j j|  W n tk
r&   Y nX d S )N)r?   r   ru   KeyError)r   r   r   r   r     s    zfork._unregister_loop_callbackc             C   s   | j   d S )N)r   send)r   r   r   r   _on_fork  s    zfork._on_forkN)r   r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	childTc             C   s   | j |  d S )N)r?   Z_register_child_watcher)r   r   r   r   r     s    zchild._register_loop_callbackc             C   s   | j |  d S )N)r?   Z_unregister_child_watcher)r   r   r   r   r     s    zchild._unregister_loop_callbackc             C   s   || _ || _| j  d S )N)Z_rpidZ_rstatusr   r   )r   pidZstatusr   r   r   _set_waitpid_status  s    zchild._set_waitpid_statusN)r   r   r   r   r   r   r   r   r   r   r   r   
  s   r   c               @   s<   e Zd ZdZdd Zdd Zdd Zdd	 Zed
d Z	dS )r   Z_gevent_async_callback0c             C   s   |  | jj| jtjS )N)r>   r?   r@   rA   r   r8   )r   r$   r   r   r   rB   '  s    zasync_._watcher_ffi_initc             C   s   | j | j_d S )N)rD   rA   async_cb)r   r   r   r   rE   1  s    zasync_._watcher_ffi_startc             C   s   t j| j_|   d S )N)r   r8   rA   r   rH   )r   r   r   r   rF   8  s    
zasync_._watcher_ffi_stopc             C   s$   t | jrtdt | j d S )NzClosing handle)r   r5   rA   rO   Zuv_async_send)r   r   r   r   r   A  s    zasync_.sendc             C   s   d S )Nr   )r   r   r   r   pendingF  s    zasync_.pendingN)
r   r   r   rx   rB   rE   rF   r   rT   r   r   r   r   r   r   $  s   
	r   asyncc               @   s,   e Zd ZdZdZdd Zdd Zdd Zd	S )
timerZ_gevent_timer_callback0Fc             C   sz   |  | jj| j |\| _| _| jrJ| jdk rJdd l}|jddd d| _| jrv| jdk rvdd l}|jddd d| _d S )NgMbP?r   zTlibuv only supports millisecond timer resolution; all times less will be set to 1 ms   )
stacklevel)r>   r?   _ptrrA   _after_repeatwarningswarn)r   r$   r   r   r   r   rB   d  s    ztimer._watcher_ffi_initc             C   s`   | j rt| j nHy,| | j| jt| jd t| jd  W n t	k
rZ   t
 Y nX d S )Ni  )_againr   Zuv_timer_againrA   rC   rD   intr   r   
ValueError	TypeError)r   r   r   r   rE   x  s    ztimer._watcher_ffi_startc             O   sD   | j s| j|f|| d S d| _z| j|f|| W d | `X d S )NT)r_   ri   r   )r   rf   r$   kwr   r   r   again  s    ztimer.againN)r   r   r   rx   r   rB   rE   r   r   r   r   r   r   L  s
   r   c               @   sX   e Zd ZdZdZdZdd Zdd ZdZd	d
 Z	e
dd Ze
dd Ze
dd ZdS )statZfs_pollZgevent_fs_poll_tZ_gevent_fs_poll_callback3c             C   s   ||j _|S )N)handler9   )r   Zthe_watcherr9   r   r   r   _watcher_set_data  s    zstat._watcher_set_datac             C   s   |  | jj| jS )N)r>   r?   r   rA   )r   r$   r   r   r   rB     s    zstat._watcher_ffi_initg`--g?c             C   s8   | j | jk r| j| _ | | j| j| jt| j d  d S )Ni  )Z	_intervalMIN_STAT_INTERVALrC   rA   rD   Z_cpathr   )r   r   r   r   rE     s
    zstat._watcher_ffi_startc             C   s
   | j jjS )N)rA   r   r9   )r   r   r   r   r     s    zstat._watcher_handlec             C   s   | j jjsd S | j jS )N)rA   Zcurrst_nlink)r   r   r   r   attr  s    
z	stat.attrc             C   s   | j jjsd S | j jS )N)rA   prevr   )r   r   r   r   r     s    
z	stat.prevN)r   r   r   rw   Z_watcher_struct_namerx   r   rB   r   rE   rT   r   r   r   r   r   r   r   r     s   r   c               @   s    e Zd ZdZdd Zdd ZdS )signalZ_gevent_signal_callback1c             C   s   |  | jj| j d| _d S )NF)r>   r?   r   rA   r<   )r   r$   r   r   r   rB     s    zsignal._watcher_ffi_initc             C   s   |  | j| j| j d S )N)rC   rA   rD   Z
_signalnum)r   r   r   r   rE     s    zsignal._watcher_ffi_startN)r   r   r   rx   rB   rE   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdS )idleZ_gevent_idle_callback0N)r   r   r   rx   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdS )checkZ_gevent_check_callback0N)r   r   r   rx   r   r   r   r   r     s   r   c               @   s    e Zd ZdZdd Zdd ZdS )OneShotCheckTc                s"   | j t  fdd}|S )Nc                 s      |  S )Nr   )r$   )funcrk   r   r   r     s    z"OneShotCheck.__make_cb.<locals>.cb)rk   r)   r*   )r   r   r   r   )r   rk   r   Z	__make_cb  s    zOneShotCheck.__make_cbc             G   s   t j| | |f| S )N)r   ri   _OneShotCheck__make_cb)r   rf   r$   r   r   r   ri     s    zOneShotCheck.startN)r   r   r   r   r   ri   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdS )prepareZ_gevent_prepare_callback0N)r   r   r   rx   r   r   r   r   r     s   r   )4Z
__future__r   r   r)   r{   Zgevent.libuvr   __all__r   r1   r   Zgevent._ffir   r	   r   setr6   Z
def_externru   r   ry   rz   r
   r   r   r   r~   r   r-   ZIoMixinrU   r   Z	ForkMixinr   Z
ChildMixinr   Z
AsyncMixinr   localsZ
TimerMixinr   Z	StatMixinr   ZSignalMixinr   Z	IdleMixinr   Z
CheckMixinr   r   ZPrepareMixinr   r   r   r   r   <module>   sH   !d  7&
F'