B
    H/\GP                 @   sB  d Z ddlmZmZ ddlZddlZddlZddlm	Z	 yddl
mZ dd Z
W nT ek
r   e	jrddlZG dd	 d	eZd
d Z
dd Zndd Zdd Z
Y nX 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ekZg Zye W n& ek
r(   G dd deZY nX G dd deZ e dZ dd Z!dd Z"dd Z#G dd  d eZ$G d!d" d"e%Z&G d#d$ d$eZ'e&d$efe(e'j)Z'G d%d& d&eZ*G d'd( d(eZ+G d)d* d*eZ,G d+d, d,eZ-G d-d. d.eZ.G d/d0 d0eZ/G d1d2 d2eZ0G d3d4 d4eZ1G d5d6 d6eZ2G d7d8 d8eZ3dS )9zb
Useful base classes for watchers. The available
watchers will depend on the specific event loop.
    )absolute_importprint_functionN)config)get_object_tracebackc             C   s   | S )N )initr   r   2lib/python3.7/site-packages/gevent/_ffi/watcher.pytracemalloc   s    r	   c               @   s    e Zd ZdZdd Zdd ZdS )_TB)linesc             C   s   dd |D | _ d S )Nc             S   s   g | ]}|  qS r   )rstrip).0xr   r   r   
<listcomp>   s    z _TB.__init__.<locals>.<listcomp>)r   )selfr   r   r   r   __init__   s    z_TB.__init__c             C   s   | j S )N)r   )r   r   r   r   format!   s    z
_TB.formatN)__name__
__module____qualname__	__slots__r   r   r   r   r   r   r
      s   r
   c                s   t   fdd}|S )Nc                s"    | f|| t t | _d S )N)r
   	tracebackformat_stack_captured_malloc)r   argskwargs)r   r   r   traces%   s    ztracemalloc.<locals>.traces)	functoolswraps)r   r   r   )r   r   r	   $   s    c             C   s   | j S )N)r   )objr   r   r   r   +   s    r   c             C   s   d S )Nr   )Z_objr   r   r   r   /   s    c             C   s   | S )Nr   )r   r   r   r   r	   2   s    )fsencode)_dbg)GEVENT_DEBUG_LEVEL)DEBUG)GEVENT_CORE_EVENTS)_NOARGSc               @   s   e Zd ZdZdS )ResourceWarningzPython 2 fallbackN)r   r   r   __doc__r   r   r   r   r&   F   s   r&   c               @   s   e Zd Zdd ZdS )_NoWatcherResultc             C   s   dS )Nz<NoWatcher>r   )r   r   r   r   __repr__K   s    z_NoWatcherResult.__repr__N)r   r   r   r)   r   r   r   r   r(   I   s   r(   c             C   sX   g }x6|D ].\}}|}| |@ r2| | | | @ } | s
P q
W | rN| t|  d|S )N|)appendhexjoin)Zevent_fieldZ
all_eventsresultflagstringZc_flagr   r   r   events_to_strP   s    

r1   c                s   t   fdd}|S )Nc                s"   | j rtd | f|| d S )Nznot while active)active
ValueError)r   r   r   )funcr   r   nw_   s    znot_while_active.<locals>.nw)r   r   )r4   r5   r   )r4   r   not_while_active^   s    r6   c                s   t   fdd}|S )Nc                s   | j r | S tS )N)_watcherr(   )r   )r4   r   r   if_wg   s    zonly_if_watcher.<locals>.if_w)r   r   )r4   r8   r   )r4   r   only_if_watcherf   s    r9   c               @   s*   e Zd Zedd ZdddZdd ZdS )	LazyOnClassc             C   s   | |||j < dS )zCPut a LazyOnClass object in *cls_dict* with the same name as *func*N)r   )clscls_dictr4   r   r   r   lazyq   s    zLazyOnClass.lazyNc             C   s   |p|j | _|| _d S )N)r   namer4   )r   r4   r>   r   r   r   r   v   s    zLazyOnClass.__init__c             C   s(   |d kr| S |  |}t|| j| |S )N)r4   setattrr>   )r   Zinstklassvalr   r   r   __get__z   s
    
