B
    ÐH/\[  ã               @   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	d
g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d dlmZ eeƒ dƒ dS )é    )Úprint_functionÚabsolute_importÚdivisionN)Úsettrace)Ú
getcurrent)Úformat_run_info)Úperf_counter)ÚgmctimeÚGreenletTracerÚHubSwitchTracerÚMaxSwitchTracerc               @   sL   e Z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S )r
   c             C   s$   d| _ d | _t| ƒ}|| _d| _d S )Nr   F)Úgreenlet_switch_counterÚactive_greenletr   Úprevious_trace_functionÚ_killed)ÚselfZ
prev_trace© r   ú-lib/python3.7/site-packages/gevent/_tracer.pyÚ__init__   s
    zGreenletTracer.__init__c             C   s    | j sd| _ t| jƒ d | _d S )NT)r   r   r   )r   r   r   r   Úkill1   s    
zGreenletTracer.killc             C   sB   |  j d7  _ |dkr"|d | _nd | _| jd k	r>|  ||¡ d S )Né   )ZswitchÚthrow)r   r   r   )r   ÚeventÚargsr   r   r   Ú_trace8   s    
zGreenletTracer._tracec             C   s   |   ||¡S )N)r   )r   r   r   r   r   r   Ú__call__D   s    zGreenletTracer.__call__c             C   s6   | j }| jdk}d| _|s*|d ks*||kr.dS d|fS )Nr   FT)r   r   )r   Úhubr   Z
did_switchr   r   r   Údid_block_hubG   s    
zGreenletTracer.did_block_hubc             C   s
   d | _ d S )N)r   )r   r   r   r   Ú ignore_current_greenlet_blocking^   s    z/GreenletTracer.ignore_current_greenlet_blockingc             C   s   t ƒ | _d S )N)r   r   )r   r   r   r   Ú!monitor_current_greenlet_blockingb   s    z0GreenletTracer.monitor_current_greenlet_blockingc             C   s¤   ddt ƒ |f g}| d| f ¡ yt ¡ |j }W n  tk
rT   d|f g}Y nX t |¡}| dt|jƒf ¡ | d 	|¡¡ | d¡ | 
tf |Ž¡ |S )NzP================================================================================z'
%s : Greenlet %s appears to be blockedz    Reported by %sz$Unknown: No thread found for hub %r
z!Blocked Stack (for thread id %s):Ú zInfo:)r	   ÚappendÚsysÚ_current_framesZthread_identÚKeyErrorÚ	tracebackÚformat_stackÚhexÚjoinÚextendr   )r   r   r   Zformat_kwargsZreportÚframeÚstackr   r   r   Údid_block_hub_reporte   s    

z#GreenletTracer.did_block_hub_reportN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r,   r   r   r   r   r
      s   c               @   s   e Zd Zdd„ Zdd„ ZdS )Ú
_HubTracerc             C   s   t  | ¡ || _|| _d S )N)r
   r   Úmax_blocking_timer   )r   r   r1   r   r   r   r   {   s    
z_HubTracer.__init__c             C   s   d | _ t | ¡ d S )N)r   r
   r   )r   r   r   r   r   €   s    z_HubTracer.killN)r-   r.   r/   r   r   r   r   r   r   r0   z   s   r0   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )r   c             C   s   t  | ||¡ d| _d S )Nr   )r0   r   Úlast_entered_hub)r   r   r1   r   r   r   r   ˆ   s    zHubSwitchTracer.__init__c             C   s&   t  | ||¡ | j| jkr"tƒ | _d S )N)r
   r   r   r   r   r2   )r   r   r   r   r   r   r   Œ   s    zHubSwitchTracer._tracec             C   s    t ƒ | j | jkrd| jfS d S )NT)r   r2   r1   r   )r   r   r   r   r   r   ‘   s    zHubSwitchTracer.did_block_hubN)r-   r.   r/   r   r   r   r   r   r   r   r   …   s   c               @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )r   c             C   s    t  | ||¡ tƒ | _d| _d S )Nr   )r0   r   r   Úlast_switchÚmax_blocking)r   r   r1   r   r   r   r   š   s    zMaxSwitchTracer.__init__c             C   sD   | j }t | ||¡ || jk	r@|d k	r@tƒ }t| j|| j ƒ| _d S )N)r   r
   r   r   r   Úmaxr4   r3   )r   r   r   Z
old_activeZswitched_atr   r   r   r   Ÿ   s    zMaxSwitchTracer._tracec             C   s2   | j dkrtƒ | j | _ | j | jkr.d| jfS d S )Nr   T)r4   r   r3   r1   r   )r   r   r   r   r   r   ©   s    
zMaxSwitchTracer.did_block_hubN)r-   r.   r/   r   r   r   r   r   r   r   r   –   s   
)Úimport_c_accelzgevent.__tracer)Z
__future__r   r   r   r"   r%   Zgreenletr   r   Zgevent.utilr   Zgevent._compatr   Zgevent._utilr	   Ú__all__Úobjectr
   r0   r   r   r6   Úglobalsr   r   r   r   Ú<module>   s    _