o
    ai+                     @   s   d dl mZmZ d dlZ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mZ d dlmZ d dlmZ erLd dlmZ d d	lmZ d d
lmZ e ZG dd deZG dd deZG dd deZdS )    )ABCabstractmethodN)sleeptime)Queue	FullError)loggermark_sentry_task_internal)DEFAULT_QUEUE_SIZE)TYPE_CHECKING)Any)Optional)Callablec                   @   sv   e Zd ZdZeedefddZedddZ	dde	d	d
ddfddZ
edefddZed	ddefddZdS )WorkerzBase class for all workers.returnc                 C      dS )z(Whether the worker is alive and running.N selfr   r   O/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/sentry_sdk/worker.pyis_alive      zWorker.is_aliveNc                 C   r   )z5Kill the worker. It will not process any more events.Nr   r   r   r   r   kill      zWorker.killtimeoutcallbackz%Optional[Callable[[int, float], Any]]c                 C   r   )z<Flush the worker, blocking until done or timeout is reached.Nr   r   r   r   r   r   r   flush$   r   zWorker.flushc                 C   r   )z#Whether the worker's queue is full.Nr   r   r   r   r   full*   r   zWorker.fullCallable[[], Any]c                 C   r   )z;Schedule a callback. Returns True if queued, False if full.Nr   r   r   r   r   r   submit/   r   zWorker.submitr   NN)__name__
__module____qualname____doc__propertyr   boolr   r   floatr   r   r!   r   r   r   r   r      s&    
r   c                   @   s   e Zd ZefdeddfddZedefddZddd	Z	d
e
defddZdddZdddZdd
e
ddddfddZdefddZd
e
ddddfddZdddefddZdddZdS ) BackgroundWorker
queue_sizer   Nc                 C   s$   t || _t | _d | _d | _d S r#   )r   _queue	threadingLock_lock_thread_thread_for_pidr   r,   r   r   r   __init__6   s   


zBackgroundWorker.__init__c                 C   s&   | j t kr	dS | jsdS | j S NF)r2   osgetpidr1   r   r   r   r   r   r   <   s
   
zBackgroundWorker.is_alivec                 C      | j s	|   d S d S r#   r   startr   r   r   r   _ensure_threadD      zBackgroundWorker._ensure_threadr   c                 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r   T)r   r-   all_tasks_doneacquireunfinished_tasksreleasewait)r   r   deadlinequeuedelayr   r   r   _timed_queue_joinH   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)r0   r   r.   Thread_targetr1   daemonr:   r6   r7   r2   RuntimeErrorr   r   r   r   r:   Y   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   debugr0   r1   r-   
put_nowait_TERMINATORr   r2   r   r   r   r   r   i   s   
"zBackgroundWorker.killr   Optional[Any]c                 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 request        zbackground worker flushed)r   rM   r0   r   _wait_flushr   r   r   r   r   y   s   
zBackgroundWorker.flushc                 C   s
   | j  S r#   r-   r   r   r   r   r   r      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 )N皙?   %d event(s) pending on flush"flush timed out, dropped %s events)minrF   r-   qsizer   rM   error)r   r   r   initial_timeoutpendingr   r   r   rR      s   


zBackgroundWorker._wait_flushr   c                 C   s0   |    z	| j| W dS  ty   Y dS w )NTF)r;   r-   rN   r   r    r   r   r   r!      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)NTFailed processing jobexc_infor   )r-   getrO   	task_done	Exceptionr   rZ   r   r    r   r   r   rJ      s   

zBackgroundWorker._targetr"   r#   )r$   r%   r&   r
   intr4   r(   r)   r   r;   r*   rF   r:   r   r   r   rR   r!   rJ   r   r   r   r   r+   5   s    


