o
    i!                  	   @   s  U d dl mZ d dlZd dlZd dlmZ d dlZd dlmZ d dl	Zd dl
m
Z
 d dl
mZ d dlmZ ejjZejdef ed	< ejZejdeje f ed
< ejZejdejf ed< ejZejdejf ed< e Zee ed< daejeje ejgdf  ed< i Z!e"eef ed< i Z#e"eef ed< dZ$e%ed< G dd de&Z'dedefddZ(dedej)ee%df ddfddZ*de dejddfdd Z+deddfd!d"Z,ded#eddfd$d%Z-G d&d' d'eZd(ejdef dejdef fd)d*Z.d+eje dejd,ejdeje fd-d.Zd(ejdejf dejdejf fd/d0Z/de0eje eje  eje f fd1d2Z1d7d3d4Z2d7d5d6Z3dS )8    )	FrameTypeN)thread)Greenlet)greenlet)settrace)stack._gevent_hub_spawn_raw_gevent_joinall_gevent_wait_gevent_iwait_tracked_greenlets_original_greenlet_tracer_greenlet_parent_map_parent_greenlet_countFFRAME_NOT_SETc                   @   s   e Zd ZdZdS )GreenletTrackingErrorz3Exception raised when a greenlet cannot be tracked.N)__name__
__module____qualname____doc__ r   r   M/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/profiling/_gevent.pyr      s    r   r   returnc              
   C   s   t | }t}zt|| jpt| j| W n! ty' } zt	d|d }~w t
y7 } zt	d|d }~ww z| t W n tyH   Y n t
yX } zt	d|d }~ww t| | S )Nz,Cannot track greenlet with no name attributezCannot track greenletz#Cannot link greenlet for untracking)r   	get_identr   r   track_greenletnametyper   AttributeErrorr   	Exceptionrawlinkuntrack_greenletr   add)r   greenlet_idframeer   r   r   track_gevent_greenlet$   s*   




r%   r"   r#   c                 C   s   t |  t| | d S N)r   r!   r   update_greenlet_frame)r"   r#   r   r   r   r'   =   s   
r'   eventargsc                 C   s   | dv rgt tttf |\}}t| }tvr)zt| W n	 ty(   Y nw t| }tvrBzt| W n	 tyA   Y nw zt	|t t j
t |jpPt |tvr\t	||j W n	 tyf   Y nw td urrt| | d S d S )N>   throwswitch)tcasttuple	_Greenletr   r   r   r%   r   r'   Optionalr   gr_framer   r   KeyErrorr   )r(   r)   origintarget	origin_id	target_idr   r   r   greenlet_tracerB   s8   r7   c                 C   sl   t | }t| t| t|d  t|d  }d ur2t|  d8  < t| dkr4t|= d S d S d S )N   r   )	r   r   r   r    r   discardr   popr   )r   r"   	parent_idr   r   r   r    n   s   



r    r;   c                 C   s,   t | | t|dd t|< |t| < d S )Nr   r8   )r   link_greenletsr   getr   )r"   r;   r   r   r   r<   y   s   r<   c                       sr   e Zd Zedejdejdef fddZedejdejdef fddZdejdejddf fd	d
Z	  Z
S )r   r)   kwargsr   c                    4   t  j|i |}zt|W S  ty   | Y S w r&   )superspawnr%   r   clsr)   r>   r   	__class__r   r   rA      s   
zGreenlet.spawnc                    r?   r&   )r@   spawn_laterr%   r   rB   rD   r   r   rF      s   
zGreenlet.spawn_laterNc                    s8   t | }t t }t|| t j|i | d S r&   )r   r   gevent
getcurrentr<   r@   join)selfr)   r>   r6   r5   rD   r   r   rI      s   

zGreenlet.join)r   r   r   classmethodr,   Anyr/   rA   rF   rI   __classcell__r   r   rD   r   r      s      &r   originalc                    s"   dt jdt jdtf fdd}|S )Nr)   r>   r   c                     s0    | i |}zt |W S  ty   | Y S w r&   )r%   r   )r)   r>   r   rN   r   r   _   s   
zwrap_spawn.<locals>._)r,   rL   r/   rN   rP   r   rO   r   
wrap_spawn   s   rR   	greenletsr>   c                 O   sV   t  }t|trt j }t|}| D ]
}tt|| qt	| g|R i |S r&   )
rG   rH   
isinstancer   hubget_hubr   r   r<   r	   )rS   r)   r>   current_greenletcurrent_greenlet_idgr   r   r   joinall   s   


rZ   c                    s$   dt jdt jdt jf fdd}|S )Nr)   r>   r   c                     s   z| d }W n t y   |dg }Y nw dd |D  }r?t }t|tr-tj }t	|}|D ]
}t
t	|| q4 | i |S )Nr   r)   c                 S   s    g | ]}t |ttjfr|qS r   )rT   r   rG   r   ).0rP   r   r   r   
<listcomp>   s     z+wait_wrapper.<locals>._.<locals>.<listcomp>)
IndexErrorr=   rG   rH   rT   r   rU   rV   r   r   r<   )r)   r>   objectsrS   rW   rX   rY   rO   r   r   rP      s   


zwait_wrapper.<locals>._)r,   rL   rQ   r   rO   r   wait_wrapper   s    r_   c                  C   sF   t  } t| }ddlm} ||}ttj	t
 | j}|||fS )Nr   )
_threading)rG   rH   r   r   ddtrace.profilingr`   get_thread_namer,   r-   r0   r   r1   )rW   task_idr`   	task_namer#   r   r   r   get_current_greenlet_task   s   


re   c                   C   sh   t  t_ tj_ t jt_t jt_tt_ttt_tt	t_
tttj_ttjttjgd f ttad S r&   )r   rG   r   rA   rF   rZ   r_   r
   waitr   iwaitrR   r   rU   	spawn_rawr,   r-   CallablestrrL   r   r7   r   r   r   r   r   patch   s   

$rk   c                   C   sD   t  t_tj_t jt_t jt_tt_tt_	t
t_ttj_tt d S r&   )r/   rG   r   r   rA   rF   r	   rZ   r
   rf   r   rg   r   rU   rh   r   r   r   r   r   r   unpatch   s   rl   )r   N)4typesr   typingr,   rG   r   gevent.greenletr   r/   
gevent.hubr   r   "ddtrace.internal.datadog.profilingr   rU   rh   r   ri   __annotations__rZ   r	   Sequencerf   r
   rL   rg   r   setr   intr   r0   rj   r   dictr   r   boolr   r   r%   Unionr'   r7   r    r<   rR   r_   r.   re   rk   rl   r   r   r   r   <module>   s@    "",&***
