blob: b938fbedd9280d696aa58eae90f709b3d51e0d4b [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();
}
}
}