
    Yfh                       U d dl mZ d dlZd dlZd dlZd dlmZ d dlmZm	Z	m
Z
mZmZ d dlmZmZ d dlmZ  ej$                         Ze	e
e   eed   gdf   Z G d d	      Z ed
d      Zded
<    G d d      ZddZddZ G d de      Zy)    )annotationsN)
ContextVar)AnyCallableList
NamedTupleOptional)get_frame_infosetstatprofile)
LiteralStr
AsyncStatec                  (    e Zd Z	 	 	 	 	 	 	 	 	 	 ddZy)StackSamplerSubscriberc               <    || _         || _        || _        || _        y Ntargetdesired_intervalbound_to_async_contextasync_state)selfr   r   r   r   s        Z/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/pyinstrument/stack_sampler.py__init__zStackSamplerSubscriber.__init__   s#      0&<#&    N)
r   StackSamplerSubscriberTargetr   floatr   boolr   zAsyncState | NonereturnNone)__name__
__module____qualname__r    r   r   r   r      s9    ' -'  	'
 !%' '' 
'r   r   active_profiler_context_var)defaultzContextVar[object | None]c                      e Zd ZU dZded<   ded<   ded<   ded	<   dd
Z	 	 	 	 	 	 ddZddZd ZddZ	d Z
ddZd Z G d de      Zy)StackSamplerz7Manages setstatprofile for Profilers on a single threadzlist[StackSamplerSubscriber]subscriberszfloat | Nonecurrent_sampling_intervalr   last_profile_timezCallable[[], float] | None
timer_funcc                <    g | _         d | _        d| _        d | _        y Ng        )r(   r)   r*   r+   r   s    r   r   zStackSampler.__init__0   s!    )-&!$r   c           
         |r4t         j                         t        d      t         j                  |       | j                  j                  t        ||||rt        d      nd              | j                          y )NzThere is already a profiler running. You cannot run multiple profilers in the same thread or async context, unless you disable async support.
in_contextr   )	r$   getRuntimeErrorsetr(   appendr   r   _update)r   r   r   use_async_contexts       r   	subscribezStackSampler.subscribe6   su     *..0<" d  (++F3"!1'88IJ|4t		
 	r   c                   	 t        fd| j                  D              }|j
                  rt        j                  d        | j                  j                  |       | j                          y # t        $ r t        j	                         w xY w)Nc              3  B   K   | ]  }|j                   k(  s|  y wr   )r   ).0sr   s     r   	<genexpr>z+StackSampler.unsubscribe.<locals>.<genexpr>O   s     PAQXX=OaPs   )
nextr(   StopIterationr'   SubscriberNotFoundr   r$   r3   remover5   )r   r   
subscribers    ` r   unsubscribezStackSampler.unsubscribeM   sv    	4P)9)9PPJ ,, (++D1
+  	41133	4s   A. .Bc                    t        | j                        dk(  r| j                          y t        d | j                  D              }| j                  |k7  r| j                  |       y y )Nr   c              3  4   K   | ]  }|j                     y wr   )r   )r:   r;   s     r   r<   z'StackSampler._update.<locals>.<genexpr>a   s     &Taq'9'9&Ts   )interval)lenr(   _stop_samplingminr)   _start_sampling)r   min_subscribers_intervals     r   r5   zStackSampler._update\   sb    t A%!#&&T4CSCS&T#T ))-EE  *B C Fr   c                    || _         | j                  dk(  r| j                         | _        t        | j                  |t
        | j                         y r-   )r)   r*   _timerr   _sampler$   r+   )r   rE   s     r   rI   zStackSampler._start_samplingf   s=    )1&!!S(%)[[]D"t||X/JDOO\r   c                6    t        d        d | _        d| _        y r-   )r   r)   r*   r.   s    r   rG   zStackSampler._stop_samplingl   s    t)-&!$r   c                4   |dk(  r|\  }}}| j                   D ]  }|j                  |k(  r]|j                  sJ t        |||      }|r-|j	                  t        |             t        d|      |_        \t        d|      |_        o|j                  |k(  s|j                  sJ t        d      |_         y | j                         }	|	| j                  z
  }
t        |||      }| j                   D ]  }|j                  ||
|j                         ! |	| _	        y )Ncontext_changedout_of_context_awaited)infoout_of_context_unknownr0   )
r(   r   r   build_call_stackextendreversedr   r   rL   r*   )r   frameeventargnewoldcoroutine_stackrA   
full_stacknowtime_since_last_sample
call_stacks               r   rM   zStackSampler._sampleq   s'   %%(+%Co".. F
$$+%<<<<!1%!DJ&"))(?*CD1;4:2
. 2<4:2
.  &&#-%<<<<-7-EJ*F" ++-C%(4+A+A%A")%<J".. ^
!!*.DjF\F\]^ &)D"r   c                b    | j                   r| j                         S t        j                         S r   )r+   timeitdefault_timerr.   s    r   rL   zStackSampler._timer   s%    ????$$''))r   c                      e Zd Zy)StackSampler.SubscriberNotFoundN)r    r!   r"   r#   r   r   r?   re      s    r   r?   N)r   r   )r   r   r   r   r6   r   )r   r   )rE   r   )rW   ztypes.FrameTyperX   strrY   r   )r    r!   r"   __doc____annotations__r   r7   rB   r5   rI   rG   rM   rL   	Exceptionr?   r#   r   r   r'   r'   (   so    A--++**,    	.D]%
)>*Y r   r'   c                 h    t        t        d      st               t        _        t        j                  S )zQ
    Gets the stack sampler for the current thread, creating it if necessary
    stack_sampler)hasattrthread_localsr'   rk   r#   r   r   get_stack_samplerrn      s$     =/2&2n#&&&r   c                   g }|dk(  r| r| j                   nd } n8|dk(  s|dk(  r.dt        |d|j                        ddfz  }|j                  |       | )|j                  t	        |              | j                   } | )t        j                         }d|j                  d|j                  fz  }|j                  |       |j                          |S )	Ncallc_returnc_exceptionz%s %s %ir"   z
<built-in>r   z<thread>)
f_backgetattrr    r4   r
   	threadingcurrent_threadnameidentreverse)rW   rX   rY   r`   c_frame_identifierthreadthread_identifiers          r   rT   rT      s    J !&4	*	 6 .C61
 

 	,-

./0 
 %%'F(FKKV\\+RR'( r   c                  (    e Zd ZU ded<   	 dZded<   y)r   zLLiteralStr['in_context', 'out_of_context_awaited', 'out_of_context_unknown']stateNr   rR   )r    r!   r"   rh   rR   r#   r   r   r   r      s    WW D#r   )r   r'   )rW   ztypes.FrameType | NonerX   rf   rY   r   r   z	list[str])
__future__r   ru   rb   typescontextvarsr   typingr   r   r   r   r	   #pyinstrument.low_level.stat_profiler
   r   pyinstrument.typingr   localrm   rf   r   r   r   r$   rh   r'   rn   rT   r   r#   r   r   <module>r      s    "    " < < N *
  	!'cE8L;Q(RTX(XY ' ' :D!4: 6 
o od'@ r   