ó
ÐH/\c           @` sŒ  d  d l  m Z m Z m 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  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 d  d l m Z d g Z e e d ƒ Z e e d ƒ Z e d d ƒ Z d e  f d „  ƒ  YZ! d e" f d „  ƒ  YZ# e e ƒ d e" f d „  ƒ  Yƒ Z$ d S(   i    (   t   print_functiont   absolute_importt   divisionN(   t   ref(   t
   getcurrent(   t   config(   t   get_original(   t   notify(   t   EventLoopBlocked(   t   MemoryUsageThresholdExceeded(   t   MemoryUsageUnderThreshold(   t   IPeriodicMonitorThread(   t   implementer(   t   GreenletTracer(   t   thread_mod_name(   t   perf_countert   PeriodicMonitoringThreadt	   get_identt   start_new_threadt   timet   sleept   MonitorWarningc           B` s   e  Z d  Z RS(   s   The type of warnings we emit.(   t   __name__t
   __module__t   __doc__(    (    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyR   $   s   t   _MonitorEntryc           B` s)   e  Z d Z d „  Z d „  Z d „  Z RS(   t   functiont   periodt   last_run_timec         C` s   | |  _  | |  _ d |  _ d  S(   Ni    (   R   R   R   (   t   selfR   R   (    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyt   __init__,   s    		c         C` s"   |  j  | j  k o! |  j | j k S(   N(   R   R   (   R   t   other(    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyt   __eq__1   s    c         C` s   t  |  j |  j |  j f ƒ S(   N(   t   reprR   R   R   (   R   (    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyt   __repr__4   s    (   R   R   R   (   R   R   t	   __slots__R   R    R"   (    (    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyR   (   s   		c           B` sÑ   e  Z d  Z d Z d Z d Z d Z d Z d Z	 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 RS(   g       @g{®Gázt?i   i    c         C` sŽ   t  | |  j ƒ |  _ t |  _ t ƒ  | j k s6 t ‚ t ƒ  |  _	 t
 |  j t j ƒ g |  _ t j |  _ t |  d ƒ |  _ t j ƒ  |  _ d  S(   N(    (   t   wreft
   _on_hub_gct	   _hub_wreft   Truet
   should_runt   get_thread_identt   thread_identt   AssertionErrorR   t   _greenlet_tracerR   t   monitor_blockingt   GEVENT_CONFIGt   max_blocking_timet   _monitoring_functionst   _calculated_sleep_timeR   t   monitor_thread_identt   ost   getpidt   pid(   R   t   hub(    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyR   X   s    		c         C` s=   t  j ƒ  } | |  j k r9 | |  _ t |  d ƒ |  _ n  d  S(   N(    (   R3   R4   R5   R   R2   (   R   R5   (    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyt   _on_forkk   s    	c         C` s
   |  j  ƒ  S(   N(   R&   (   R   (    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyR6   s   s    c         C` sU   t  j } | |  j d j k rN | |  j d _ t d „  |  j Dƒ ƒ |  _ n  |  j S(   Ni    c         s` s   |  ] } | j  Vq d  S(   N(   R   (   t   .0t   x(    (    s.   lib/python2.7/site-packages/gevent/_monitor.pys	   <genexpr>   s    (   R.   R/   R0   R   t   minR1   (   R   t   mbt(    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyt   monitoring_functionsx   s
    	c         C` sø   t  | ƒ s t d ƒ ‚ n  | d  k rX g  |  j D] } | j | k r1 | ^ q1 |  _ n€ | d k rs t d ƒ ‚ ne t | | ƒ } g  |  j D]! } | j | k r§ | n | ^ qŒ |  _ | |  j k rØ |  j j | ƒ n  t d „  |  j Dƒ ƒ |  _ d  S(   Ns   function must be callablei    s   Period must be positive.c         s` s   |  ] } | j  Vq d  S(   N(   R   (   R8   R9   (    (    s.   lib/python2.7/site-packages/gevent/_monitor.pys	   <genexpr>—   s    (	   t   callablet
   ValueErrort   NoneR0   R   R   t   appendR:   R1   (   R   R   R   R9   t   entry(    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyt   add_monitoring_function‚   s    !1c         C` s/   |  j  } | d k r |  j St | |  j f ƒ S(   Ni    (   R1   t   inactive_sleep_timet   maxt   min_sleep_time(   R   t	   min_sleep(    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyt   calculate_sleep_time™   s    	c         C` s'   |  j  s d  St |  _  |  j j ƒ  d  S(   N(   R(   t   FalseR,   t   kill(   R   (    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyRI   ¢   s    		c         C` s   |  j  ƒ  d  S(   N(   RI   (   R   t   _(    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyR%   «   s    c   	      C` s@  t  |  ƒ t ƒ  _ yÎ xÇ |  j rÞ |  j ƒ  } | s9 t ‚ |  j ƒ  } t | ƒ |  j } | sk |  j	 ƒ  n  |  j rØ t
 ƒ  } xX | D]M } | j } | j } | j } | r„ | | | k r„ | | _ | | ƒ q„ q„ Wn  ~ q WWnY t k
 ró nI t s8t j r
q<|  j } | d  k	 r<| j |  t j ƒ  Œ q<n Xd  S(   N(   R$   R   t   gevent_monitoring_threadR(   R<   R+   RG   t   thread_sleepR6   RI   R   R   R   R   t
   SystemExitt   syst   stderrR?   t   handle_errort   exc_info(	   R   t	   functionst
   sleep_timeR6   t   this_runRA   t   fR   t   last_run(    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyt   __call__®   s8    
								c         C` s   |  j  j | ƒ } | s d  S| d } |  j  j | | t d t d |  j ƒ ƒ } | j } x | D] } t | d | ƒq` Wt t	 | t
 j | ƒ ƒ | | f S(   Ni   t   greenlet_stackst   current_thread_identt   file(   R,   t   did_block_hubt   did_block_hub_reportt   dictRH   R2   t   exception_streamt   printR   R   R.   R/   (   R   R6   t	   did_blockt   active_greenlett   reportt   streamt   line(    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyR-   Ü   s    
		c         C` s   |  j  j ƒ  d  S(   N(   R,   t    ignore_current_greenlet_blocking(   R   (    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyRe   ÷   s    c         C` s   |  j  j ƒ  d  S(   N(   R,   t!   monitor_current_greenlet_blocking(   R   (    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyRf   ú   s    c         ` s{   yK d d l  m } m } y | ƒ  ‰  ˆ  j ƒ  Wn | k
 rI d  ‰  n XWn t k
 rd d  ‰  n X‡  f d †  |  _ ˆ  S(   Ni    (   t   Processt   AccessDeniedc           ` s   ˆ  S(   N(    (    (   t   proc(    s.   lib/python2.7/site-packages/gevent/_monitor.pyt   <lambda>  s    (   t   psutilRg   Rh   t   memory_full_infoR?   t   ImportErrort   _get_process(   R   Rg   Rh   (    (   Ri   s.   lib/python2.7/site-packages/gevent/_monitor.pyRn   ý   s    	
c         C` s   |  j  ƒ  d  k	 S(   N(   Rn   R?   (   R   (    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyt   can_monitor_memory_usage  s    c         C` sR   |  j  ƒ  s, d d  l } | j d t ƒ d  S|  j |  j t t j |  j	 ƒ ƒ d  S(   Ni    s/   Unable to monitor memory usage. Install psutil.(
   Ro   t   warningst   warnR   RB   t   monitor_memory_usageRD   R.   t   memory_monitor_periodt   min_memory_monitor_period(   R   Rp   (    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyt   install_monitor_memory_usage  s    		c         C` sÇ   t  j } | s d S|  j ƒ  j ƒ  } t | d d ƒ p= | j } d  } | | k rŒ | |  j k r€ t | | | ƒ } t	 | ƒ n  | |  _ n7 |  j rº t
 | | | |  j ƒ } t	 | ƒ n  d |  _ | S(   Niÿÿÿÿt   ussi    (   R.   t   max_memory_usageRn   Rl   t   getattrt   rssR?   t   _memory_exceededR	   R   R
   (   R   t   _hubt   max_allowedt   rusaget	   mem_usaget   event(    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyRr   !  s$    			c         C` s;   d |  j  j t t |  ƒ ƒ t |  j ƒ t ƒ  |  j ƒ  f S(   Ns*   <%s at %s in thread %s greenlet %r for %r>(   t	   __class__R   t   hext   idR2   R   R&   (   R   (    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyR"   ?  s    	N(   R   R   RC   RE   Rt   R?   R0   R1   Rz   R,   R   R7   t   propertyR6   R<   RB   RG   RI   R%   RW   R-   Re   Rf   Rn   Ro   Ru   Rr   R"   (    (    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyR   8   s0   			
							.							(%   t
   __future__R    R   R   R3   RN   t   weakrefR   R$   t   greenletR   t   geventR   R.   t   gevent.monkeyR   t   gevent.eventsR   R   R	   R
   R   R   t   gevent._tracerR   t   gevent._compatR   R   t   __all__R)   R   RL   t   RuntimeWarningR   t   objectR   R   (    (    (    s.   lib/python2.7/site-packages/gevent/_monitor.pyt   <module>   s.   	