| Index: base/android/record_histogram.cc
|
| diff --git a/base/android/record_histogram.cc b/base/android/record_histogram.cc
|
| index 9549adc274a4fd53e519f1c4c8c1bfa4a09408eb..0df0487ce8eaef337f6f2df2b62a5b4fad005e1a 100644
|
| --- a/base/android/record_histogram.cc
|
| +++ b/base/android/record_histogram.cc
|
| @@ -12,6 +12,7 @@
|
| #include "base/metrics/histogram.h"
|
| #include "base/metrics/statistics_recorder.h"
|
| #include "base/synchronization/lock.h"
|
| +#include "base/time/time.h"
|
| #include "jni/RecordHistogram_jni.h"
|
|
|
| namespace base {
|
| @@ -46,20 +47,45 @@ class HistogramCache {
|
| DCHECK(j_histogram_name);
|
| DCHECK(j_histogram_key);
|
| HistogramBase* histogram = FindLocked(j_histogram_key);
|
| - if (histogram)
|
| + int boundary = static_cast<int>(j_boundary);
|
| + if (histogram) {
|
| + DCHECK(histogram->HasConstructionArguments(1, boundary, boundary + 1));
|
| return histogram;
|
| + }
|
|
|
| std::string histogram_name = ConvertJavaStringToUTF8(env, j_histogram_name);
|
| - // Note: This caching bypasses the boundary validation that occurs between
|
| - // repeated lookups by the same name. It is up to the caller to ensure that
|
| - // the provided boundary remains consistent.
|
| - int boundary = static_cast<int>(j_boundary);
|
| histogram =
|
| LinearHistogram::FactoryGet(histogram_name, 1, boundary, boundary + 1,
|
| HistogramBase::kUmaTargetedHistogramFlag);
|
| return InsertLocked(j_histogram_key, histogram);
|
| }
|
|
|
| + HistogramBase* CustomTimesHistogram(JNIEnv* env,
|
| + jstring j_histogram_name,
|
| + jint j_histogram_key,
|
| + jlong j_min,
|
| + jlong j_max,
|
| + jint j_bucket_count) {
|
| + DCHECK(j_histogram_name);
|
| + DCHECK(j_histogram_key);
|
| + HistogramBase* histogram = FindLocked(j_histogram_key);
|
| + int64 min = static_cast<int64>(j_min);
|
| + int64 max = static_cast<int64>(j_max);
|
| + int bucket_count = static_cast<int>(j_bucket_count);
|
| + if (histogram) {
|
| + DCHECK(histogram->HasConstructionArguments(min, max, bucket_count));
|
| + return histogram;
|
| + }
|
| +
|
| + std::string histogram_name = ConvertJavaStringToUTF8(env, j_histogram_name);
|
| + // This intentionally uses FactoryGet and not FactoryTimeGet. FactoryTimeGet
|
| + // is just a convenience for constructing the underlying Histogram with
|
| + // TimeDelta arguments.
|
| + histogram = Histogram::FactoryGet(histogram_name, min, max, bucket_count,
|
| + HistogramBase::kUmaTargetedHistogramFlag);
|
| + return InsertLocked(j_histogram_key, histogram);
|
| + }
|
| +
|
| private:
|
| HistogramBase* FindLocked(jint j_histogram_key) {
|
| base::AutoLock locked(lock_);
|
| @@ -107,6 +133,20 @@ void RecordEnumeratedHistogram(JNIEnv* env,
|
| ->Add(sample);
|
| }
|
|
|
| +void RecordCustomTimesHistogramMilliseconds(JNIEnv* env,
|
| + jclass clazz,
|
| + jstring j_histogram_name,
|
| + jint j_histogram_key,
|
| + jlong j_duration,
|
| + jlong j_min,
|
| + jlong j_max,
|
| + jint j_num_buckets) {
|
| + g_histograms.Get()
|
| + .CustomTimesHistogram(env, j_histogram_name, j_histogram_key, j_min,
|
| + j_max, j_num_buckets)
|
| + ->AddTime(TimeDelta::FromMilliseconds(static_cast<int64>(j_duration)));
|
| +}
|
| +
|
| void Initialize(JNIEnv* env, jclass) {
|
| StatisticsRecorder::Initialize();
|
| }
|
|
|