
    iQ                        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	 ddl
mZ 	 ddlmZ d Zn1# e$ r) e	j        rddlZ G d d	e          Zd
 Zd Znd Zd ZY nw xY w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	 e n# e$ r  G d de           ZY nw xY w G d de!          Z" e"d          Z"d Z#d Z$d Z% G d de&          Z' G d de'          Z( G d  d!e          Z) G d" d#e          Z* G d$ d%e          Z+ G d& d'e          Z, G d( d)e          Z- G d* d+e          Z. G d, d-e          Z/ G d. d/e          Z0 G d0 d1e          Z1 G d2 d3e          Z2dS )4zb
Useful base classes for watchers. The available
watchers will depend on the specific event loop.
    )absolute_importprint_functionN)config)LazyOnClass)get_object_tracebackc                     | S N inits    >/usr/local/lib/python3.11/dist-packages/gevent/_ffi/watcher.pytracemallocr      s        c                       e Zd ZdZd Zd ZdS )_TBlinesc                 (    d |D             | _         d S )Nc                 6    g | ]}|                                 S r
   )rstrip).0xs     r   
<listcomp>z _TB.__init__.<locals>.<listcomp>    s     888Qahhjj888r   r   )selfr   s     r   __init__z_TB.__init__   s    88%888


r   c                     | j         S r	   r   r   s    r   formatz
_TB.format"   s
    z!r   N)__name__
__module____qualname__	__slots__r   r   r
   r   r   r   r      s7        "I9 9 9" " " " "r   r   c                 F     t          j                    fd            }|S )Nc                 j     | g|R i | t          t          j                              | _        d S r	   )r   	tracebackformat_stack_captured_malloc)r   argskwargsr   s      r   tracesztracemalloc.<locals>.traces&   sB    T+D+++F+++(+I,B,D,D(E(E%%%r   	functoolswraps)r   r*   s   ` r   r   r   %   s=    _T""F F F F #"F Mr   c                     | j         S r	   )r'   )objs    r   r   r   ,   s    ''r   c                     d S r	   r
   )_objs    r   r   r   0   s    4r   c                     | S r	   r
   r   s    r   r   r   3   s    Kr   fsencode)_dbg)GEVENT_DEBUG_LEVEL)DEBUG)GEVENT_CORE_EVENTS)_NOARGSc                       e Zd ZdZdS )ResourceWarningzPython 2 fallbackN)r   r    r!   __doc__r
   r   r   r;   r;   G   s        r   r;   c                       e Zd Zd ZdS )_NoWatcherResultc                     dS )Nz<NoWatcher>r
   r   s    r   __repr__z_NoWatcherResult.__repr__L   s    }r   N)r   r    r!   r@   r
   r   r   r>   r>   J   s#            r   r>   c                     g }|D ]+\  }}|}| |z  r|                     |           | | z  } | s n,| r"|                     t          |                      d                    |          S )N|)appendhexjoin)event_field
all_eventsresultflagstringc_flags         r   events_to_strrL   Q   s    F$  v 	&MM&!!!fW%K 	E	 (c+&&'''88Fr   c                 F     t          j                    fd            }|S )Nc                 L    | j         rt          d           | g|R i | d S )Nznot while active)active
ValueError)r   r(   r)   funcs      r   nwznot_while_active.<locals>.nw`   sB    ; 	1/000T#D###F#####r   r+   )rQ   rR   s   ` r   not_while_activerS   _   s8    _T$ $ $ $ $ Ir   c                 F     t          j                    fd            }|S )Nc                 6    | j         r |           S t          S r	   )_watcherr>   )r   rQ   s    r   if_wzonly_if_watcher.<locals>.if_wh   s!    = 	4::r   r+   )rQ   rW   s   ` r   only_if_watcherrX   g   s8    _T          Kr   c                   B    e Zd ZdZdZdZd Zed             Zd Z	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                     |dk    r,|                     d          s|                     |||           d|v rt          st          d          t                              | |||          S )Nwatcher_watcher_skip_ffi__del__z-CFFI watchers are not allowed to have __del__)get_fill_watcherALLOW_WATCHER_DEL	TypeErrortype__new__)clsnamebasescls_dicts       r   rd   zAbstractWatcherType.__new__~   so    9X\\2E%F%FdE8444  ): KLLL||Cuh777r   c                    |                     d          r
|d d         }dd}|                    d          p |d|          }d|vr|dz   |z   }||d<   n.|d                             |          s|dz   |d         z   }||d<   |dz   fd}t          j        ||           |                    d	          s*|                    d
          p |d