zLazyOnClass.__get__)N)r   r   r   classmethodr=   r   rB   r   r   r   r   r:   o   s   
r:   c               @   s<   e Zd ZdZdZdZdd Zedd Zdd Z	d	d
 Z
dS )AbstractWatcherTypez
    Base metaclass for watchers.

    To use, you will:

    - subclass the watcher class defined from this type.
    - optionally subclass this type
    Nc             C   sD   |dkr | ds | ||| d|kr4ts4tdt| |||S )NwatcherZ_watcher_skip_ffi__del__z-CFFI watchers are not allowed to have __del__)get_fill_watcherALLOW_WATCHER_DEL	TypeErrortype__new__)r;   r>   basesr<   r   r   r   rL      s
    zAbstractWatcherType.__new__c                sT  | dr|d d }ddd}|dp2|d|}d|krR|d | }||d< n&|d |sx|d |d  }||d< |d   fd	d
}t|| |ds|dp|d|dpd}||f fdd}	t||	 |dp|d|dpdfdd}
t||
 dd }x2dD ]*}d| }||kr"t|||| q"W d S )N_Tc          	   S   s@   x.|D ]&}y
t || S  tk
r*   wY qX qW |r<t| d S )N)getattrAttributeError)attrrM   errorbr   r   r   _mro_get   s    

z3AbstractWatcherType._fill_watcher.<locals>._mro_get_watcher_prefix_watcher_typeZ
_is_activec                s   t | j S )N)rP   _LIB)r   )active_namer   r   _watcher_is_active   s    z=AbstractWatcherType._fill_watcher.<locals>._watcher_is_activeZ_watcher_struct_nameZ_watcher_struct_patternFz	struct %sc                s   | j  d S )Nz *)_FFIZtypeof)r   )watcher_struct_namer   r   _watcher_struct_pointer_type   s    zGAbstractWatcherType._fill_watcher.<locals>._watcher_struct_pointer_typeZ_watcher_callback_nameZ_gevent_generic_callbackc                s   | j | j S )N)r[   Z	addressofrX   )r   )callback_namer   r   _watcher_callback   s    z<AbstractWatcherType._fill_watcher.<locals>._watcher_callbackc                s    fdd}||_ |S )Nc                s   | j d   }t| j|S )NrN   )rW   rP   rX   )r   Zlib_name)r>   r   r   meth   s    zCAbstractWatcherType._fill_watcher.<locals>._make_meth.<locals>.meth)r   )r>   watcher_namer`   r   )r>   r   
_make_meth   s    z5AbstractWatcherType._fill_watcher.<locals>._make_meth)startstopr   Z	_watcher_)T)endswithrG   
startswithr:   r=   )r;   r>   rM   r<   rU   rV   Zwatcher_typerZ   Zwatcher_struct_patternr]   r_   rb   Z	meth_namera   r   )rY   r^   r\   r   rH      s>    








z!AbstractWatcherType._fill_watcherc             C   s   | j |S )N)r[   
new_handle)r;   r   r   r   r   rg      s    zAbstractWatcherType.new_handlec             C   s   | j |S )N)r[   new)r;   Zkindr   r   r   rh      s    zAbstractWatcherType.new)r   r   r   r'   r[   rX   rL   rC   rH   rg   rh   r   r   r   r   rD      s   BrD   c               @   s  e Zd ZdZdZdZdZeddef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dd Zdd Zdd Zdd Zdd Zdd ZdZdZdZdZdZdZdZdd  Zd!d" Z d#d$ Z!d%d& Z"e#rd'd( Z$d)d* Z%e&d+d, Z'd-d. Z(e&d/d0 Z)d1d2 Z*d3d4 Z+e&e*e+Z,d5d6 Z-d7d8 Z.e&e-e.Z/d9d: Z0d;d< Z1d=d> Z2e3d?d@ Z4e&e2e4Z5e&dAdB Z6e&dCdD Z7dS )ErE   NTc             C   s$   || _ || _|| _|| _|   d S )N)loop_watcher__init_priority_watcher__init_args_watcher__init_ref_watcher_full_init)r   _looprefpriorityr   r   r   r   r      s
    zwatcher.__init__c             C   s`   | j }| j}| j}| | |d k	r.| | y| | W n   d | _ Y nX | | d S )N)rj   rl   rk   _watcher_create_watcher_ffi_set_priority_watcher_ffi_initr7   _watcher_ffi_set_init_ref)r   rp   ro   r   r   r   r   rm      s    

