U
    4Je                     @   s*   d dl mZ d dlmZ G dd dZdS )    )Lock)Callablec                   @   s6   e Zd ZdZddddZeg df edddZdS )	OncezExecute a function exactly once and block all callers until the function returns

    Same as golang's `sync.Once <https://pkg.go.dev/sync#Once>`_
    N)returnc                 C   s   t  | _d| _d S )NF)r   _lock_done)self r	   B/tmp/pip-unpacked-wheel-7_167w8m/mysql/opentelemetry/util/_once.py__init__   s    zOnce.__init__)funcr   c              	   C   s@   | j r
dS | j& | j s2|  d| _ W 5 Q R  dS W 5 Q R X dS )zExecute ``func`` if it hasn't been executed or return.

        Will block until ``func`` has been called by one thread.

        Returns:
            Whether or not ``func`` was executed in this call
        FT)r   r   )r   r   r	   r	   r
   do_once   s    
zOnce.do_once)__name__
__module____qualname____doc__r   r   boolr   r	   r	   r	   r
   r      s   r   N)	threadingr   typingr   r   r	   r	   r	   r
   <module>   s   