|d          pd}||fz  fd}	t          j        ||	           |                    d          p |d|d          pdfd}
t          j        ||
           d }dD ]*}d|z   }||vrt          j        | |||                     +d S )N_Tc                 v    |D ]$}	 t          ||           c S # t          $ r Y !w xY w|rt          |           d S r	   )getattrAttributeError)attrrg   errorbs       r   _mro_getz3AbstractWatcherType._fill_watcher.<locals>._mro_get   sl      "1d+++++%   H +$T***+ +s   
%%_watcher_prefix_watcher_type
_is_activec                 .    t          | j                  S r	   )rm   _LIB)r   active_names    r   _watcher_is_activez=AbstractWatcherType._fill_watcher.<locals>._watcher_is_active   s    49k222r   _watcher_struct_name_watcher_struct_patternFz	struct %sc                 >    | j                             dz             S )Nz *)_FFItypeof)r   watcher_struct_names    r   _watcher_struct_pointer_typezGAbstractWatcherType._fill_watcher.<locals>._watcher_struct_pointer_type   s    9##$7$$>???r   _watcher_callback_name_gevent_generic_callbackc                 D    | j                             | j                  S r	   )r}   	addressofrw   )r   callback_names    r   _watcher_callbackz<AbstractWatcherType._fill_watcher.<locals>._watcher_callback   s    9&&ty-@@@r   c                        fd}||_         |S )Nc                 H    | j         dz   z   }t          | j        |          S )Nrj   )rt   rm   rw   )r   lib_namerf   s     r   methzCAbstractWatcherType._fill_watcher.<locals>._make_meth.<locals>.meth   s'    -3d:ty(333r   )r   )rf   watcher_namer   s   `  r   
_make_methz5AbstractWatcherType._fill_watcher.<locals>._make_meth   s*    4 4 4 4 4 )DMKr   )startstopr   	_watcher_)T)endswithr_   
startswithr   lazy)re   rf   rg   rh   rr   rs   watcher_typery   watcher_struct_patternr   r   r   	meth_namer   rx   r   r   s                 @@@r   r`   z!AbstractWatcherType._fill_watcher   s]    == 	 9D	+ 	+ 	+ 	+ #,,'899_XXFWY^=_=_(***S047L(4H_%%/*55oFF 	5*S08O3LLL(4H_%%4	3 	3 	3 	3 	3 	#5666&ll+ABB" 	K&.ll3L&M&M '5)12KUTY)Z)Z'5)4 # #9L?"J	@ 	@ 	@ 	@ 	@ 	#?@@@!&>?? 7$H%=ueLL76 		A 	A 	A 	A 	A 	#4555	 	 	 1 	P 	PI+i7L8++ ::i+N+NOOO	P 	Pr   c                 6    | j                             |          S r	   )r}   
new_handle)re   r/   s     r   r   zAbstractWatcherType.new_handle   s    x""3'''r   c                 6    | j                             |          S r	   )r}   new)re   kinds     r   r   zAbstractWatcherType.new   s    x||D!!!r   )r   r    r!   r<   r}   rw   rd   classmethodr`   r   r   r
   r   r   rZ   rZ   p   sv          DD8 8 8 ?P ?P [?PB( ( (" " " " "r   rZ   c                      e Zd ZdZdZdZdZeddefd            Z	d Z
ed             Zd Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd ZdZdZdZdZdZdZdZd Zd Z d Z!d Z"e#rd Z$dZ%d Z&e'd             Z(d Z)e'd             Z*d Z+d Z, e'e+e,          Z-d Z.d Z/ e'e.e/          Z0d Z1d  Z2d! Z3e4d"             Z5 e'e3e5          Z6e'd#             Z7e'd$             Z8dS )%r\   NTc                 f    || _         || _        || _        || _        |                                  d S r	   )loop_watcher__init_priority_watcher__init_args_watcher__init_ref_watcher_full_init)r   _looprefpriorityr(   s        r   r   zwatcher.__init__   s8    	'!!!!!r   c                     | j         }| j        }| j        }|                     |           ||                     |           	 |                     |           n#  d | _         xY w|                     |           d S r	   )r   r   r   _watcher_create_watcher_ffi_set_priority_watcher_ffi_initrV   _watcher_ffi_set_init_ref)r   r   r   r(   s       r   r   zwatcher._watcher_full_init   s    'oS!!!**8444	""4((((	
 !DM&&s+++++s   A 
A#c                     d S r	   r
   )re   ffi_watchers     r   _watcher_ffi_closezwatcher._watcher_ffi_close       r   c                 8    |                                  | _        d S r	   )_watcher_newrV   r   r   s     r   r   zwatcher._watcher_create   s    ))++r   c                 P    t          |                               | j                  S r	   )rc   r   r   r   s    r   r   zwatcher._watcher_new   s    Dzz~~d?@@@r   c                     d S r	   r
   r   s     r   r   z!watcher._watcher_ffi_set_init_ref      r   c                     d S r	   r
   r   r   s     r   r   z!watcher._watcher_ffi_set_priority  r   r   c                     t                      r	   NotImplementedErrorr   r(   s     r   r   zwatcher._watcher_ffi_init      !###r   c                     t                      r	   r   r   s    r   _watcher_ffi_startzwatcher._watcher_ffi_start  r   r   c                 P    |                      | j        j        | j                   d S r	   )_watcher_stopr   ptrrV   r   s    r   _watcher_ffi_stopzwatcher._watcher_ffi_stop  s$    49=$-88888r   c                     t                      r	   r   r   s    r   _watcher_ffi_refzwatcher._watcher_ffi_ref  r   r   c                     t                      r	   r   r   s    r   _watcher_ffi_unrefzwatcher._watcher_ffi_unref  r   r   c                 .    |                                   d S r	   )r   r   s    r   _watcher_ffi_start_unrefz watcher._watcher_ffi_start_unref  s    
 	!!!!!r   c                 .    |                                   d S r	   )r   r   s    r   _watcher_ffi_stop_refzwatcher._watcher_ffi_stop_ref  s    r   c                     | j         d S |                                  | j         }d | _         |                     || j        j                   |                     |           d | _        d S r	   )rV   r   _watcher_set_datar}   NULLr   r   )r   rV   s     r   closezwatcher.close6  sc    = F		=x888)))			r   c                     ||_         |S r	   )data)r   the_watcherr   s      r   r   zwatcher._watcher_set_dataA  s      r   c                     | S r	   r
   r   s    r   	__enter__zwatcher.__enter__H  s    r   c                 .    |                                   d S r	   )r   )r   tvtbs       r   __exit__zwatcher.__exit__K  s    

