o
    i                     @   s   d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ eeZdZee ZG d	d
 d
ejZG dd dZG dd dZdS )    asdictN)Sequence)UUID)get_mp_context)
get_loggerPayloadi   c                   @   s   e Zd Zdd ZdS )UUIDEncoderc                 C   s   t |tr|jS tj| |S )N)
isinstancer   hexjsonJSONEncoderdefault)selfo r   ]/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/internal/remoteconfig/_connectors.pyr      s   
zUUIDEncoder.defaultN)__name__
__module____qualname__r   r   r   r   r   r
      s    r
   c                   @   s   e Zd ZdZdd ZdS )_DummySharedArrayzDummy shared array to be used when shared memory is not available.
    This class is used to avoid breaking the code when shared memory is not available.
    c                 C   s
   d| _ d S )N    )valuer   r   r   r   __init__#   s   
z_DummySharedArray.__init__N)r   r   r   __doc__r   r   r   r   r   r      s    r   c                   @   sl   e Zd ZdZdd Zedee fddZde	fdd	Z
d
ee ddfddZed
ee defddZdS )PublisherSubscriberConnectora_   "PublisherSubscriberConnector is the bridge between Publisher and Subscriber class that uses an array of chars
    to share information between processes. `multiprocessing.Array``, as far as we know, was the most efficient way to
    share information. We compare this approach with: Multiprocess Manager, Multiprocess Value, Multiprocess Queues
    c                 C   sX   zt  jdtdd| _W n ty   td t | _Y nw d| _d| _	t
 | _d S )NcF)lockzcUnable to create shared memory. Features relying on remote configuration will not work as expected.r   )r   ArraySHARED_MEMORY_SIZEdataFileNotFoundErrorlogwarningr   checksumshared_data_counterosgetpidread_pidr   r   r   r   r   -   s   z%PublisherSubscriberConnector.__init__payload_sequencec                 C   s2   d}| D ]}|t |jN }|jd u r|dK }q|S )Nr      )hashmetadatacontent)r,   resultpayloadr   r   r   _hash_config;   s   
z)PublisherSubscriberConnector._hash_configreturnc                 C   sx   | j jjddd}|rt|nd }|d ur:|d }t  }| jkr)|| _d| _|| jkr:|| _dd |d D S g S )	Nzutf-8ignore)errorsr(   r   c                 S   s   g | ]	}t d i |qS )r   r   ).0r   r   r   r   
<listcomp>N   s    z5PublisherSubscriberConnector.read.<locals>.<listcomp>payload_list)	r#   r   decoder   loadsr)   r*   r+   r(   )r   
config_rawconfigr(   current_pidr   r   r   readD   s   
z!PublisherSubscriberConnector.readr9   Nc                 C   sn   |  |}|| jkr5| |}t|}|td kr td|t || j_t	dt
 t
 | || _d S d S )Ni  z*Datadog Remote Config shared data is %s/%sz&[%s][P: %s] write message of length %s)r3   r'   	serializelenr"   r%   r&   r#   r   debugr)   r*   getppid)r   r9   last_checksumr#   data_lenr   r   r   writeQ   s   



z"PublisherSubscriberConnector.writec                 C   s(   t jdd | D t dtdd S )Nc                 S   s   g | ]}t |qS r   r   )r7   pr   r   r   r8   _   s    z:PublisherSubscriberConnector.serialize.<locals>.<listcomp>)r9   r(   F)clsensure_ascii)r   dumpstimemonotonic_nsr
   encode)r9   r   r   r   r@   \   s   z&PublisherSubscriberConnector.serialize)r   r   r   r   r   staticmethodr   r	   r3   SharedDataTyper?   rF   bytesr@   r   r   r   r   r   '   s    r   )dataclassesr   r   r)   rK   typingr   uuidr   ddtrace.internal.compatr   ddtrace.internal.loggerr   ddtrace.internal.remoteconfigr	   r   r%   r"   listrO   r   r
   r   r   r   r   r   r   <module>   s    	