o
    i~                     @   s"  U d Z ddlZddlZddlZddlZddlZddlZddlmZ e	e
Zg Zejejg df  ed< g Zejejg df  ed< g Zejejg df  ed< dZdadad	d
 Zdd Zd*ddZdefddZdeejg df  ddfddZeeeZeeeZeeeZdd Z ee eZ!ee eZ"ee eZ#e"e e#e dejg df ddfddZ$dejg df ddfddZ%dejg df ddfddZ&e'ed rej(eeed! e)d"Z*G d#d$ d$ej+ej,e* Z-e. Z/ej.e- ed%< d*d&d'Z0e"e0 dej1fd(d)Z2dS )+z(
An API to provide fork-safe functions.
    N)
_unpatched	_registry_registry_before_fork_registry_after_parentTFc                   C      da d S NT_forked r
   r
   M/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/internal/forksafe.py
set_forked&      r   c                   C      t S Nr   r
   r
   r
   r   
has_forked,      r   returnc                   C   r   r   _fork_childr
   r
   r
   r   set_fork_child0   r   r   c                   C   r   r   r   r
   r
   r
   r   is_fork_child6   r   r   registryc              	   C   s:   t | D ]}z|  W q ty   td| Y qw d S )Nz%Exception ignored in forksafe hook %r)list	Exceptionlog	exceptionr   hookr
   r
   r   	run_hooks:   s   
r   c                 C   s   |  | |S r   )appendr   r
   r
   r   register_hookH   s   
r    after_in_childc                 C   4   zt |  W d S  ty   td| j Y d S w )NzFafter_in_child hook %s was unregistered without first being registered)r   remove
ValueErrorr   info__name__)r!   r
   r
   r   
unregisterU   
   r'   after_in_parentc                 C   r"   )NzGafter_in_parent hook %s was unregistered without first being registered)r   r#   r$   r   r%   r&   )r)   r
   r
   r   unregister_parent\   r(   r*   before_forkc                 C   r"   )NzGbefore_in_child hook %s was unregistered without first being registered)r   r#   r$   r   r%   r&   )r+   r
   r
   r   unregister_before_forkc   r(   r,   register_at_fork)beforer!   r)   _Tc                       s8   e Zd ZdZdee ddf fddZd	ddZ  ZS )
ResetObjecta`  An object wrapper object that is fork-safe and resets itself after a fork.

    When a Python process forks, a Lock can be in any state, locked or not, by any thread. Since after fork all threads
    are gone, Lock objects needs to be reset. CPython does this with an internal `threading._after_fork` function. We
    use the same mechanism here.

    wrapped_classr   Nc                    s&   t t| |  || _t|  d S r   )superr0   __init___self_wrapped_class_resetable_objectsadd)selfr1   	__class__r
   r   r3   ~   s   zResetObject.__init__c                 C   s   |   | _d S r   )r4   __wrapped__)r7   r
   r
   r   _reset_object   s   zResetObject._reset_objectr   N)	r&   
__module____qualname____doc__typer/   r3   r;   __classcell__r
   r
   r8   r   r0   u   s    r0   r5   c               	   C   s<   t tD ]} z|   W q ty   td|  Y qw d S )Nz2Exception ignored in object reset forksafe hook %r)r   r5   r;   r   r   r   )objr
   r
   r   _reset_objects   s   rC   c                   C   s
   t tjS r   )r0   r   threading_Eventr
   r
   r
   r   Event   s   
rE   r<   )3r?   	functoolsloggingostypingweakrefwraptddtrace.internalr   	getLoggerr&   r   r   ListCallable__annotations__r   r   _softr	   r   r   r   r   boolr   r   r   partialddtrace_before_forkddtrace_after_in_childddtrace_after_in_parentr    register_before_forkregisterregister_after_parentr'   r*   r,   hasattrr-   TypeVarr/   ObjectProxyGenericr0   WeakSetr5   rC   rD   rE   r
   r
   r
   r   <module>   sT    

 	
	