r   c                     | j         rtt          |           }d}|,d                    |                                          }d|z   }t	          j        d| |t                     |                                  d S d S )N 
z
Traceback:
zFailed to close watcher )rV   r   rE   r   warningswarnr;   r   )r   r   tb_msgs      r   r^   zwatcher.__del__O  s    } 
)$//>!YYryy{{33F-6FffM-/ / / 


 
r   Fc                    d| j         j        t          |           fz  }| j        r|dz   S d| _        	 ||                                 }| j        r|dz  }| j        :t          | j        dd           }|| u r|d| j        j        z  z  }n|d| j        z  }| j        |d| j        z  }| j        | j        |d	z  }|d
| j	        z  z  }|d| j
        z  z  }|d| j        z  z  }|dz   d| _        S # d| _        w xY w)Nz<%s at 0x%x>Tz pending__self__z# callback=<bound method %s of self>z
 callback=z args=z stoppedz watcher=%sz
 handle=%sz ref=%sF)	__class__r   id_watcher__in_repr_formatpendingcallbackrm   r(   rV   _watcher_handler   )r   basicrH   fselfs       r   r@   zwatcher.__repr__^  sA   !8"T(( CC> 	3; 	#$udllnnn5F| %*$}(z4@@D==Ct}G]^^FFF@@Fy$		44}$):*$mt}55Fld&:;;Fi48,,FC<"DNNUDN""""s   B7C2 2	C;c                 ,    | j         r| j         j        S d S r	   )rV   r   r   s    r   r   zwatcher._watcher_handle{  s!    = 	&=%%	& 	&r   c                     dS )Nr   r
   r   s    r   r   zwatcher._format  s    rr   c                     t                      r	   r   r   s    r   r   zwatcher.ref      !###r   c                 &    d| j         v r| j        nd S )N	_callback)__dict__r   r   s    r   _get_callbackzwatcher._get_callback  s    !,!=!=t~~4Gr   c                 |    t          |          s|t          d|          |d| j        v r| `d S d S || _        d S )NzExpected callable, not r   )callablerb   r   r   )r   cbs     r   _set_callbackzwatcher._set_callback  sZ    || 	B)22@AAA:dm++NNN ,+  DNNNr   c                     | j         S r	   )_argsr   s    r   	_get_argszwatcher._get_args  s
    zr   c                     t          |t                    s|t          d          |d| j        v r| `d S d S || _        d S )Nzargs must be a tuple or Noner   )
isinstancetuplerb   r   r   r   s     r   	_set_argszwatcher._set_args  sX    $&& 	<4+;:;;;<$-''JJJ (' DJJJr   c                 `   |t          d          || _        |pt          | _        | j        j                            |            |                     | j        t          |           
                    |                     | _        |                                  |                                  d S )Nz#callback must be callable, not None)rb   r   r9   r(   r   _keepalivesetaddr   rV   rc   r   _handler   r   )r   r   r(   s      r   r   zwatcher.start  s    ABBB OG		##D)))--dmT$ZZ=R=RSW=X=XYY!!!%%'''''r   c                 H   | j         | j        | | j        j        vsJ d S d | _         |                                  |                                  | j        j                            |            d | _        |                     | j        | j	        j
                   d | _        d S r	   )r   r   r   r   r   discardr   r   rV   r}   r   r(   r   s    r   r   zwatcher.stop  s    = 9$DI4K(K(K(K(KF 	""$$$   	''---t}din===			r   c                     d S r	   r
   r   s    r   _get_priorityzwatcher._get_priority  s    tr   c                     d S r	   r
   r   s     r   _set_priorityzwatcher._set_priority  r   r   c                 L    | j         |                     | j                   rdS dS )NTF)rV   ry   r   s    r   rO   zwatcher.active  s)    =$)@)@)O)O$4ur   c                     dS )NFr
   r   s    r   r   zwatcher.pending  s    ur   )9r   r    r!   r   r   rV   r   r   r9   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rt   _watcher_init_watcher_startr   r   r   ry   r   r   r   r   ra   r^   r   r@   propertyr   r   r   r   r   r   r   r   r(   r   r   r  rS   r  r   rO   r   r
   r   r   r\   r\      s       IEH G"&G " " " [", , ,*   [, , ,A A A    $ $ $$ $ $9 9 9$ $ $$ $ $" " "     
 M M N M $(  	 	 	        	 	 	 I# # #: & & X&   $ $ X$H H H      x}55H     8Iy))D( ( (        x}55H   X
   X  r   r\   )	metaclassc                   J     e Zd ZdZd fd	Zed             Z fdZd Z xZ	S )	IoMixinr   TNc                     |                      |           || j         z  rt          d|z            || _        t	          t
          |                               ||||p||f           d S )Nzillegal event mask: %rr   r   r(   )_validate_fd
EVENT_MASKrP   _fdsuperr  r   )r   r   fdeventsr   r   r   r   s          r   r   zIoMixin.__init__  s     	"T_$$ 	@5>???gt%%dh+0+@RL 	& 	B 	B 	B 	B 	Br   c                 6    |dk     rt          d|z            d S )Nr   zfd must be non-negative: %r)rP   )re   r  s     r   r  zIoMixin._validate_fd  s&    66:R?@@@ 6r   c                     |pt           }|                    d          rt          f|z   } t          t          |           j        |g|R   d S )Npass_events)r9   r_   r8   r  r  r   )r   r   r(   r)   r   s       r   r   zIoMixin.start  sX    w::m$$ 	1&)D0D"gt"83d333333r   c                     d| j         z  S )Nz fd=%d)r  r   s    r   r   zIoMixin._format  s    $(""r   )TNN)
r   r    r!   r  r   r   r  r   r   __classcell__r   s   @r   r  r    s        J	B 	B 	B 	B 	B 	B A A [A4 4 4 4 4# # # # # # #r   r  c                   4     e Zd ZdZd fd	Z fdZd Z xZS )	
TimerMixintimer        TNc                     |dk     rt          d|z            || _        || _        t          t          |                               |||||f           d S )Nr   z#repeat must be positive or zero: %rr  )rP   _after_repeatr  r  r   )r   r   afterrepeatr   r   r   s         r   r   zTimerMixin.__init__  sb    C<<BVKLLLj$((3QVX^P_(`````r   c                     |                     d| j        j                  }|r| j                                          t	          t
          |           j        |g|R   d S )Nupdate)r_   r   #starting_timer_may_update_loop_time
update_nowr  r  r   )r   r   r(   kwr'  r   s        r   r   zTimerMixin.start  sd    $)"OPP 	# I  """%j$%h6666666r   c                     t                      r	   r   )r   r   r(   r*  s       r   againzTimerMixin.again	  r   r   )r   r   TN)r   r    r!   rt   r   r   r,  r  r  s   @r   r  r    sp        Ma a a a a a7 7 7 7 7"$ $ $ $ $ $ $r   r  c                   $     e Zd ZdZd fd	Z xZS )SignalMixinsignalTNc                     |dk     s|t           j        k    rt          d|z            || _        t	          t
          |                               ||||f           d S )N   zillegal signal number: %rr  )signalmoduleNSIGrP   
