o
    hp                     @   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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)self
queue_size r   S/var/www/html/pro-man-master/venv/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sentry-sdk.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   r6   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   r4   initial_timeoutpendingr   r   r   r3   j   s   


zBackgroundWorker._wait_flushc                 C   s0   |    z	| j| W dS  ty   Y dS w )NTF)r   r   r0   r   r   r4   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   getr1   	task_done	Exceptionr   r:   r   r=   r   r   r   r,      s   

zBackgroundWorker._targetr   )__name__
__module____qualname__r   r   propertyr   r   r(   r   r2   r5   r6   r3   r>   r,   r   r   r   r   r      s    

	r   )r   r   r   r   sentry_sdk._queuer   r   sentry_sdk.utilsr   sentry_sdk.constsr   typingr   r	   r
   r   objectr1   r   r   r   r   r   <module>   s    