r+   c                   @   s   e Zd ZefdeddfddZedefddZd%dd	Z	d%d
dZ
defddZd%ddZ	d&deddddfddZ	d&deddddfddZdddefddZd%ddZd'ddZ	d&	 	!	"		d(d#d$ZdS ))AsyncWorkerr,   r   Nc                 C   s*   d | _ || _d | _d | _d | _t | _d S r#   )r-   _queue_size_task_task_for_pid_loopset_active_tasksr3   r   r   r   r4      s   zAsyncWorker.__init__c                 C   s8   | j t kr	dS | jr| jsdS | j o| j  S r5   )rg   r6   r7   rf   rh   
is_runningdoner   r   r   r   r      s
   zAsyncWorker.is_alivec                 C   sP   | j r&| j   t| j}|D ]}|  q| j  d | _d | _ d | _d S d S r#   )rf   cancelri   rj   clearrh   rg   )r   tasks_to_canceltaskr   r   r   r      s   




zAsyncWorker.killc                 C   s   | j sMz1t | _tj| jd| _t  | j| 	 | _
W d    n1 s(w   Y  t | _W d S  tyL   td d | _d | _
d | _Y d S w d S )N)maxsizez/No event loop running, async worker not started)r   asyncioget_running_looprh   r   re   r-   r	   create_taskrJ   rf   r6   r7   rg   rL   r   warningr   r   r   r   r:      s   

zAsyncWorker.startc                 C   s   | j d u rdS | j  S )NTrS   r   r   r   r   r      s   

zAsyncWorker.fullc                 C   r8   r#   r9   r   r   r   r   _ensure_task   r<   zAsyncWorker._ensure_taskr   r   rP   c                    s   | j r| j  r| jd u rd S td|}ztj| j |dI d H  W d S  tjyx   | j t	| j
 }td| |d urF||| z|| }tj| j |dI d H  W Y d S  tjyw   | j t	| j
 }td| Y Y d S w w )NrT   r=   rV   rW   )rh   rk   r-   rX   rr   wait_forjoinTimeoutErrorrY   lenrj   r   rM   rZ   )r   r   r   r[   r\   remaining_timeoutr   r   r   rR      s&   
 
"zAsyncWorker._wait_flushzOptional[asyncio.Task[None]]c                 C   s\   | j r,|dkr,| jr,| j r,t  | j| ||W  d    S 1 s'w   Y  d S )NrQ   )r   rh   rk   r	   rt   rR   r   r   r   r   r      s
    zAsyncWorker.flushr   c                 C   s@   |    | jd u rdS z	| j| W dS  tjy   Y dS w )NFT)rv   r-   rN   rr   	QueueFullr    r   r   r   r!      s   
zAsyncWorker.submitc                    s   j d u rd S zL	 j  I d H }|tu rj   W d S t  t|}W d    n1 s4w   Y  j	| j  |
 fdd tdI d H  q
 tjy_   Y d S w )NTc                    s    |  S r#   )_on_task_complete)t	queue_refr   r   r   <lambda>  s    z%AsyncWorker._target.<locals>.<lambda>r   )r-   r`   rO   ra   r	   rr   rt   _process_callbackrj   addadd_done_callbackr   CancelledError)r   r   rp   r   r   r   rJ   
  s(   

zAsyncWorker._targetc                    s   | I d H  d S r#   r   r    r   r   r   r   "  s   zAsyncWorker._process_callbackrp   asyncio.Task[None]rD   Optional[asyncio.Queue[Any]]c              	   C   s   z1z|   W n tjy   Y n ty    tjddd Y nw W |d ur*|  | j| d S |d ur:|  | j| w )Nr]   Tr^   )	resultrr   r   rb   r   rZ   ra   rj   discard)r   rp   rD   r   r   r   r}   &  s   zAsyncWorker._on_task_completer"   r#   )r   r   r   N)rp   r   rD   r   r   N)r$   r%   r&   r
   rc   r4   r(   r)   r   r   r:   r   rv   r*   rR   r   r!   rJ   r   r}   r   r   r   r   rd      sF    








rd   )abcr   r   rr   r6   r.   r   r   sentry_sdk._queuer   r   sentry_sdk.utilsr   r	   sentry_sdk.constsr
   typingr   r   r   r   objectrO   r   r+   rd   r   r   r   r   <module>   s"    q