zwatcher._watcher_full_initc             C   s   d S )Nr   )r;   Zffi_watcherr   r   r   _watcher_ffi_close  s    zwatcher._watcher_ffi_closec             C   s   |   | _d S )N)_watcher_newr7   )r   ro   r   r   r   rq     s    zwatcher._watcher_createc             C   s   t | | jS )N)rK   rh   r]   )r   r   r   r   rv     s    zwatcher._watcher_newc             C   s   d S )Nr   )r   ro   r   r   r   rt     s    z!watcher._watcher_ffi_set_init_refc             C   s   d S )Nr   )r   rp   r   r   r   rr     s    z!watcher._watcher_ffi_set_priorityc             C   s
   t  d S )N)NotImplementedError)r   r   r   r   r   rs     s    zwatcher._watcher_ffi_initc             C   s
   t  d S )N)rw   )r   r   r   r   _watcher_ffi_start  s    zwatcher._watcher_ffi_startc             C   s   |  | jj| j d S )N)_watcher_stopri   Z_ptrr7   )r   r   r   r   _watcher_ffi_stop!  s    zwatcher._watcher_ffi_stopc             C   s
   t  d S )N)rw   )r   r   r   r   _watcher_ffi_ref$  s    zwatcher._watcher_ffi_refc             C   s
   t  d S )N)rw   )r   r   r   r   _watcher_ffi_unref'  s    zwatcher._watcher_ffi_unrefc             C   s   |    d S )N)r|   )r   r   r   r   _watcher_ffi_start_unref*  s    z watcher._watcher_ffi_start_unrefc             C   s   |    d S )N)r{   )r   r   r   r   _watcher_ffi_stop_ref1  s    zwatcher._watcher_ffi_stop_refc             C   sF   | j d krd S |   | j }d | _ | || jj | | d | _d S )N)r7   rd   _watcher_set_datar[   NULLru   ri   )r   r7   r   r   r   closeI  s    

zwatcher.closec             C   s
   ||_ |S )N)data)r   Zthe_watcherr   r   r   r   r   T  s    zwatcher._watcher_set_datac             C   s   | S )Nr   )r   r   r   r   	__enter__[  s    zwatcher.__enter__c             C   s   |    d S )N)r   )r   tvtbr   r   r   __exit__^  s    zwatcher.__exit__c             C   sP   | j rLt| }d}|d k	r0d| }d| }td| |f t |   d S )N 
z
Traceback:
zFailed to close watcher %r%s)r7   r   r-   r   warningswarnr&   r   )r   r   Ztb_msgr   r   r   rF   b  s    zwatcher.__del__c             C   s   |   }d| jjt| |f }| jr,|d7 }| jd k	rnt| jdd }|| kr^|d| jj 7 }n|d| jf 7 }| jd k	r|d| jf 7 }| jd kr| jd kr|d7 }|d| j 7 }|d	| j	 7 }|d
| j
 7 }|d S )Nz<%s at 0x%x%sz pending__self__z# callback=<bound method %s of self>z callback=%rz args=%rz stoppedz watcher=%sz
 handle=%sz ref=%s>)_format	__class__r   idpendingcallbackrP   r   r7   _watcher_handlero   )r   Zformatsr.   Zfselfr   r   r   r)   p  s"    

