OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 | 5 |
6 #ifndef BASE_TRACE_EVENT_TRACE_EVENT_IMPL_H_ | 6 #ifndef BASE_TRACE_EVENT_TRACE_EVENT_IMPL_H_ |
7 #define BASE_TRACE_EVENT_TRACE_EVENT_IMPL_H_ | 7 #define BASE_TRACE_EVENT_TRACE_EVENT_IMPL_H_ |
8 | 8 |
9 #include <stack> | 9 #include <stack> |
10 #include <string> | 10 #include <string> |
11 #include <vector> | 11 #include <vector> |
12 | 12 |
13 #include "base/atomicops.h" | 13 #include "base/atomicops.h" |
14 #include "base/base_export.h" | 14 #include "base/base_export.h" |
15 #include "base/callback.h" | 15 #include "base/callback.h" |
16 #include "base/containers/hash_tables.h" | 16 #include "base/containers/hash_tables.h" |
17 #include "base/gtest_prod_util.h" | 17 #include "base/gtest_prod_util.h" |
18 #include "base/memory/ref_counted_memory.h" | 18 #include "base/memory/ref_counted_memory.h" |
19 #include "base/memory/scoped_vector.h" | 19 #include "base/memory/scoped_vector.h" |
20 #include "base/observer_list.h" | 20 #include "base/observer_list.h" |
21 #include "base/single_thread_task_runner.h" | 21 #include "base/single_thread_task_runner.h" |
22 #include "base/strings/string_util.h" | 22 #include "base/strings/string_util.h" |
23 #include "base/synchronization/condition_variable.h" | 23 #include "base/synchronization/condition_variable.h" |
24 #include "base/synchronization/lock.h" | 24 #include "base/synchronization/lock.h" |
25 #include "base/threading/thread.h" | 25 #include "base/threading/thread.h" |
26 #include "base/threading/thread_local.h" | 26 #include "base/threading/thread_local.h" |
27 #include "base/values.h" | |
27 | 28 |
28 // Older style trace macros with explicit id and extra data | 29 // Older style trace macros with explicit id and extra data |
29 // Only these macros result in publishing data to ETW as currently implemented. | 30 // Only these macros result in publishing data to ETW as currently implemented. |
30 // TODO(georgesak): Update/replace these with new ETW macros. | 31 // TODO(georgesak): Update/replace these with new ETW macros. |
31 #define TRACE_EVENT_BEGIN_ETW(name, id, extra) \ | 32 #define TRACE_EVENT_BEGIN_ETW(name, id, extra) \ |
32 base::trace_event::TraceLog::AddTraceEventEtw( \ | 33 base::trace_event::TraceLog::AddTraceEventEtw( \ |
33 TRACE_EVENT_PHASE_BEGIN, \ | 34 TRACE_EVENT_PHASE_BEGIN, \ |
34 name, reinterpret_cast<const void*>(id), extra) | 35 name, reinterpret_cast<const void*>(id), extra) |
35 | 36 |
36 #define TRACE_EVENT_END_ETW(name, id, extra) \ | 37 #define TRACE_EVENT_END_ETW(name, id, extra) \ |
37 base::trace_event::TraceLog::AddTraceEventEtw( \ | 38 base::trace_event::TraceLog::AddTraceEventEtw( \ |
38 TRACE_EVENT_PHASE_END, \ | 39 TRACE_EVENT_PHASE_END, \ |
39 name, reinterpret_cast<const void*>(id), extra) | 40 name, reinterpret_cast<const void*>(id), extra) |
40 | 41 |
41 #define TRACE_EVENT_INSTANT_ETW(name, id, extra) \ | 42 #define TRACE_EVENT_INSTANT_ETW(name, id, extra) \ |
42 base::trace_event::TraceLog::AddTraceEventEtw( \ | 43 base::trace_event::TraceLog::AddTraceEventEtw( \ |
43 TRACE_EVENT_PHASE_INSTANT, \ | 44 TRACE_EVENT_PHASE_INSTANT, \ |
44 name, reinterpret_cast<const void*>(id), extra) | 45 name, reinterpret_cast<const void*>(id), extra) |
45 | 46 |
46 template <typename Type> | 47 template <typename Type> |
47 struct DefaultSingletonTraits; | 48 struct DefaultSingletonTraits; |
48 | 49 |
49 namespace base { | 50 namespace base { |
50 | 51 |
51 class WaitableEvent; | 52 class WaitableEvent; |
52 class MessageLoop; | 53 class MessageLoop; |
53 | 54 |
54 namespace trace_event { | 55 namespace trace_event { |
55 | 56 |
57 class CategoryFilter; | |
58 | |
56 // For any argument of type TRACE_VALUE_TYPE_CONVERTABLE the provided | 59 // For any argument of type TRACE_VALUE_TYPE_CONVERTABLE the provided |
57 // class must implement this interface. | 60 // class must implement this interface. |
58 class BASE_EXPORT ConvertableToTraceFormat | 61 class BASE_EXPORT ConvertableToTraceFormat |
59 : public RefCounted<ConvertableToTraceFormat> { | 62 : public RefCounted<ConvertableToTraceFormat> { |
60 public: | 63 public: |
61 // Append the class info to the provided |out| string. The appended | 64 // Append the class info to the provided |out| string. The appended |
62 // data must be a valid JSON object. Strings must be properly quoted, and | 65 // data must be a valid JSON object. Strings must be properly quoted, and |
63 // escaped. There is no processing applied to the content after it is | 66 // escaped. There is no processing applied to the content after it is |
64 // appended. | 67 // appended. |
65 virtual void AppendAsTraceFormat(std::string* out) const = 0; | 68 virtual void AppendAsTraceFormat(std::string* out) const = 0; |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
268 | 271 |
269 // When all fragments have been added, call Finish to complete the JSON | 272 // When all fragments have been added, call Finish to complete the JSON |
270 // formatted output. | 273 // formatted output. |
271 void Finish(); | 274 void Finish(); |
272 | 275 |
273 private: | 276 private: |
274 OutputCallback output_callback_; | 277 OutputCallback output_callback_; |
275 bool append_comma_; | 278 bool append_comma_; |
276 }; | 279 }; |
277 | 280 |
281 // Options determines how the trace buffer stores data. | |
282 enum TraceRecordMode { | |
283 // Record until the trace buffer is full. | |
284 RECORD_UNTIL_FULL, | |
285 | |
286 // Record until the user ends the trace. The trace buffer is a fixed size | |
287 // and we use it as a ring buffer during recording. | |
288 RECORD_CONTINUOUSLY, | |
289 | |
290 // Echo to console. Events are discarded. | |
291 ECHO_TO_CONSOLE, | |
292 | |
293 // Record until the trace buffer is full, but with a huge buffer size. | |
294 RECORD_AS_MUCH_AS_POSSIBLE | |
295 }; | |
296 | |
297 struct BASE_EXPORT TraceOptions { | |
298 TraceOptions() | |
299 : record_mode(RECORD_UNTIL_FULL), | |
300 enable_sampling(false), | |
301 enable_systrace(false) {} | |
302 | |
303 explicit TraceOptions(TraceRecordMode record_mode) | |
304 : record_mode(record_mode), | |
305 enable_sampling(false), | |
306 enable_systrace(false) {} | |
307 | |
308 // |options_string| is a comma-delimited list of trace options. | |
309 // Possible options are: "record-until-full", "record-continuously", | |
310 // "trace-to-console", "enable-sampling" and "enable-systrace". | |
311 // The first 3 options are trace recoding modes and hence | |
312 // mutually exclusive. If more than one trace recording modes appear in the | |
313 // options_string, the last one takes precedence. If none of the trace | |
314 // recording mode is specified, recording mode is RECORD_UNTIL_FULL. | |
315 // | |
316 // The trace option will first be reset to the default option | |
317 // (record_mode set to RECORD_UNTIL_FULL, enable_sampling and enable_systrace | |
318 // set to false) before options parsed from |options_string| are applied on | |
319 // it. | |
320 // If |options_string| is invalid, the final state of trace_options is | |
321 // undefined. | |
322 // | |
323 // Example: trace_options.SetFromString("record-until-full") | |
324 // Example: trace_options.SetFromString( | |
325 // "record-continuously, enable-sampling") | |
326 // Example: trace_options.SetFromString("record-until-full, trace-to-console") | |
327 // will set ECHO_TO_CONSOLE as the recording mode. | |
328 // | |
329 // Returns true on success. | |
330 bool SetFromString(const std::string& options_string); | |
331 | |
332 std::string ToString() const; | |
333 | |
334 TraceRecordMode record_mode; | |
335 bool enable_sampling; | |
336 bool enable_systrace; | |
337 }; | |
338 | |
339 class BASE_EXPORT TraceConfig { | |
dsinclair
2015/05/21 13:42:08
This file is getting pretty big, lets split these
Zhen Wang
2015/05/22 23:38:04
I move TraceConfig, CategoryFilter and TraceOption
| |
340 public: | |
341 typedef std::vector<std::string> StringList; | |
342 | |
343 TraceConfig(); | |
344 | |
345 // Create TraceConfig object from CategoryFilter and TraceOptions. | |
346 TraceConfig(const CategoryFilter& cf, const TraceOptions& options); | |
347 | |
348 // Create TraceConfig object from category filter and trace options strings. | |
349 TraceConfig(const std::string& category_filter_string, | |
350 const std::string& trace_options_string); | |
351 | |
352 // |config_string| is a dictionary formatted as a JSON string, containing both | |
353 // category filters and trace options. | |
354 explicit TraceConfig(const std::string& config_string); | |
355 | |
356 explicit TraceConfig(const TraceConfig& tc); | |
357 | |
358 ~TraceConfig(); | |
359 | |
360 TraceConfig& operator=(const TraceConfig& rhs); | |
361 | |
362 // Return a list of the synthetic delays specified in this category filter. | |
363 const StringList& GetSyntheticDelayValues() const; | |
364 | |
365 // Convert TraceConfig to the dict representation of the TraceConfig. | |
366 void ToDict(base::DictionaryValue& dict) const; | |
367 | |
368 // Writes the string representation of the TraceConfig. The string is JSON | |
369 // formatted. | |
370 std::string ToString() const; | |
371 | |
372 // Write the string representation of the CategoryFilter part. | |
373 std::string ToCategoryFilterString() const; | |
374 | |
375 // Write the string representation of the TraceOptions part. | |
376 std::string ToTraceOptionsString() const; | |
377 | |
378 // Returns true if at least one category in the list is enabled by this | |
379 // trace config. | |
380 bool IsCategoryGroupEnabled(const char* category_group) const; | |
381 | |
382 // Merges config with the current TraceConfig | |
383 void Merge(const TraceConfig& config); | |
384 | |
385 void Clear(); | |
386 | |
387 private: | |
388 FRIEND_TEST_ALL_PREFIXES(TraceConfigTest, TraceConfigFromValidLegacyStrings); | |
389 FRIEND_TEST_ALL_PREFIXES(TraceConfigTest, | |
390 TraceConfigFromInvalidLegacyStrings); | |
391 FRIEND_TEST_ALL_PREFIXES(TraceConfigTest, ConstructDefaultTraceConfig); | |
392 FRIEND_TEST_ALL_PREFIXES(TraceConfigTest, TraceConfigFromValidString); | |
393 FRIEND_TEST_ALL_PREFIXES(TraceConfigTest, TraceConfigFromInvalidString); | |
394 FRIEND_TEST_ALL_PREFIXES(TraceConfigTest, | |
395 IsEmptyOrContainsLeadingOrTrailingWhitespace); | |
396 friend class CategoryFilter; | |
397 | |
398 void Initialize(const std::string& config_string); | |
399 | |
400 // The default trace config, used when none is provided. | |
401 // Allows all categories through, except if they end in the suffix 'Debug' or | |
402 // 'Test'. | |
dsinclair
2015/05/21 13:42:08
I still think this comment is wrong. It doesn't al
Zhen Wang
2015/05/22 23:38:04
I think the comment is correct. See TraceConfigTes
dsinclair
2015/05/25 13:36:02
If the comment is correct, then the code is wrong
| |
403 void InitializeDefault(); | |
404 | |
405 void SetCategoriesFromList(StringList& categories, | |
406 const base::ListValue& list); | |
407 void SetSyntheticDelaysFromList(StringList& delays, | |
408 const base::ListValue& list); | |
409 void AddCategoryToDict(base::DictionaryValue& dict, | |
410 const char* param, | |
411 const StringList& categories) const; | |
412 | |
413 // Returns true if category is enable according to this trace config. | |
414 bool IsCategoryEnabled(const char* category_name) const; | |
415 | |
416 static bool IsEmptyOrContainsLeadingOrTrailingWhitespace( | |
417 const std::string& str); | |
418 | |
419 bool HasIncludedPatterns() const; | |
420 | |
421 TraceRecordMode record_mode_; | |
422 bool enable_sampling_; | |
423 bool enable_systrace_; | |
424 | |
425 StringList included_categories_; | |
426 StringList disabled_categories_; | |
427 StringList excluded_categories_; | |
428 StringList synthetic_delays_; | |
429 }; | |
430 | |
278 class BASE_EXPORT CategoryFilter { | 431 class BASE_EXPORT CategoryFilter { |
279 public: | 432 public: |
280 typedef std::vector<std::string> StringList; | 433 typedef std::vector<std::string> StringList; |
281 | 434 |
282 // The default category filter, used when none is provided. | 435 // The default category filter, used when none is provided. |
283 // Allows all categories through, except if they end in the suffix 'Debug' or | 436 // Allows all categories through, except if they end in the suffix 'Debug' or |
284 // 'Test'. | 437 // 'Test'. |
285 static const char kDefaultCategoryFilterString[]; | 438 static const char kDefaultCategoryFilterString[]; |
286 | 439 |
287 // |filter_string| is a comma-delimited list of category wildcards. | 440 // |filter_string| is a comma-delimited list of category wildcards. |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
335 // Clears both included/excluded pattern lists. This would be equivalent to | 488 // Clears both included/excluded pattern lists. This would be equivalent to |
336 // creating a CategoryFilter with an empty string, through the constructor. | 489 // creating a CategoryFilter with an empty string, through the constructor. |
337 // i.e: CategoryFilter(). | 490 // i.e: CategoryFilter(). |
338 // | 491 // |
339 // When using an empty filter, all categories are considered included as we | 492 // When using an empty filter, all categories are considered included as we |
340 // are not excluding anything. | 493 // are not excluding anything. |
341 void Clear(); | 494 void Clear(); |
342 | 495 |
343 private: | 496 private: |
344 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, CategoryFilter); | 497 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, CategoryFilter); |
498 friend class TraceConfig; | |
345 | 499 |
346 // Returns true if category is enable according to this filter. | 500 // Returns true if category is enable according to this filter. |
347 bool IsCategoryEnabled(const char* category_name) const; | 501 bool IsCategoryEnabled(const char* category_name) const; |
348 | 502 |
349 static bool IsEmptyOrContainsLeadingOrTrailingWhitespace( | 503 static bool IsEmptyOrContainsLeadingOrTrailingWhitespace( |
350 const std::string& str); | 504 const std::string& str); |
351 | 505 |
352 void Initialize(const std::string& filter_string); | 506 void Initialize(const std::string& filter_string); |
353 void WriteString(const StringList& values, | 507 void WriteString(const StringList& values, |
354 std::string* out, | 508 std::string* out, |
355 bool included) const; | 509 bool included) const; |
356 void WriteString(const StringList& delays, std::string* out) const; | 510 void WriteString(const StringList& delays, std::string* out) const; |
357 bool HasIncludedPatterns() const; | 511 bool HasIncludedPatterns() const; |
358 | 512 |
359 StringList included_; | 513 TraceConfig config_; |
360 StringList disabled_; | |
361 StringList excluded_; | |
362 StringList delays_; | |
363 }; | 514 }; |
364 | 515 |
365 class TraceSamplingThread; | 516 class TraceSamplingThread; |
366 | 517 |
367 // Options determines how the trace buffer stores data. | |
368 enum TraceRecordMode { | |
369 // Record until the trace buffer is full. | |
370 RECORD_UNTIL_FULL, | |
371 | |
372 // Record until the user ends the trace. The trace buffer is a fixed size | |
373 // and we use it as a ring buffer during recording. | |
374 RECORD_CONTINUOUSLY, | |
375 | |
376 // Echo to console. Events are discarded. | |
377 ECHO_TO_CONSOLE, | |
378 | |
379 // Record until the trace buffer is full, but with a huge buffer size. | |
380 RECORD_AS_MUCH_AS_POSSIBLE | |
381 }; | |
382 | |
383 struct BASE_EXPORT TraceOptions { | |
384 TraceOptions() | |
385 : record_mode(RECORD_UNTIL_FULL), | |
386 enable_sampling(false), | |
387 enable_systrace(false) {} | |
388 | |
389 explicit TraceOptions(TraceRecordMode record_mode) | |
390 : record_mode(record_mode), | |
391 enable_sampling(false), | |
392 enable_systrace(false) {} | |
393 | |
394 // |options_string| is a comma-delimited list of trace options. | |
395 // Possible options are: "record-until-full", "record-continuously", | |
396 // "trace-to-console", "enable-sampling" and "enable-systrace". | |
397 // The first 3 options are trace recoding modes and hence | |
398 // mutually exclusive. If more than one trace recording modes appear in the | |
399 // options_string, the last one takes precedence. If none of the trace | |
400 // recording mode is specified, recording mode is RECORD_UNTIL_FULL. | |
401 // | |
402 // The trace option will first be reset to the default option | |
403 // (record_mode set to RECORD_UNTIL_FULL, enable_sampling and enable_systrace | |
404 // set to false) before options parsed from |options_string| are applied on | |
405 // it. | |
406 // If |options_string| is invalid, the final state of trace_options is | |
407 // undefined. | |
408 // | |
409 // Example: trace_options.SetFromString("record-until-full") | |
410 // Example: trace_options.SetFromString( | |
411 // "record-continuously, enable-sampling") | |
412 // Example: trace_options.SetFromString("record-until-full, trace-to-console") | |
413 // will set ECHO_TO_CONSOLE as the recording mode. | |
414 // | |
415 // Returns true on success. | |
416 bool SetFromString(const std::string& options_string); | |
417 | |
418 std::string ToString() const; | |
419 | |
420 TraceRecordMode record_mode; | |
421 bool enable_sampling; | |
422 bool enable_systrace; | |
423 }; | |
424 | |
425 struct BASE_EXPORT TraceLogStatus { | 518 struct BASE_EXPORT TraceLogStatus { |
426 TraceLogStatus(); | 519 TraceLogStatus(); |
427 ~TraceLogStatus(); | 520 ~TraceLogStatus(); |
428 size_t event_capacity; | 521 size_t event_capacity; |
429 size_t event_count; | 522 size_t event_count; |
430 }; | 523 }; |
431 | 524 |
432 class BASE_EXPORT TraceLog { | 525 class BASE_EXPORT TraceLog { |
433 public: | 526 public: |
434 enum Mode { | 527 enum Mode { |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
814 subtle::AtomicWord generation_; | 907 subtle::AtomicWord generation_; |
815 bool use_worker_thread_; | 908 bool use_worker_thread_; |
816 | 909 |
817 DISALLOW_COPY_AND_ASSIGN(TraceLog); | 910 DISALLOW_COPY_AND_ASSIGN(TraceLog); |
818 }; | 911 }; |
819 | 912 |
820 } // namespace trace_event | 913 } // namespace trace_event |
821 } // namespace base | 914 } // namespace base |
822 | 915 |
823 #endif // BASE_TRACE_EVENT_TRACE_EVENT_IMPL_H_ | 916 #endif // BASE_TRACE_EVENT_TRACE_EVENT_IMPL_H_ |
OLD | NEW |