blob: 1ea607aa621018271a1db6647ff9dacdecd55292 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.base.metrics;
/** Holds the {@link CachingUmaRecorder} used by {@link RecordHistogram}. */
public class UmaRecorderHolder {
private UmaRecorderHolder() {}
/** The instance held by this class. */
private static CachingUmaRecorder sRecorder = new CachingUmaRecorder();
/** Set up native UMA Recorder */
private static boolean sSetUpNativeUmaRecorder = true;
/** Whether onLibraryLoaded() was called. */
private static boolean sNativeInitialized;
/** Returns the held {@link UmaRecorder}. */
public static UmaRecorder get() {
return sRecorder;
}
/**
* Set a new {@link UmaRecorder} delegate for the {@link CachingUmaRecorder}.
* Returns after the cache has been flushed to the new delegate.
* <p>
* It should be used in processes that don't or haven't loaded native yet. This should never
* be called after calling {@link #onLibraryLoaded()}.
*
* @param recorder the new UmaRecorder that metrics will be forwarded to.
*/
public static void setNonNativeDelegate(UmaRecorder recorder) {
UmaRecorder previous = sRecorder.setDelegate(recorder);
assert !(previous instanceof NativeUmaRecorder)
: "A NativeUmaRecorder has already been set";
}
/**
* Whether a native UMA Recorder should be set up.
* @param setUpNativeUmaRecorder indicates whether a native UMA recorder should be set up.
* Defaults to true if unset.
*/
public static void setUpNativeUmaRecorder(boolean setUpNativeUmaRecorder) {
sSetUpNativeUmaRecorder = setUpNativeUmaRecorder;
}
/**
* Starts forwarding metrics to the native code. Returns after the cache has been flushed.
*/
public static void onLibraryLoaded() {
if (!sSetUpNativeUmaRecorder) return;
assert !sNativeInitialized;
sNativeInitialized = true;
sRecorder.setDelegate(new NativeUmaRecorder());
}
/**
* Reset globals for tests.
*/
public static void resetForTesting() {
// Prevent hitting cache size limits from tests running without ever switching to the native
// recorder. Also guards against tests that use setNonNativeDelegate() to inject a mock from
// forgetting to reset it.
if (!sNativeInitialized) {
sRecorder = new CachingUmaRecorder();
}
}
}