o
    Zh                     @   s   d dl Z d dlZd dlmZmZ d dlmZmZ d dlmZ d dl	m
Z
 d dlmZ er>d dlmZ d dlmZ d d	lmZ e ZG d
d deZdS )    N)sleeptime)Queue	FullError)logger)DEFAULT_QUEUE_SIZE)TYPE_CHECKING)Any)Optional)Callablec                   @   sn   e Zd ZefddZedd Zdd Zdd Zd	d
 Z	dd Z
dddZdd Zdd Zdd Zdd ZdS )BackgroundWorkerc                 C   s$   t || _t | _d | _d | _d S N)r   _queue	threadingLock_lock_thread_thread_for_pid)selfZ
queue_size r   H/var/www/html/lang_env/lib/python3.10/site-packages/sentry_sdk/worker.py__init__   s   


zBackgroundWorker.__init__c                 C   s&   | j t kr	dS | jsdS | j S )NF)r   osgetpidr   is_aliver   r   r   r   r      s
   
zBackgroundWorker.is_alivec                 C   s   | j s	|   d S d S r   )r   startr   r   r   r   _ensure_thread%   s   zBackgroundWorker._ensure_threadc                 C   st   t  | }| j}|j  z&|jr,|t   }|dkr"W |j  dS |jj|d |jsW |j  dS |j  w )Nr   F)timeoutT)r   r   all_tasks_doneacquireunfinished_tasksreleasewait)r   r   deadlinequeuedelayr   r   r   _timed_queue_join*   s   


z"BackgroundWorker._timed_queue_joinc              	   C   s   | j B | js-tj| jdd| _d| j_z| j  t	 | _
W n ty,   d | _Y nw W d    d S W d    d S W d    d S 1 sHw   Y  d S )Nzraven-sentry.BackgroundWorker)targetnameT)r   r   r   Thread_targetr   daemonr   r   r   r   RuntimeErrorr   r   r   r   r   <   s$   

"zBackgroundWorker.startc              	   C   s   t d | j1 | jr1z| jt W n ty"   t d Y nw d| _d| _W d   dS W d   dS 1 s<w   Y  dS )z
        Kill worker thread. Returns immediately. Not useful for
        waiting on shutdown for events, use `flush` for that.
        z"background worker got kill requestz)background worker queue full, kill failedN)	r   debugr   r   r   
put_nowait_TERMINATORr   r   r   r   r   r   killM   s   
"zBackgroundWorker.killNc                 C   sX   t d | j | jr|dkr| || W d    n1 s w   Y  t d d S )Nz#background worker got flush requestg        zbackground worker flushed)r   r.   r   r   _wait_flush)r   r   callbackr   r   r   flush^   s   
zBackgroundWorker.flushc                 C   s
   | j  S r   )r   fullr   r   r   r   r5   f   s   
zBackgroundWorker.fullc                 C   st   t d|}| |s6| j d }td| |d ur ||| | || s8| j d }td| d S d S d S )Ng?   z%d event(s) pending on flushz"flush timed out, dropped %s events)minr'   r   qsizer   r.   error)r   r   r3   Zinitial_timeoutpendingr   r   r   r2   j   s   


zBackgroundWorker._wait_flushc                 C   s0   |    z	| j| W dS  ty   Y dS w )NTF)r   r   r/   r   r   r3   r   r   r   submitw   s   zBackgroundWorker.submitc                 C   sv   	 | j  }z)|tu rW | j   d S z|  W n ty(   tjddd Y nw W | j   n| j   w td q)NTzFailed processing job)exc_infor   )r   getr0   	task_done	Exceptionr   r9   r   r;   r   r   r   r+      s   

zBackgroundWorker._targetr   )__name__
__module____qualname__r   r   propertyr   r   r'   r   r1   r4   r5   r2   r<   r+   r   r   r   r   r      s    

	r   )r   r   r   r   Zsentry_sdk._queuer   r   Zsentry_sdk.utilsr   Zsentry_sdk.constsr   Zsentry_sdk._typesr   typingr	   r
   r   objectr0   r   r   r   r   r   <module>   s    