_signalnumr  r.  r   )r   r   	signalnumr   r   r   s        r   r   zSignalMixin.__init__  sg    q==I):::89DEEE $k4  ))$C(R[Q^)_____r   )TN)r   r    r!   rt   r   r  r  s   @r   r.  r.    sL        M	` 	` 	` 	` 	` 	` 	` 	` 	` 	`r   r.  c                       e Zd ZdZdS )	IdleMixinidleNr   r    r!   rt   r
   r   r   r7  r7            MMMr   r7  c                       e Zd ZdZdS )PrepareMixinprepareNr9  r
   r   r   r<  r<     s        MMMr   r<  c                       e Zd ZdZdS )
CheckMixincheckNr9  r
   r   r   r?  r?  $  s        MMMr   r?  c                       e Zd ZdZdS )	ForkMixinforkNr9  r
   r   r   rB  rB  (  r:  r   rB  c                   4    e Zd ZdZd Zd Zed             ZdS )
AsyncMixinasyncc                     t                      r	   r   r   s    r   sendzAsyncMixin.send/  r   r   c                 *    |                                  S )z
        Calling compatibility with ``greenlet.switch(arg)``
        as used by waiters that have ``rawlink``.

        This is an advanced method, not usually needed.
        )rH  )r   _ignoreds     r   send_ignoring_argzAsyncMixin.send_ignoring_arg2  s     yy{{r   c                     t                      r	   r   r   s    r   r   zAsyncMixin.pending;  r   r   N)r   r    r!   rt   rH  rK  r  r   r
   r   r   rE  rE  ,  sR        M$ $ $   $ $ X$ $ $r   rE  c                   t     e Zd ZdZd	 fd	Zd Zed             Zed             ZdZ	dZ
ed             Z xZS )

