a
    xd:                     @   s   d dl Z d dlZd dlmZmZ d dl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rd 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)check_thread_support)Queue	FullError)logger)DEFAULT_QUEUE_SIZE)MYPY)Any)Optional)Callablec                   @   sf   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S )BackgroundWorkerc                 C   s*   t   t|| _t | _d | _d | _d S N)r   r   _queue	threadingLock_lock_thread_thread_for_pid)selfZ
queue_size r   I/var/www/html/Ranjet/env/lib/python3.9/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 r   )r   startr   r   r   r   _ensure_thread'   s    zBackgroundWorker._ensure_threadc                 C   st   t  | }| j}|j  zH|jrT|t   }|dkrDW |j  dS |jj|d qW |j  dS |j  0 d S )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 D | js<tj| jdd| _d| j_| j  t	 | _
W d    n1 sP0    Y  d S )Nzraven-sentry.BackgroundWorker)targetnameT)r   r   r   Thread_targetr   daemonr   r   r   r   r   r   r   r   r   >   s    
zBackgroundWorker.startc              	   C   st   t d | jP | jrRz| jt W n tyD   t d Y n0 d| _d| _W d   n1 sf0    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   killI   s    
zBackgroundWorker.killNc                 C   sX   t d | j* | jr,|dkr,| || W d    n1 s@0    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   flushZ   s
    
*zBackgroundWorker.flushc                 C   sl   t d|}| |sh| j d }td| |d ur@||| | || sh| j d }td| 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   b   s    


zBackgroundWorker._wait_flushc                 C   s4   |    z| j| W dS  ty.   Y dS 0 d S )NTF)r   r   r/   r   r   r3   r   r   r   submito   s    zBackgroundWorker.submitc                 C   sv   | j  }zP|tu r"W | j   qrz
|  W n  tyL   tjddd Y n0 W | j   n| j   0 td q d S )NzFailed processing jobT)exc_infor   )r   getr0   	task_done	Exceptionr   r8   r   r:   r   r   r   r,   x   s    


zBackgroundWorker._target)N)__name__
__module____qualname__r   r   propertyr   r   r(   r   r1   r4   r2   r;   r,   r   r   r   r   r      s   

	r   )r   r   r   r   Zsentry_sdk._compatr   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   