Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef BASE_TRACE_EVENT_TRACE_CONFIG_H_ | |
| 6 #define BASE_TRACE_EVENT_TRACE_CONFIG_H_ | |
| 7 | |
| 8 #include <string> | |
| 9 #include <vector> | |
| 10 | |
| 11 #include "base/gtest_prod_util.h" | |
| 12 #include "base/values.h" | |
| 13 | |
| 14 namespace base { | |
| 15 namespace trace_event { | |
| 16 | |
| 17 class CategoryFilter; | |
| 18 | |
| 19 // Options determines how the trace buffer stores data. | |
| 20 enum TraceRecordMode { | |
| 21 // Record until the trace buffer is full. | |
| 22 RECORD_UNTIL_FULL, | |
| 23 | |
| 24 // Record until the user ends the trace. The trace buffer is a fixed size | |
| 25 // and we use it as a ring buffer during recording. | |
| 26 RECORD_CONTINUOUSLY, | |
| 27 | |
| 28 // Echo to console. Events are discarded. | |
| 29 ECHO_TO_CONSOLE, | |
| 30 | |
| 31 // Record until the trace buffer is full, but with a huge buffer size. | |
| 32 RECORD_AS_MUCH_AS_POSSIBLE | |
| 33 }; | |
| 34 | |
| 35 struct BASE_EXPORT TraceOptions { | |
|
dsinclair
2015/05/25 13:36:02
Why a struct and not a class?
| |
| 36 TraceOptions() | |
| 37 : record_mode(RECORD_UNTIL_FULL), | |
| 38 enable_sampling(false), | |
| 39 enable_systrace(false), | |
| 40 enable_argument_filter(false) {} | |
| 41 | |
| 42 explicit TraceOptions(TraceRecordMode record_mode) | |
| 43 : record_mode(record_mode), | |
| 44 enable_sampling(false), | |
| 45 enable_systrace(false), | |
| 46 enable_argument_filter(false) {} | |
| 47 | |
| 48 // |options_string| is a comma-delimited list of trace options. | |
| 49 // Possible options are: "record-until-full", "record-continuously", | |
| 50 // "trace-to-console", "enable-sampling" and "enable-systrace". | |
| 51 // The first 3 options are trace recoding modes and hence | |
| 52 // mutually exclusive. If more than one trace recording modes appear in the | |
| 53 // options_string, the last one takes precedence. If none of the trace | |
| 54 // recording mode is specified, recording mode is RECORD_UNTIL_FULL. | |
| 55 // | |
| 56 // The trace option will first be reset to the default option | |
| 57 // (record_mode set to RECORD_UNTIL_FULL, enable_sampling and enable_systrace | |
| 58 // set to false) before options parsed from |options_string| are applied on | |
| 59 // it. | |
| 60 // If |options_string| is invalid, the final state of trace_options is | |
| 61 // undefined. | |
| 62 // | |
| 63 // Example: trace_options.SetFromString("record-until-full") | |
| 64 // Example: trace_options.SetFromString( | |
| 65 // "record-continuously, enable-sampling") | |
| 66 // Example: trace_options.SetFromString("record-until-full, trace-to-console") | |
| 67 // will set ECHO_TO_CONSOLE as the recording mode. | |
| 68 // | |
| 69 // Returns true on success. | |
| 70 bool SetFromString(const std::string& options_string); | |
| 71 | |
| 72 std::string ToString() const; | |
| 73 | |
| 74 TraceRecordMode record_mode; | |
| 75 bool enable_sampling; | |
|
dsinclair
2015/05/25 13:36:02
Can you bit pack these please.
| |
| 76 bool enable_systrace; | |
| 77 bool enable_argument_filter; | |
| 78 }; | |
| 79 | |
| 80 class BASE_EXPORT TraceConfig { | |
| 81 public: | |
| 82 typedef std::vector<std::string> StringList; | |
| 83 | |
| 84 TraceConfig(); | |
| 85 | |
| 86 // Create TraceConfig object from CategoryFilter and TraceOptions. | |
| 87 TraceConfig(const CategoryFilter& cf, const TraceOptions& options); | |
| 88 | |
| 89 // Create TraceConfig object from category filter and trace options strings. | |
| 90 TraceConfig(const std::string& category_filter_string, | |
| 91 const std::string& trace_options_string); | |
| 92 | |
| 93 // |config_string| is a dictionary formatted as a JSON string, containing both | |
| 94 // category filters and trace options. | |
| 95 explicit TraceConfig(const std::string& config_string); | |
| 96 | |
| 97 explicit TraceConfig(const TraceConfig& tc); | |
| 98 | |
| 99 ~TraceConfig(); | |
| 100 | |
| 101 TraceConfig& operator=(const TraceConfig& rhs); | |
| 102 | |
| 103 // Return a list of the synthetic delays specified in this category filter. | |
| 104 const StringList& GetSyntheticDelayValues() const; | |
| 105 | |
| 106 // Writes the string representation of the TraceConfig. The string is JSON | |
| 107 // formatted. | |
| 108 std::string ToString() const; | |
| 109 | |
| 110 // Write the string representation of the CategoryFilter part. | |
| 111 std::string ToCategoryFilterString() const; | |
| 112 | |
| 113 // Write the string representation of the TraceOptions part. | |
| 114 std::string ToTraceOptionsString() const; | |
| 115 | |
| 116 // Returns true if at least one category in the list is enabled by this | |
| 117 // trace config. | |
| 118 bool IsCategoryGroupEnabled(const char* category_group) const; | |
| 119 | |
| 120 // Merges config with the current TraceConfig | |
| 121 void Merge(const TraceConfig& config); | |
| 122 | |
| 123 void Clear(); | |
| 124 | |
| 125 private: | |
| 126 FRIEND_TEST_ALL_PREFIXES(TraceConfigTest, TraceConfigFromValidLegacyStrings); | |
| 127 FRIEND_TEST_ALL_PREFIXES(TraceConfigTest, | |
| 128 TraceConfigFromInvalidLegacyStrings); | |
| 129 FRIEND_TEST_ALL_PREFIXES(TraceConfigTest, ConstructDefaultTraceConfig); | |
| 130 FRIEND_TEST_ALL_PREFIXES(TraceConfigTest, TraceConfigFromValidString); | |
| 131 FRIEND_TEST_ALL_PREFIXES(TraceConfigTest, TraceConfigFromInvalidString); | |
| 132 FRIEND_TEST_ALL_PREFIXES(TraceConfigTest, | |
| 133 IsEmptyOrContainsLeadingOrTrailingWhitespace); | |
| 134 friend class CategoryFilter; | |
| 135 | |
| 136 void Initialize(const std::string& config_string); | |
| 137 | |
| 138 // The default trace config, used when none is provided. | |
| 139 // Allows all categories through, except if they end in the suffix 'Debug' or | |
| 140 // 'Test'. | |
| 141 void InitializeDefault(); | |
| 142 | |
| 143 void SetCategoriesFromList(StringList& categories, | |
| 144 const base::ListValue& list); | |
| 145 void SetSyntheticDelaysFromList(StringList& delays, | |
| 146 const base::ListValue& list); | |
| 147 void AddCategoryToDict(base::DictionaryValue& dict, | |
| 148 const char* param, | |
| 149 const StringList& categories) const; | |
| 150 | |
| 151 // Returns true if category is enable according to this trace config. | |
| 152 bool IsCategoryEnabled(const char* category_name) const; | |
| 153 | |
| 154 static bool IsEmptyOrContainsLeadingOrTrailingWhitespace( | |
| 155 const std::string& str); | |
| 156 | |
| 157 bool HasIncludedPatterns() const; | |
| 158 | |
| 159 // Convert TraceConfig to the dict representation of the TraceConfig. | |
| 160 void ToDict(base::DictionaryValue& dict) const; | |
| 161 | |
| 162 TraceRecordMode record_mode_; | |
| 163 bool enable_sampling_ : 1; | |
| 164 bool enable_systrace_ : 1; | |
| 165 | |
| 166 StringList included_categories_; | |
| 167 StringList disabled_categories_; | |
| 168 StringList excluded_categories_; | |
| 169 StringList synthetic_delays_; | |
| 170 }; | |
| 171 | |
| 172 class BASE_EXPORT CategoryFilter { | |
| 173 public: | |
| 174 typedef std::vector<std::string> StringList; | |
| 175 | |
| 176 // The default category filter, used when none is provided. | |
| 177 // Allows all categories through, except if they end in the suffix 'Debug' or | |
| 178 // 'Test'. | |
| 179 static const char kDefaultCategoryFilterString[]; | |
| 180 | |
| 181 // |filter_string| is a comma-delimited list of category wildcards. | |
| 182 // A category can have an optional '-' prefix to make it an excluded category. | |
| 183 // All the same rules apply above, so for example, having both included and | |
| 184 // excluded categories in the same list would not be supported. | |
| 185 // | |
| 186 // Example: CategoryFilter"test_MyTest*"); | |
| 187 // Example: CategoryFilter("test_MyTest*,test_OtherStuff"); | |
| 188 // Example: CategoryFilter("-excluded_category1,-excluded_category2"); | |
| 189 // Example: CategoryFilter("-*,webkit"); would disable everything but webkit. | |
| 190 // Example: CategoryFilter("-webkit"); would enable everything but webkit. | |
| 191 // | |
| 192 // Category filters can also be used to configure synthetic delays. | |
| 193 // | |
| 194 // Example: CategoryFilter("DELAY(gpu.PresentingFrame;16)"); would make swap | |
| 195 // buffers always take at least 16 ms. | |
| 196 // Example: CategoryFilter("DELAY(gpu.PresentingFrame;16;oneshot)"); would | |
| 197 // make swap buffers take at least 16 ms the first time it is | |
| 198 // called. | |
| 199 // Example: CategoryFilter("DELAY(gpu.PresentingFrame;16;alternating)"); | |
| 200 // would make swap buffers take at least 16 ms every other time it | |
| 201 // is called. | |
| 202 explicit CategoryFilter(const std::string& filter_string); | |
| 203 | |
| 204 CategoryFilter(); | |
| 205 | |
| 206 CategoryFilter(const CategoryFilter& cf); | |
| 207 | |
| 208 ~CategoryFilter(); | |
| 209 | |
| 210 CategoryFilter& operator=(const CategoryFilter& rhs); | |
| 211 | |
| 212 // Writes the string representation of the CategoryFilter. This is a comma | |
| 213 // separated string, similar in nature to the one used to determine | |
| 214 // enabled/disabled category patterns, except here there is an arbitrary | |
| 215 // order, included categories go first, then excluded categories. Excluded | |
| 216 // categories are distinguished from included categories by the prefix '-'. | |
| 217 std::string ToString() const; | |
| 218 | |
| 219 // Returns true if at least one category in the list is enabled by this | |
| 220 // category filter. | |
| 221 bool IsCategoryGroupEnabled(const char* category_group) const; | |
| 222 | |
| 223 // Return a list of the synthetic delays specified in this category filter. | |
| 224 const StringList& GetSyntheticDelayValues() const; | |
| 225 | |
| 226 // Merges nested_filter with the current CategoryFilter | |
| 227 void Merge(const CategoryFilter& nested_filter); | |
| 228 | |
| 229 // Clears both included/excluded pattern lists. This would be equivalent to | |
| 230 // creating a CategoryFilter with an empty string, through the constructor. | |
| 231 // i.e: CategoryFilter(). | |
| 232 // | |
| 233 // When using an empty filter, all categories are considered included as we | |
| 234 // are not excluding anything. | |
| 235 void Clear(); | |
| 236 | |
| 237 private: | |
| 238 FRIEND_TEST_ALL_PREFIXES(CategoryFilterTest, CategoryFilter); | |
| 239 friend class TraceConfig; | |
| 240 | |
| 241 // Returns true if category is enable according to this filter. | |
| 242 bool IsCategoryEnabled(const char* category_name) const; | |
| 243 | |
| 244 static bool IsEmptyOrContainsLeadingOrTrailingWhitespace( | |
| 245 const std::string& str); | |
| 246 | |
| 247 void Initialize(const std::string& filter_string); | |
| 248 void WriteString(const StringList& values, | |
| 249 std::string* out, | |
| 250 bool included) const; | |
| 251 void WriteString(const StringList& delays, std::string* out) const; | |
| 252 bool HasIncludedPatterns() const; | |
| 253 | |
| 254 TraceConfig config_; | |
| 255 }; | |
| 256 | |
| 257 } // namespace trace_event | |
| 258 } // namespace base | |
| 259 | |
| 260 #endif // BASE_TRACE_EVENT_TRACE_CONFIG_H_ | |
| OLD | NEW |