ChildMixinTr   c                     |j         st          d          |                                 || _        | j        r/t          t          |                               ||||f           d S d S )Nz5child watchers are only available on the default loop)r   r(   )defaultrb   install_sigchld_pid_CALL_SUPER_INITr  rN  r   )r   r   pidtracer   r   s        r   r   zChildMixin.__init__E  s}    | 	USTTT	  	O*d##,,Ts#u,NNNNN	O 	Or   c                 &    d| j         d| j        S )Nz pid=z	 rstatus=)rT  rstatusr   s    r   r   zChildMixin._formatM  s     '+xxx>>r   c                     | j         S r	   )rR  r   s    r   rT  zChildMixin.pidP  s
    yr   c                     | j         S r	   )_rpidr   s    r   rpidzChildMixin.rpidT  s     zr   Nc                     | j         S r	   )_rstatusr   s    r   rW  zChildMixin.rstatus\  s
    }r   )r   T)r   r    r!   rS  r   r   r  rT  r[  rZ  r]  rW  r  r  s   @r   rN  rN  @  s         O O O O O O? ? ?   X   X EH  X    r   rN  c                        e Zd Zed             Zd
 fd	Zed             Zed             Zed             Z	ed	             Z
 xZS )	StatMixinc                      t          |           S r	   r3   )paths    r   _encode_pathzStatMixin._encode_pathb  s    ~~r   r   TNc                    |                      |          | _        || _        | j                            d| j                  | _        || _        t          t          |           	                    |||| j        |f           d S )Nzchar[]r  )
