| Index: base/android/record_histogram.cc
|
| diff --git a/base/android/record_histogram.cc b/base/android/record_histogram.cc
|
| index 8194dc1fd351e967508208455ad85b0f3be3c5d0..148b6f2f041963ea981fba4f16c0f530fb8d5530 100644
|
| --- a/base/android/record_histogram.cc
|
| +++ b/base/android/record_histogram.cc
|
| @@ -7,6 +7,7 @@
|
| #include <stdint.h>
|
|
|
| #include <map>
|
| +#include <string>
|
|
|
| #include "base/android/jni_android.h"
|
| #include "base/android/jni_string.h"
|
| @@ -63,26 +64,24 @@ class HistogramCache {
|
|
|
| HistogramBase* BooleanHistogram(JNIEnv* env,
|
| jstring j_histogram_name,
|
| - jint j_histogram_key) {
|
| + jlong j_histogram_key) {
|
| DCHECK(j_histogram_name);
|
| - DCHECK(j_histogram_key);
|
| - HistogramBase* histogram = FindLocked(j_histogram_key);
|
| + HistogramBase* histogram = HistogramFromKey(j_histogram_key);
|
| if (histogram)
|
| return histogram;
|
|
|
| std::string histogram_name = ConvertJavaStringToUTF8(env, j_histogram_name);
|
| histogram = BooleanHistogram::FactoryGet(
|
| histogram_name, HistogramBase::kUmaTargetedHistogramFlag);
|
| - return InsertLocked(j_histogram_key, histogram);
|
| + return histogram;
|
| }
|
|
|
| HistogramBase* EnumeratedHistogram(JNIEnv* env,
|
| jstring j_histogram_name,
|
| - jint j_histogram_key,
|
| + jlong j_histogram_key,
|
| jint j_boundary) {
|
| DCHECK(j_histogram_name);
|
| - DCHECK(j_histogram_key);
|
| - HistogramBase* histogram = FindLocked(j_histogram_key);
|
| + HistogramBase* histogram = HistogramFromKey(j_histogram_key);
|
| int32_t boundary = static_cast<int32_t>(j_boundary);
|
| if (histogram) {
|
| CheckHistogramArgs(env, j_histogram_name, 1, boundary, boundary + 1,
|
| @@ -94,21 +93,20 @@ class HistogramCache {
|
| histogram =
|
| LinearHistogram::FactoryGet(histogram_name, 1, boundary, boundary + 1,
|
| HistogramBase::kUmaTargetedHistogramFlag);
|
| - return InsertLocked(j_histogram_key, histogram);
|
| + return histogram;
|
| }
|
|
|
| HistogramBase* CustomCountHistogram(JNIEnv* env,
|
| jstring j_histogram_name,
|
| - jint j_histogram_key,
|
| + jlong j_histogram_key,
|
| jint j_min,
|
| jint j_max,
|
| jint j_num_buckets) {
|
| DCHECK(j_histogram_name);
|
| - DCHECK(j_histogram_key);
|
| int32_t min = static_cast<int32_t>(j_min);
|
| int32_t max = static_cast<int32_t>(j_max);
|
| int32_t num_buckets = static_cast<int32_t>(j_num_buckets);
|
| - HistogramBase* histogram = FindLocked(j_histogram_key);
|
| + HistogramBase* histogram = HistogramFromKey(j_histogram_key);
|
| if (histogram) {
|
| CheckHistogramArgs(env, j_histogram_name, min, max, num_buckets,
|
| histogram);
|
| @@ -119,21 +117,20 @@ class HistogramCache {
|
| histogram =
|
| Histogram::FactoryGet(histogram_name, min, max, num_buckets,
|
| HistogramBase::kUmaTargetedHistogramFlag);
|
| - return InsertLocked(j_histogram_key, histogram);
|
| + return histogram;
|
| }
|
|
|
| HistogramBase* LinearCountHistogram(JNIEnv* env,
|
| jstring j_histogram_name,
|
| - jint j_histogram_key,
|
| + jlong j_histogram_key,
|
| jint j_min,
|
| jint j_max,
|
| jint j_num_buckets) {
|
| DCHECK(j_histogram_name);
|
| - DCHECK(j_histogram_key);
|
| int32_t min = static_cast<int32_t>(j_min);
|
| int32_t max = static_cast<int32_t>(j_max);
|
| int32_t num_buckets = static_cast<int32_t>(j_num_buckets);
|
| - HistogramBase* histogram = FindLocked(j_histogram_key);
|
| + HistogramBase* histogram = HistogramFromKey(j_histogram_key);
|
| if (histogram) {
|
| CheckHistogramArgs(env, j_histogram_name, min, max, num_buckets,
|
| histogram);
|
| @@ -144,33 +141,31 @@ class HistogramCache {
|
| histogram =
|
| LinearHistogram::FactoryGet(histogram_name, min, max, num_buckets,
|
| HistogramBase::kUmaTargetedHistogramFlag);
|
| - return InsertLocked(j_histogram_key, histogram);
|
| + return histogram;
|
| }
|
|
|
| HistogramBase* SparseHistogram(JNIEnv* env,
|
| jstring j_histogram_name,
|
| - jint j_histogram_key) {
|
| + jlong j_histogram_key) {
|
| DCHECK(j_histogram_name);
|
| - DCHECK(j_histogram_key);
|
| - HistogramBase* histogram = FindLocked(j_histogram_key);
|
| + HistogramBase* histogram = HistogramFromKey(j_histogram_key);
|
| if (histogram)
|
| return histogram;
|
|
|
| std::string histogram_name = ConvertJavaStringToUTF8(env, j_histogram_name);
|
| histogram = SparseHistogram::FactoryGet(
|
| histogram_name, HistogramBase::kUmaTargetedHistogramFlag);
|
| - return InsertLocked(j_histogram_key, histogram);
|
| + return histogram;
|
| }
|
|
|
| HistogramBase* CustomTimesHistogram(JNIEnv* env,
|
| jstring j_histogram_name,
|
| - jint j_histogram_key,
|
| + jlong j_histogram_key,
|
| jint j_min,
|
| jint j_max,
|
| jint j_bucket_count) {
|
| DCHECK(j_histogram_name);
|
| - DCHECK(j_histogram_key);
|
| - HistogramBase* histogram = FindLocked(j_histogram_key);
|
| + HistogramBase* histogram = HistogramFromKey(j_histogram_key);
|
| int32_t min = static_cast<int32_t>(j_min);
|
| int32_t max = static_cast<int32_t>(j_max);
|
| int32_t bucket_count = static_cast<int32_t>(j_bucket_count);
|
| @@ -186,25 +181,17 @@ class HistogramCache {
|
| // TimeDelta arguments.
|
| histogram = Histogram::FactoryGet(histogram_name, min, max, bucket_count,
|
| HistogramBase::kUmaTargetedHistogramFlag);
|
| - return InsertLocked(j_histogram_key, histogram);
|
| + return histogram;
|
| }
|
|
|
| private:
|
| - HistogramBase* FindLocked(jint j_histogram_key) {
|
| - AutoLock locked(lock_);
|
| - auto histogram_it = histograms_.find(j_histogram_key);
|
| - return histogram_it != histograms_.end() ? histogram_it->second : nullptr;
|
| + // Convert a jlong |histogram_key| from Java to a HistogramBase* via a cast.
|
| + // The Java side caches these in a map (see RecordHistogram.java), which is
|
| + // safe to do since C++ Histogram objects are never freed.
|
| + static HistogramBase* HistogramFromKey(jlong j_histogram_key) {
|
| + return reinterpret_cast<HistogramBase*>(j_histogram_key);
|
| }
|
|
|
| - HistogramBase* InsertLocked(jint j_histogram_key, HistogramBase* histogram) {
|
| - AutoLock locked(lock_);
|
| - histograms_.insert(std::make_pair(j_histogram_key, histogram));
|
| - return histogram;
|
| - }
|
| -
|
| - Lock lock_;
|
| - std::map<jint, HistogramBase*> histograms_;
|
| -
|
| DISALLOW_COPY_AND_ASSIGN(HistogramCache);
|
| };
|
|
|
| @@ -212,86 +199,90 @@ LazyInstance<HistogramCache>::Leaky g_histograms;
|
|
|
| } // namespace
|
|
|
| -void RecordBooleanHistogram(JNIEnv* env,
|
| - const JavaParamRef<jclass>& clazz,
|
| - const JavaParamRef<jstring>& j_histogram_name,
|
| - jint j_histogram_key,
|
| - jboolean j_sample) {
|
| +jlong RecordBooleanHistogram(JNIEnv* env,
|
| + const JavaParamRef<jclass>& clazz,
|
| + const JavaParamRef<jstring>& j_histogram_name,
|
| + jlong j_histogram_key,
|
| + jboolean j_sample) {
|
| bool sample = static_cast<bool>(j_sample);
|
| - g_histograms.Get()
|
| - .BooleanHistogram(env, j_histogram_name, j_histogram_key)
|
| - ->AddBoolean(sample);
|
| + HistogramBase* histogram = g_histograms.Get().BooleanHistogram(
|
| + env, j_histogram_name, j_histogram_key);
|
| + histogram->AddBoolean(sample);
|
| + return reinterpret_cast<jlong>(histogram);
|
| }
|
|
|
| -void RecordEnumeratedHistogram(JNIEnv* env,
|
| - const JavaParamRef<jclass>& clazz,
|
| - const JavaParamRef<jstring>& j_histogram_name,
|
| - jint j_histogram_key,
|
| - jint j_sample,
|
| - jint j_boundary) {
|
| +jlong RecordEnumeratedHistogram(JNIEnv* env,
|
| + const JavaParamRef<jclass>& clazz,
|
| + const JavaParamRef<jstring>& j_histogram_name,
|
| + jlong j_histogram_key,
|
| + jint j_sample,
|
| + jint j_boundary) {
|
| int sample = static_cast<int>(j_sample);
|
|
|
| - g_histograms.Get()
|
| - .EnumeratedHistogram(env, j_histogram_name, j_histogram_key, j_boundary)
|
| - ->Add(sample);
|
| + HistogramBase* histogram = g_histograms.Get().EnumeratedHistogram(
|
| + env, j_histogram_name, j_histogram_key, j_boundary);
|
| + histogram->Add(sample);
|
| + return reinterpret_cast<jlong>(histogram);
|
| }
|
|
|
| -void RecordCustomCountHistogram(JNIEnv* env,
|
| - const JavaParamRef<jclass>& clazz,
|
| - const JavaParamRef<jstring>& j_histogram_name,
|
| - jint j_histogram_key,
|
| - jint j_sample,
|
| - jint j_min,
|
| - jint j_max,
|
| - jint j_num_buckets) {
|
| +jlong RecordCustomCountHistogram(JNIEnv* env,
|
| + const JavaParamRef<jclass>& clazz,
|
| + const JavaParamRef<jstring>& j_histogram_name,
|
| + jlong j_histogram_key,
|
| + jint j_sample,
|
| + jint j_min,
|
| + jint j_max,
|
| + jint j_num_buckets) {
|
| int sample = static_cast<int>(j_sample);
|
|
|
| - g_histograms.Get()
|
| - .CustomCountHistogram(env, j_histogram_name, j_histogram_key, j_min,
|
| - j_max, j_num_buckets)
|
| - ->Add(sample);
|
| + HistogramBase* histogram = g_histograms.Get().CustomCountHistogram(
|
| + env, j_histogram_name, j_histogram_key, j_min, j_max, j_num_buckets);
|
| + histogram->Add(sample);
|
| + return reinterpret_cast<jlong>(histogram);
|
| }
|
|
|
| -void RecordLinearCountHistogram(JNIEnv* env,
|
| - const JavaParamRef<jclass>& clazz,
|
| - const JavaParamRef<jstring>& j_histogram_name,
|
| - jint j_histogram_key,
|
| - jint j_sample,
|
| - jint j_min,
|
| - jint j_max,
|
| - jint j_num_buckets) {
|
| +jlong RecordLinearCountHistogram(JNIEnv* env,
|
| + const JavaParamRef<jclass>& clazz,
|
| + const JavaParamRef<jstring>& j_histogram_name,
|
| + jlong j_histogram_key,
|
| + jint j_sample,
|
| + jint j_min,
|
| + jint j_max,
|
| + jint j_num_buckets) {
|
| int sample = static_cast<int>(j_sample);
|
|
|
| - g_histograms.Get()
|
| - .LinearCountHistogram(env, j_histogram_name, j_histogram_key, j_min,
|
| - j_max, j_num_buckets)
|
| - ->Add(sample);
|
| + HistogramBase* histogram = g_histograms.Get().LinearCountHistogram(
|
| + env, j_histogram_name, j_histogram_key, j_min, j_max, j_num_buckets);
|
| + histogram->Add(sample);
|
| + return reinterpret_cast<jlong>(histogram);
|
| }
|
|
|
| -void RecordSparseHistogram(JNIEnv* env,
|
| - const JavaParamRef<jclass>& clazz,
|
| - const JavaParamRef<jstring>& j_histogram_name,
|
| - jint j_histogram_key,
|
| - jint j_sample) {
|
| - int sample = static_cast<int>(j_sample);
|
| - g_histograms.Get()
|
| - .SparseHistogram(env, j_histogram_name, j_histogram_key)
|
| - ->Add(sample);
|
| +jlong RecordSparseHistogram(JNIEnv* env,
|
| + const JavaParamRef<jclass>& clazz,
|
| + const JavaParamRef<jstring>& j_histogram_name,
|
| + jlong j_histogram_key,
|
| + jint j_sample) {
|
| + int sample = static_cast<int>(j_sample);
|
| + HistogramBase* histogram = g_histograms.Get().SparseHistogram(
|
| + env, j_histogram_name, j_histogram_key);
|
| + histogram->Add(sample);
|
| + return reinterpret_cast<jlong>(histogram);
|
| }
|
|
|
| -void RecordCustomTimesHistogramMilliseconds(
|
| +jlong RecordCustomTimesHistogramMilliseconds(
|
| JNIEnv* env,
|
| const JavaParamRef<jclass>& clazz,
|
| const JavaParamRef<jstring>& j_histogram_name,
|
| - jint j_histogram_key,
|
| + jlong j_histogram_key,
|
| jint j_duration,
|
| jint j_min,
|
| jint 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_t>(j_duration)));
|
| + HistogramBase* histogram = g_histograms.Get().CustomTimesHistogram(
|
| + env, j_histogram_name, j_histogram_key, j_min, j_max, j_num_buckets);
|
| + histogram->AddTime(
|
| + TimeDelta::FromMilliseconds(static_cast<int64_t>(j_duration)));
|
| + return reinterpret_cast<jlong>(histogram);
|
| }
|
|
|
| void Initialize(JNIEnv* env, const JavaParamRef<jclass>&) {
|
|
|