zwatcher.__repr__c             C   s   | j r| j jS d S )N)r7   r   )r   r   r   r   r     s    zwatcher._watcher_handlec             C   s   dS )Nr   r   )r   r   r   r   r     s    zwatcher._formatc             C   s
   t  d S )N)rw   )r   r   r   r   ro     s    zwatcher.refc             C   s   | j S )N)	_callback)r   r   r   r   _get_callback  s    zwatcher._get_callbackc             C   s@   t |s|d k	rtd|f |d kr6d| jkr<| `n|| _d S )NzExpected callable, not %rr   )callablerJ   __dict__r   )r   cbr   r   r   _set_callback  s    
zwatcher._set_callbackc             C   s   | j S )N)_args)r   r   r   r   	_get_args  s    zwatcher._get_argsc             C   s<   t |ts|d k	rtd|d kr2d| jkr8| `n|| _d S )Nzargs must be a tuple or Noner   )
isinstancetuplerJ   r   r   )r   r   r   r   r   	_set_args  s    
zwatcher._set_argsc             G   s\   |d krt d|| _|pt| _| jj|  | | jt	| 
| | _|   |   d S )Nz#callback must be callable, not None)rJ   r   r%   r   ri   _keepalivesetaddr   r7   rK   rg   _handlerx   r}   )r   r   r   r   r   r   rc     s    
zwatcher.startc             C   sn   | j d kr(| jd ks$| | jjks$td S |   |   | jj|  d | _| | j	| j
j d | _d | _d S )N)r   ri   r   AssertionErrorr~   rz   discardr   r   r7   r[   r   r   r   )r   r   r   r   rd     s    
zwatcher.stopc             C   s   d S )Nr   )r   r   r   r   _get_priority  s    zwatcher._get_priorityc             C   s   d S )Nr   )r   rp   r   r   r   _set_priority  s    zwatcher._set_priorityc             C   s   | j d k	r| | j rdS dS )NTF)r7   rZ   )r   r   r   r   r2     s    zwatcher.activec             C   s   dS )NFr   )r   r   r   r   r     s    zwatcher.pending)8r   r   r   r   r   r7   r   r	   r%   r   rm   rC   ru   rq   rv   rt   rr   rs   rx   rz   r{   r|   r}   r~   rW   Z_watcher_initZ_watcher_startry   r]   r_   rZ   r   r   r   r   rI   rF   r)   propertyr   r   ro   r   r   r   r   r   r   rc   rd   r   r6   r   rp   r2   r   r   r   r   r   rE      sb   
	


rE   c                   s6   e Zd ZdZd
 fdd	Z fddZdd	 Z  ZS )IoMixinr   TNc                sV   |dk rt d| || j @ r,t d| || _tt| j||||pL||fd d S )Nr   zfd must be non-negative: %rzillegal event mask: %r)ro   rp   r   )r3   
EVENT_MASK_fdsuperr   r   )r   ri   fdZeventsro   rp   r   )r   r   r   r     s    zIoMixin.__init__c                s6   |pt }|drtf| }tt| j|f|  d S )NZpass_events)r%   rG   r$   r   r   rc   )r   r   r   r   )r   r   r   rc     s    

zIoMixin.startc             C   s
   d| j  S )Nz fd=%d)r   )r   r   r   r   r     s    zIoMixin._format)TNN)r   r   r   r   r   rc   r   __classcell__r   r   )r   r   r     s   r   c                   s6   e Zd ZdZd fdd	Z fddZd	d
 Z  ZS )
TimerMixinZtimer        TNc                s@   |dk rt d| || _|| _tt| j|||||fd d S )Ng        z#repeat must be positive or zero: %r)ro   rp   r   )r3   Z_after_repeatr   r   r   )r   ri   Zafterrepeatro   rp   )r   r   r   r     s
    zTimerMixin.__init__c                s8   | d| jj}|r| j  tt| j|f|  d S )Nupdate)rG   ri   Z#starting_timer_may_update_loop_timeZ
