diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn index b00499324d..be70c53b6c 100644 --- a/sdk/BUILD.gn +++ b/sdk/BUILD.gn @@ -1037,6 +1037,7 @@ if (is_ios || is_mac) { "../rtc_base:logging", "../rtc_base:network_constants", "../rtc_base:safe_conversions", + "../rtc_base:stringutils", "../rtc_base:timeutils", "../stats:rtc_stats", "../system_wrappers:field_trial", diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn index 94353f3a36..c649e3cf5e 100644 --- a/sdk/android/BUILD.gn +++ b/sdk/android/BUILD.gn @@ -836,6 +836,7 @@ if (current_os == "linux" || is_android) { ":native_api_jni", ":peerconnection_jni", "../../pc:peerconnection", + "../../rtc_base:stringutils", "../../system_wrappers:metrics", ] } diff --git a/sdk/android/src/jni/android_metrics.cc b/sdk/android/src/jni/android_metrics.cc index e021ef407a..01398cc77f 100644 --- a/sdk/android/src/jni/android_metrics.cc +++ b/sdk/android/src/jni/android_metrics.cc @@ -11,6 +11,7 @@ #include #include +#include "rtc_base/string_utils.h" #include "sdk/android/generated_metrics_jni/Metrics_jni.h" #include "sdk/android/native_api/jni/java_types.h" #include "sdk/android/src/jni/jni_helpers.h" @@ -28,7 +29,9 @@ static void JNI_Metrics_Enable(JNIEnv* jni) { static ScopedJavaLocalRef JNI_Metrics_GetAndReset(JNIEnv* jni) { ScopedJavaLocalRef j_metrics = Java_Metrics_Constructor(jni); - std::map> histograms; + std::map, + rtc::AbslStringViewCmp> + histograms; metrics::GetAndReset(&histograms); for (const auto& kv : histograms) { // Create and add samples to `HistogramInfo`. diff --git a/sdk/objc/api/peerconnection/RTCMetrics.mm b/sdk/objc/api/peerconnection/RTCMetrics.mm index b3ad352084..87eb8c0210 100644 --- a/sdk/objc/api/peerconnection/RTCMetrics.mm +++ b/sdk/objc/api/peerconnection/RTCMetrics.mm @@ -12,12 +12,14 @@ #import "RTCMetricsSampleInfo+Private.h" +#include "rtc_base/string_utils.h" + void RTCEnableMetrics(void) { webrtc::metrics::Enable(); } NSArray *RTCGetAndResetMetrics(void) { - std::map> + std::map, rtc::AbslStringViewCmp> histograms; webrtc::metrics::GetAndReset(&histograms); diff --git a/system_wrappers/BUILD.gn b/system_wrappers/BUILD.gn index 40c208b17d..4e424d969a 100644 --- a/system_wrappers/BUILD.gn +++ b/system_wrappers/BUILD.gn @@ -76,9 +76,7 @@ rtc_library("system_wrappers") { deps += [ "../rtc_base:win32" ] } - deps += [ - "../rtc_base:rtc_numerics", - ] + deps += [ "../rtc_base:rtc_numerics" ] } rtc_library("field_trial") { @@ -107,8 +105,10 @@ rtc_library("metrics") { "../rtc_base:atomicops", "../rtc_base:checks", "../rtc_base:macromagic", + "../rtc_base:stringutils", "../rtc_base/synchronization:mutex", ] + absl_deps = [ "//third_party/abseil-cpp/absl/strings" ] } rtc_library("denormal_disabler") { @@ -144,6 +144,7 @@ if (rtc_include_tests && !build_with_chromium) { ":system_wrappers", "../rtc_base:checks", "../rtc_base:random", + "../rtc_base:stringutils", "../test:rtc_expect_death", "../test:test_main", "../test:test_support", diff --git a/system_wrappers/include/field_trial.h b/system_wrappers/include/field_trial.h index 5256142b70..eb57f2908e 100644 --- a/system_wrappers/include/field_trial.h +++ b/system_wrappers/include/field_trial.h @@ -26,7 +26,7 @@ // WEBRTC_EXCLUDE_FIELD_TRIAL_DEFAULT (if GN is used this can be achieved // by setting the GN arg rtc_exclude_field_trial_default to true). // 2. Provide an implementation of: -// std::string webrtc::field_trial::FindFullName(const std::string& trial). +// std::string webrtc::field_trial::FindFullName(absl::string_view trial). // // They are designed to wire up directly to chrome field trials and to speed up // developers by reducing the need to wire APIs to control whether a feature is @@ -68,13 +68,13 @@ std::string FindFullName(absl::string_view name); // Convenience method, returns true iff FindFullName(name) return a string that // starts with "Enabled". // TODO(tommi): Make sure all implementations support this. -inline bool IsEnabled(const char* name) { +inline bool IsEnabled(absl::string_view name) { return FindFullName(name).find("Enabled") == 0; } // Convenience method, returns true iff FindFullName(name) return a string that // starts with "Disabled". -inline bool IsDisabled(const char* name) { +inline bool IsDisabled(absl::string_view name) { return FindFullName(name).find("Disabled") == 0; } @@ -87,14 +87,15 @@ void InitFieldTrialsFromString(const char* trials_string); const char* GetFieldTrialString(); // Validates the given field trial string. -bool FieldTrialsStringIsValid(const char* trials_string); +bool FieldTrialsStringIsValid(absl::string_view trials_string); // Merges two field trial strings. // // If a key (trial) exists twice with conflicting values (groups), the value // in 'second' takes precedence. // Shall only be called with valid FieldTrial strings. -std::string MergeFieldTrialsStrings(const char* first, const char* second); +std::string MergeFieldTrialsStrings(absl::string_view first, + absl::string_view second); } // namespace field_trial } // namespace webrtc diff --git a/system_wrappers/include/metrics.h b/system_wrappers/include/metrics.h index c29a727df9..7bf7983aa3 100644 --- a/system_wrappers/include/metrics.h +++ b/system_wrappers/include/metrics.h @@ -17,8 +17,10 @@ #include #include +#include "absl/strings/string_view.h" #include "rtc_base/atomic_ops.h" #include "rtc_base/checks.h" +#include "rtc_base/string_utils.h" #if defined(RTC_DISABLE_METRICS) #define RTC_METRICS_ENABLED 0 @@ -76,12 +78,12 @@ void NoOp(const Ts&...) {} // by setting the GN arg rtc_exclude_metrics_default to true). // 2. Provide implementations of: // Histogram* webrtc::metrics::HistogramFactoryGetCounts( -// const std::string& name, int sample, int min, int max, +// absl::string_view name, int sample, int min, int max, // int bucket_count); // Histogram* webrtc::metrics::HistogramFactoryGetEnumeration( -// const std::string& name, int sample, int boundary); +// absl::string_view name, int sample, int boundary); // void webrtc::metrics::HistogramAdd( -// Histogram* histogram_pointer, const std::string& name, int sample); +// Histogram* histogram_pointer, absl::string_view name, int sample); // // Example usage: // @@ -188,7 +190,6 @@ void NoOp(const Ts&...) {} webrtc::metrics::HistogramFactoryGetEnumeration(name, boundary)) // The name of the histogram should not vary. -// TODO(asapersson): Consider changing string to const char*. #define RTC_HISTOGRAM_COMMON_BLOCK(constant_name, sample, \ factory_get_invocation) \ do { \ @@ -371,32 +372,31 @@ class Histogram; // histogram). // Get histogram for counters. -Histogram* HistogramFactoryGetCounts(const std::string& name, +Histogram* HistogramFactoryGetCounts(absl::string_view name, int min, int max, int bucket_count); // Get histogram for counters with linear bucket spacing. -Histogram* HistogramFactoryGetCountsLinear(const std::string& name, +Histogram* HistogramFactoryGetCountsLinear(absl::string_view name, int min, int max, int bucket_count); // Get histogram for enumerators. // `boundary` should be above the max enumerator sample. -Histogram* HistogramFactoryGetEnumeration(const std::string& name, - int boundary); +Histogram* HistogramFactoryGetEnumeration(absl::string_view name, int boundary); // Get sparse histogram for enumerators. // `boundary` should be above the max enumerator sample. -Histogram* SparseHistogramFactoryGetEnumeration(const std::string& name, +Histogram* SparseHistogramFactoryGetEnumeration(absl::string_view name, int boundary); // Function for adding a `sample` to a histogram. void HistogramAdd(Histogram* histogram_pointer, int sample); struct SampleInfo { - SampleInfo(const std::string& name, int min, int max, size_t bucket_count); + SampleInfo(absl::string_view name, int min, int max, size_t bucket_count); ~SampleInfo(); const std::string name; @@ -412,7 +412,8 @@ void Enable(); // Gets histograms and clears all samples. void GetAndReset( - std::map>* histograms); + std::map, rtc::AbslStringViewCmp>* + histograms); // Functions below are mainly for testing. @@ -420,17 +421,17 @@ void GetAndReset( void Reset(); // Returns the number of times the `sample` has been added to the histogram. -int NumEvents(const std::string& name, int sample); +int NumEvents(absl::string_view name, int sample); // Returns the total number of added samples to the histogram. -int NumSamples(const std::string& name); +int NumSamples(absl::string_view name); // Returns the minimum sample value (or -1 if the histogram has no samples). -int MinSample(const std::string& name); +int MinSample(absl::string_view name); // Returns a map with keys the samples with at least one event and values the // number of events for that sample. -std::map Samples(const std::string& name); +std::map Samples(absl::string_view name); } // namespace metrics } // namespace webrtc diff --git a/system_wrappers/source/field_trial.cc b/system_wrappers/source/field_trial.cc index 1eac3ddaa2..db49f635d0 100644 --- a/system_wrappers/source/field_trial.cc +++ b/system_wrappers/source/field_trial.cc @@ -69,7 +69,7 @@ bool FieldTrialsStringIsValidInternal(const absl::string_view trials) { } } // namespace -bool FieldTrialsStringIsValid(const char* trials_string) { +bool FieldTrialsStringIsValid(absl::string_view trials_string) { return FieldTrialsStringIsValidInternal(trials_string); } @@ -88,7 +88,8 @@ void InsertOrReplaceFieldTrialStringsInMap( } } -std::string MergeFieldTrialsStrings(const char* first, const char* second) { +std::string MergeFieldTrialsStrings(absl::string_view first, + absl::string_view second) { std::map fieldtrial_map; InsertOrReplaceFieldTrialStringsInMap(&fieldtrial_map, first); InsertOrReplaceFieldTrialStringsInMap(&fieldtrial_map, second); diff --git a/system_wrappers/source/metrics.cc b/system_wrappers/source/metrics.cc index 8c9cf0c574..0063405752 100644 --- a/system_wrappers/source/metrics.cc +++ b/system_wrappers/source/metrics.cc @@ -11,6 +11,8 @@ #include +#include "absl/strings/string_view.h" +#include "rtc_base/string_utils.h" #include "rtc_base/synchronization/mutex.h" #include "rtc_base/thread_annotations.h" @@ -29,7 +31,7 @@ const int kMaxSampleMapSize = 300; class RtcHistogram { public: - RtcHistogram(const std::string& name, int min, int max, int bucket_count) + RtcHistogram(absl::string_view name, int min, int max, int bucket_count) : min_(min), max_(max), info_(name, min, max, bucket_count) { RTC_DCHECK_GT(bucket_count, 0); } @@ -111,7 +113,7 @@ class RtcHistogramMap { RtcHistogramMap(const RtcHistogramMap&) = delete; RtcHistogramMap& operator=(const RtcHistogramMap&) = delete; - Histogram* GetCountsHistogram(const std::string& name, + Histogram* GetCountsHistogram(absl::string_view name, int min, int max, int bucket_count) { @@ -121,23 +123,24 @@ class RtcHistogramMap { return reinterpret_cast(it->second.get()); RtcHistogram* hist = new RtcHistogram(name, min, max, bucket_count); - map_[name].reset(hist); + map_.emplace(name, hist); return reinterpret_cast(hist); } - Histogram* GetEnumerationHistogram(const std::string& name, int boundary) { + Histogram* GetEnumerationHistogram(absl::string_view name, int boundary) { MutexLock lock(&mutex_); const auto& it = map_.find(name); if (it != map_.end()) return reinterpret_cast(it->second.get()); RtcHistogram* hist = new RtcHistogram(name, 1, boundary, boundary + 1); - map_[name].reset(hist); + map_.emplace(name, hist); return reinterpret_cast(hist); } - void GetAndReset( - std::map>* histograms) { + void GetAndReset(std::map, + rtc::AbslStringViewCmp>* histograms) { MutexLock lock(&mutex_); for (const auto& kv : map_) { std::unique_ptr info = kv.second->GetAndReset(); @@ -153,25 +156,25 @@ class RtcHistogramMap { kv.second->Reset(); } - int NumEvents(const std::string& name, int sample) const { + int NumEvents(absl::string_view name, int sample) const { MutexLock lock(&mutex_); const auto& it = map_.find(name); return (it == map_.end()) ? 0 : it->second->NumEvents(sample); } - int NumSamples(const std::string& name) const { + int NumSamples(absl::string_view name) const { MutexLock lock(&mutex_); const auto& it = map_.find(name); return (it == map_.end()) ? 0 : it->second->NumSamples(); } - int MinSample(const std::string& name) const { + int MinSample(absl::string_view name) const { MutexLock lock(&mutex_); const auto& it = map_.find(name); return (it == map_.end()) ? -1 : it->second->MinSample(); } - std::map Samples(const std::string& name) const { + std::map Samples(absl::string_view name) const { MutexLock lock(&mutex_); const auto& it = map_.find(name); return (it == map_.end()) ? std::map() : it->second->Samples(); @@ -179,8 +182,8 @@ class RtcHistogramMap { private: mutable Mutex mutex_; - std::map> map_ - RTC_GUARDED_BY(mutex_); + std::map, rtc::AbslStringViewCmp> + map_ RTC_GUARDED_BY(mutex_); }; // RtcHistogramMap is allocated upon call to Enable(). @@ -223,7 +226,7 @@ RtcHistogramMap* GetMap() { // Creates (or finds) histogram. // The returned histogram pointer is cached (and used for adding samples in // subsequent calls). -Histogram* HistogramFactoryGetCounts(const std::string& name, +Histogram* HistogramFactoryGetCounts(absl::string_view name, int min, int max, int bucket_count) { @@ -236,7 +239,7 @@ Histogram* HistogramFactoryGetCounts(const std::string& name, // Creates (or finds) histogram. // The returned histogram pointer is cached (and used for adding samples in // subsequent calls). -Histogram* HistogramFactoryGetCountsLinear(const std::string& name, +Histogram* HistogramFactoryGetCountsLinear(absl::string_view name, int min, int max, int bucket_count) { @@ -251,7 +254,7 @@ Histogram* HistogramFactoryGetCountsLinear(const std::string& name, // Creates (or finds) histogram. // The returned histogram pointer is cached (and used for adding samples in // subsequent calls). -Histogram* HistogramFactoryGetEnumeration(const std::string& name, +Histogram* HistogramFactoryGetEnumeration(absl::string_view name, int boundary) { RtcHistogramMap* map = GetMap(); if (!map) @@ -261,7 +264,7 @@ Histogram* HistogramFactoryGetEnumeration(const std::string& name, } // Our default implementation reuses the non-sparse histogram. -Histogram* SparseHistogramFactoryGetEnumeration(const std::string& name, +Histogram* SparseHistogramFactoryGetEnumeration(absl::string_view name, int boundary) { return HistogramFactoryGetEnumeration(name, boundary); } @@ -274,7 +277,7 @@ void HistogramAdd(Histogram* histogram_pointer, int sample) { #endif // WEBRTC_EXCLUDE_METRICS_DEFAULT -SampleInfo::SampleInfo(const std::string& name, +SampleInfo::SampleInfo(absl::string_view name, int min, int max, size_t bucket_count) @@ -292,7 +295,8 @@ void Enable() { } void GetAndReset( - std::map>* histograms) { + std::map, rtc::AbslStringViewCmp>* + histograms) { histograms->clear(); RtcHistogramMap* map = GetMap(); if (map) @@ -305,22 +309,22 @@ void Reset() { map->Reset(); } -int NumEvents(const std::string& name, int sample) { +int NumEvents(absl::string_view name, int sample) { RtcHistogramMap* map = GetMap(); return map ? map->NumEvents(name, sample) : 0; } -int NumSamples(const std::string& name) { +int NumSamples(absl::string_view name) { RtcHistogramMap* map = GetMap(); return map ? map->NumSamples(name) : 0; } -int MinSample(const std::string& name) { +int MinSample(absl::string_view name) { RtcHistogramMap* map = GetMap(); return map ? map->MinSample(name) : -1; } -std::map Samples(const std::string& name) { +std::map Samples(absl::string_view name) { RtcHistogramMap* map = GetMap(); return map ? map->Samples(name) : std::map(); } diff --git a/system_wrappers/source/metrics_default_unittest.cc b/system_wrappers/source/metrics_default_unittest.cc index 5f71c6fd16..a27e9038a3 100644 --- a/system_wrappers/source/metrics_default_unittest.cc +++ b/system_wrappers/source/metrics_default_unittest.cc @@ -14,6 +14,7 @@ #include #include "rtc_base/checks.h" +#include "rtc_base/string_utils.h" #include "system_wrappers/include/metrics.h" #include "test/gtest.h" @@ -24,10 +25,10 @@ namespace { const int kSample = 22; const char kName[] = "Name"; -int NumSamples( - const std::string& name, - const std::map>& - histograms) { +int NumSamples(absl::string_view name, + const std::map, + rtc::AbslStringViewCmp>& histograms) { const auto it = histograms.find(name); if (it == histograms.end()) return 0; @@ -39,10 +40,11 @@ int NumSamples( return num_samples; } -int NumEvents(const std::string& name, +int NumEvents(absl::string_view name, int sample, - const std::map>& - histograms) { + const std::map, + rtc::AbslStringViewCmp>& histograms) { const auto it = histograms.find(name); if (it == histograms.end()) return 0; @@ -118,7 +120,9 @@ TEST_F(MetricsDefaultTest, Underflow) { } TEST_F(MetricsDefaultTest, GetAndReset) { - std::map> histograms; + std::map, + rtc::AbslStringViewCmp> + histograms; metrics::GetAndReset(&histograms); EXPECT_EQ(0u, histograms.size()); RTC_HISTOGRAM_PERCENTAGE("Histogram1", 4); @@ -154,7 +158,9 @@ TEST_F(MetricsDefaultTest, TestMinMaxBucket) { const std::string kName = "MinMaxCounts100"; RTC_HISTOGRAM_COUNTS_100(kName, 4); - std::map> histograms; + std::map, + rtc::AbslStringViewCmp> + histograms; metrics::GetAndReset(&histograms); EXPECT_EQ(1u, histograms.size()); EXPECT_EQ(kName, histograms.begin()->second->name); diff --git a/system_wrappers/source/metrics_unittest.cc b/system_wrappers/source/metrics_unittest.cc index 7532b2ad83..cd3807748c 100644 --- a/system_wrappers/source/metrics_unittest.cc +++ b/system_wrappers/source/metrics_unittest.cc @@ -10,6 +10,7 @@ #include "system_wrappers/include/metrics.h" +#include "absl/strings/string_view.h" #include "test/gmock.h" #include "test/gtest.h" @@ -22,10 +23,10 @@ namespace webrtc { namespace { const int kSample = 22; -void AddSparseSample(const std::string& name, int sample) { +void AddSparseSample(absl::string_view name, int sample) { RTC_HISTOGRAM_COUNTS_SPARSE_100(name, sample); } -void AddSampleWithVaryingName(int index, const std::string& name, int sample) { +void AddSampleWithVaryingName(int index, absl::string_view name, int sample) { RTC_HISTOGRAMS_COUNTS_100(index, name, sample); } } // namespace