#include "base/cpu_reduction_experiment.h"
#include <atomic>
#include "base/check.h"
#include "base/dcheck_is_on.h"
#include "base/feature_list.h"
#include "base/rand_util.h"
#include "base/synchronization/lock.h"
#include "base/thread_annotations.h"
namespace base {
namespace {
BASE_FEATURE(kReduceCpuUtilization,
"ReduceCpuUtilization",
FEATURE_ENABLED_BY_DEFAULT);
class CpuReductionExperimentSubSampler {
public:
CpuReductionExperimentSubSampler() = default;
bool ShouldLogHistograms() {
AutoLock hold(lock_);
return sub_sampler_.ShouldSample(0.001);
}
private:
Lock lock_;
MetricsSubSampler sub_sampler_ GUARDED_BY(lock_);
};
CpuReductionExperimentSubSampler* g_subsampler = nullptr;
#if DCHECK_IS_ON()
std::atomic_bool g_accessed_subsampler = false;
#endif
}
bool IsRunningCpuReductionExperiment() {
#if DCHECK_IS_ON()
g_accessed_subsampler.store(true, std::memory_order_seq_cst);
#endif
return !!g_subsampler;
}
void InitializeCpuReductionExperiment() {
#if DCHECK_IS_ON()
DCHECK(!g_accessed_subsampler.load(std::memory_order_seq_cst));
#endif
if (FeatureList::IsEnabled(kReduceCpuUtilization)) {
g_subsampler = new CpuReductionExperimentSubSampler();
}
}
bool ShouldLogHistogramForCpuReductionExperiment() {
if (!IsRunningCpuReductionExperiment())
return true;
return g_subsampler->ShouldLogHistograms();
}
}