update_nowr   r   rc   )r   r   r   kwr   )r   r   r   rc     s    
zTimerMixin.startc             O   s
   t  d S )N)rw   )r   r   r   r   r   r   r   again
  s    zTimerMixin.again)r   r   TN)r   r   r   rW   r   rc   r   r   r   r   )r   r   r     s   r   c                   s"   e Zd ZdZd fdd	Z  ZS )SignalMixinsignalTNc                sB   |dk s|t jkrtd| || _tt| j||||fd d S )N   zillegal signal number: %r)ro   rp   r   )signalmoduleNSIGr3   Z
_signalnumr   r   r   )r   ri   Z	signalnumro   rp   )r   r   r   r     s    zSignalMixin.__init__)TN)r   r   r   rW   r   r   r   r   )r   r   r     s   r   c               @   s   e Zd ZdZdS )	IdleMixinZidleN)r   r   r   rW   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdS )PrepareMixinZprepareN)r   r   r   rW   r   r   r   r   r   !  s   r   c               @   s   e Zd ZdZdS )
CheckMixinZcheckN)r   r   r   rW   r   r   r   r   r   %  s   r   c               @   s   e Zd ZdZdS )	ForkMixinforkN)r   r   r   rW   r   r   r   r   r   )  s   r   c               @   s$   e Zd ZdZdd Zedd ZdS )
AsyncMixinasyncc             C   s
   t  d S )N)rw   )r   r   r   r   send0  s    zAsyncMixin.sendc             C   s
   t  d S )N)rw   )r   r   r   r   r   3  s    zAsyncMixin.pendingN)r   r   r   rW   r   r   r   r   r   r   r   r   -  s   r   c                   sV   e Zd ZdZd fdd	Zdd Zedd Zed	d
 ZdZ	dZ
edd Z  ZS )
ChildMixinTr   c                s@   |j std|  || _| jr<tt| j||||fd d S )Nz5child watchers are only available on the default loop)ro   r   )defaultrJ   Zinstall_sigchld_pid_CALL_SUPER_INITr   r   r   )r   ri   pidZtracero   )r   r   r   r   =  s    zChildMixin.__init__c             C   s   d| j | jf S )Nz pid=%r rstatus=%r)r   rstatus)r   r   r   r   r   E  s    zChildMixin._formatc             C   s   | j S )N)r   )r   r   r   r   r   H  s    zChildMixin.pidc             C   s   | j S )N)_rpid)r   r   r   r   rpidL  s    zChildMixin.rpidNc             C   s   | j S )N)_rstatus)r   r   r   r   r   T  s    zChildMixin.rstatus)r   T)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   8  s   r   c                   sZ   e Zd Zedd Zd fdd	Zedd	 Zed
d Zedd Z	edd Z
  ZS )	StatMixinc             C   s   t | S )N)r    )pathr   r   r   _encode_pathZ  s    zStatMixin._encode_path        TNc                sL   |  || _|| _| jd| j| _|| _tt| j	|||| j|fd d S )Nzchar[])ro   rp   r   )
r   Z_paths_pathr[   rh   Z_cpath	_intervalr   r   r   )r   rn   r   intervalro   rp   )r   r   r   r   ^  s    	zStatMixin.__init__c             C   s   | j S )N)r   )r   r   r   r   r   s  s    zStatMixin.pathc             C   s   t d S )N)rw   )r   r   r   r   rR   w  s    zStatMixin.attrc             C   s   t d S )N)rw   )r   r   r   r   prev{  s    zStatMixin.prevc             C   s   | j S )N)r   )r   r   r   r   r     s    zStatMixin.interval)r   TN)r   r   r   staticmethodr   r   r   r   rR   r   r   r   r   r   )r   r   r   X  s   r   )4r'   Z
__future__r   r   r   r   r   r   Zgevent._configr   r	   r   ImportErrorZtrace_mallocr   objectr
   Zgevent._compatr    Zgevent._ffir!   r"   r#   Zgevent._ffi.loopr$   r%   rI   __all__r&   	NameErrorWarningintr(   r1   r6   r9   r:   rK   rD   rE   dictr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s`   

	] v 