class Datadog::Utils::OnlyOnce

Helper class to execute something only once such as not repeating warning logs, and instrumenting classes only once.

Thread-safe when used correctly (e.g. be careful of races when lazily initializing instances of this class).

Note: In its current state, this class is not Ractor-safe. In github.com/DataDog/dd-trace-rb/pull/1398#issuecomment-797378810 we have a discussion of alternatives, including an alternative implementation that is Ractor-safe once spent.

Public Class Methods

new() click to toggle source
# File lib/ddtrace/utils/only_once.rb, line 15
def initialize
  @mutex = Mutex.new
  @ran_once = false
end

Public Instance Methods

ran?() click to toggle source
# File lib/ddtrace/utils/only_once.rb, line 30
def ran?
  @mutex.synchronize { @ran_once }
end
run() { || ... } click to toggle source
# File lib/ddtrace/utils/only_once.rb, line 20
def run
  @mutex.synchronize do
    return if @ran_once

    @ran_once = true

    yield
  end
end

Private Instance Methods

reset_ran_once_state_for_tests() click to toggle source
# File lib/ddtrace/utils/only_once.rb, line 36
def reset_ran_once_state_for_tests
  @mutex.synchronize { @ran_once = false }
end