rb  _paths_pathr}   r   _cpath	_intervalr  r_  r   )r   r   ra  intervalr   r   r   s         r   r   zStatMixin.__init__f  s    ''-- 
 immHdk::!i''3.2k.6.8 	( 	9 	9 	9 	9 	9r   c                     | j         S r	   )re  r   s    r   ra  zStatMixin.path{  s
    zr   c                     t           r	   r   r   s    r   ro   zStatMixin.attr      !!r   c                     t           r	   r   r   s    r   prevzStatMixin.prev  rk  r   c                     | j         S r	   )rg  r   s    r   rh  zStatMixin.interval  s
    ~r   )r   TN)r   r    r!   staticmethodrb  r   r  ra  ro   rm  rh  r  r  s   @r   r_  r_  `  s          \9 9 9 9 9 9*   X " " X" " " X"   X    r   r_  )3r<   
__future__r   r   r/  r2  r,   r   gevent._configr   gevent._utilr   r   r   ImportErrortrace_mallocr%   objectr   gevent._compatr4   gevent._ffir5   r6   r7   gevent._ffi.loopr8   r9   ra   __all__r;   	NameErrorWarningintr>   rL   rS   rX   rc   rZ   r\   r  r  r.  r7  r<  r?  rB  rE  rN  r_  r
   r   r   <module>r}     s   
 7 6 6 6 6 6 6 6          ! ! ! ! ! ! $ $ $ $ $ $%000000        	" 	" 	" 	" 	"& 	" 	" 	"	 	 		( 	( 	( 	(	 	 		 	 	=B $ # # # # #       * * * * * *       / / / / / / $ $ $ $ $ $&%/ OO       '         s   
 $#A&&       [" [" [" [" ["$ [" [" ["z@ @ @ @ @+ @ @ @ @H# # # # #f # # #:$ $ $ $ $ $ $ $>` ` ` ` `& ` ` `           6                 $ $ $ $ $ $ $ $(       @) ) ) ) ) ) ) ) ) )s!   	. +AAB B%$B%