Chromium Code Reviews| 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 TraceConfig; | |
| 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 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 335 // Clears both included/excluded pattern lists. This would be equivalent to | 338 // Clears both included/excluded pattern lists. This would be equivalent to |
| 336 // creating a CategoryFilter with an empty string, through the constructor. | 339 // creating a CategoryFilter with an empty string, through the constructor. |
| 337 // i.e: CategoryFilter(). | 340 // i.e: CategoryFilter(). |
| 338 // | 341 // |
| 339 // When using an empty filter, all categories are considered included as we | 342 // When using an empty filter, all categories are considered included as we |
| 340 // are not excluding anything. | 343 // are not excluding anything. |
| 341 void Clear(); | 344 void Clear(); |
| 342 | 345 |
| 343 private: | 346 private: |
| 344 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, CategoryFilter); | 347 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, CategoryFilter); |
| 348 friend class TraceConfig; | |
|
dsinclair
2015/05/08 17:44:50
Can we just merge this straight into TraceConfig w
Zhen Wang
2015/05/13 00:01:11
Many places are using CategoryFilter. Do you mean
| |
| 345 | 349 |
| 346 // Returns true if category is enable according to this filter. | 350 // Returns true if category is enable according to this filter. |
| 347 bool IsCategoryEnabled(const char* category_name) const; | 351 bool IsCategoryEnabled(const char* category_name) const; |
| 348 | 352 |
| 349 static bool IsEmptyOrContainsLeadingOrTrailingWhitespace( | 353 static bool IsEmptyOrContainsLeadingOrTrailingWhitespace( |
| 350 const std::string& str); | 354 const std::string& str); |
| 351 | 355 |
| 352 void Initialize(const std::string& filter_string); | 356 void Initialize(const std::string& filter_string); |
| 353 void WriteString(const StringList& values, | 357 void WriteString(const StringList& values, |
| 354 std::string* out, | 358 std::string* out, |
| 355 bool included) const; | 359 bool included) const; |
| 356 void WriteString(const StringList& delays, std::string* out) const; | 360 void WriteString(const StringList& delays, std::string* out) const; |
| 357 bool HasIncludedPatterns() const; | 361 bool HasIncludedPatterns() const; |
| 358 | 362 |
| 359 StringList included_; | 363 scoped_ptr<TraceConfig> config_; |
|
nednguyen
2015/05/11 17:59:28
Why not just make this a value instead of scoped_p
Zhen Wang
2015/05/13 00:01:11
There will be extra copies in the constructors, ri
nednguyen
2015/05/13 18:16:31
Chatted offline. It doesn't matter much & the comp
Zhen Wang
2015/05/13 20:59:16
Done.
| |
| 360 StringList disabled_; | |
| 361 StringList excluded_; | |
| 362 StringList delays_; | |
| 363 }; | 364 }; |
| 364 | 365 |
| 365 class TraceSamplingThread; | 366 class TraceSamplingThread; |
| 366 | 367 |
| 367 // Options determines how the trace buffer stores data. | 368 // Options determines how the trace buffer stores data. |
| 368 enum TraceRecordMode { | 369 enum TraceRecordMode { |
| 369 // Record until the trace buffer is full. | 370 // Record until the trace buffer is full. |
| 370 RECORD_UNTIL_FULL, | 371 RECORD_UNTIL_FULL, |
| 371 | 372 |
| 372 // Record until the user ends the trace. The trace buffer is a fixed size | 373 // Record until the user ends the trace. The trace buffer is a fixed size |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 415 // Returns true on success. | 416 // Returns true on success. |
| 416 bool SetFromString(const std::string& options_string); | 417 bool SetFromString(const std::string& options_string); |
| 417 | 418 |
| 418 std::string ToString() const; | 419 std::string ToString() const; |
| 419 | 420 |
| 420 TraceRecordMode record_mode; | 421 TraceRecordMode record_mode; |
| 421 bool enable_sampling; | 422 bool enable_sampling; |
| 422 bool enable_systrace; | 423 bool enable_systrace; |
| 423 }; | 424 }; |
| 424 | 425 |
| 426 class BASE_EXPORT TraceConfig { | |
| 427 public: | |
| 428 typedef std::vector<std::string> StringList; | |
|
dsinclair
2015/05/08 17:44:49
Is this worth typedef'ing?
Zhen Wang
2015/05/13 00:01:11
I was following the style used in CategoryFilter,
| |
| 429 | |
| 430 // The default trace config, used when none is provided. | |
| 431 // Allows all categories through, except if they end in the suffix 'Debug' or | |
|
dsinclair
2015/05/08 17:44:49
Is this true? We don't want to allow disable-by-de
Zhen Wang
2015/05/13 00:01:11
This is converted from kDefaultCategoryFilterStrin
| |
| 432 // 'Test'. | |
| 433 static const char kDefaultTraceConfigString[]; | |
|
dsinclair
2015/05/08 17:44:49
Does this need to be in the public header? Can it
Zhen Wang
2015/05/13 00:01:11
This is removed now as we will use InitializeDefau
| |
| 434 | |
| 435 TraceConfig(); | |
| 436 | |
| 437 // Create TraceConfig object from CategoryFilter and TraceOptions. | |
| 438 TraceConfig(const CategoryFilter& cf, const TraceOptions& options); | |
| 439 | |
| 440 // Create TraceConfig object from category filter and trace options strings. | |
| 441 TraceConfig(const std::string& category_filter_string, | |
| 442 const std::string& trace_options_string); | |
| 443 | |
| 444 // |config_string| is a JSON formated string, containing both category filters | |
|
dsinclair
2015/05/08 17:44:49
Can you add a similar comment to the above here:
Zhen Wang
2015/05/13 00:01:11
Done.
| |
| 445 // and trace options. | |
| 446 TraceConfig(const std::string& config_string); | |
|
dsinclair
2015/05/08 17:44:50
nit: explicit
Zhen Wang
2015/05/13 00:01:11
Done.
| |
| 447 | |
| 448 TraceConfig(const TraceConfig& tc); | |
|
dsinclair
2015/05/08 17:44:50
nit: explicit
Zhen Wang
2015/05/13 00:01:10
Done.
| |
| 449 | |
| 450 ~TraceConfig(); | |
| 451 | |
| 452 TraceConfig& operator=(const TraceConfig& rhs); | |
|
dsinclair
2015/05/08 17:44:49
Do we use copy and assign for this?
Zhen Wang
2015/05/13 00:01:11
Not now. But it may be used later when updating th
dsinclair
2015/05/21 13:42:07
In that case, let's add the DISALLOW for now and w
Zhen Wang
2015/05/22 23:38:04
COPY and ASSIGN are needed to implement CategoryFi
dsinclair
2015/05/25 13:36:02
I'm confused, above you said they aren't used? So,
| |
| 453 | |
| 454 // Return a list of the synthetic delays specified in this category filter. | |
| 455 const StringList& GetSyntheticDelayValues() const; | |
| 456 | |
| 457 // Convert TraceConfig to CategoryFilter. | |
| 458 void ToCategoryFilter(CategoryFilter& cf) const; | |
|
dsinclair
2015/05/08 17:44:49
Are these ToXXX methods only for tests? I don't se
Zhen Wang
2015/05/13 00:01:11
Removed now.
| |
| 459 | |
| 460 // Convert TraceConfig to TraceOptions. | |
| 461 void ToTraceOptions(TraceOptions& options) const; | |
| 462 | |
| 463 // Convert TraceConfig to the dict representation of the TraceConfig. | |
| 464 void ToDict(base::DictionaryValue& dict) const; | |
|
nednguyen
2015/05/11 17:59:28
Do we actually need this API?
Zhen Wang
2015/05/13 00:01:11
I think this can be used by slow report.
dsinclair
2015/05/21 13:42:07
Can we determine if it is or isn't? I'd prefer to
Zhen Wang
2015/05/22 23:38:04
Fadi has confirmed that this is not needed in the
| |
| 465 | |
| 466 // Writes the string representation of the TraceConfig. The string is JSON | |
| 467 // formatted. | |
| 468 std::string ToString() const; | |
| 469 | |
| 470 // Write the string representation of the CategoryFilter part. | |
| 471 std::string ToCategoryFilterString() const; | |
| 472 | |
| 473 // Write the string representation of the TraceOptions part. | |
| 474 std::string ToTraceOptionsString() const; | |
| 475 | |
| 476 // Returns true if at least one category in the list is enabled by this | |
|
dsinclair
2015/05/08 17:44:49
How does this interact with disabled categories? I
Zhen Wang
2015/05/13 00:01:11
Yes, it will be considered enabled. This comes fro
| |
| 477 // trace config. | |
| 478 bool IsCategoryGroupEnabled(const char* category_group) const; | |
| 479 | |
| 480 // Merges config with the current TraceConfig | |
| 481 void Merge(const TraceConfig& config); | |
|
dsinclair
2015/05/08 17:44:49
Will this go away when CategoryFilter is removed?
Zhen Wang
2015/05/13 00:01:11
This will live on. It is used by TraceLog. See htt
| |
| 482 | |
| 483 void Clear(); | |
|
dsinclair
2015/05/08 17:44:50
Is this needed? Or just for tests? If for tests, d
Zhen Wang
2015/05/13 00:01:11
Clear() will be used by TraceLog. See https://code
| |
| 484 | |
| 485 private: | |
| 486 FRIEND_TEST_ALL_PREFIXES(TraceConfigTest, TraceConfigFromAndToString); | |
| 487 FRIEND_TEST_ALL_PREFIXES(TraceConfigTest, TraceConfig); | |
| 488 friend class CategoryFilter; | |
| 489 | |
| 490 void Initialize(const std::string& config_string); | |
| 491 void SetCategoriesFromList(StringList& categories, | |
| 492 const base::ListValue& list); | |
| 493 void AddCategoryToDict(base::DictionaryValue& dict, | |
| 494 const char* param, | |
| 495 const StringList& categories) const; | |
| 496 | |
| 497 // Returns true if category is enable according to this trace config. | |
| 498 bool IsCategoryEnabled(const char* category_name) const; | |
| 499 | |
| 500 static bool IsEmptyOrContainsLeadingOrTrailingWhitespace( | |
| 501 const std::string& str); | |
| 502 | |
| 503 bool HasIncludedPatterns() const; | |
| 504 | |
| 505 TraceRecordMode record_mode_; | |
| 506 bool enable_sampling_; | |
| 507 bool enable_systrace_; | |
|
dsinclair
2015/05/08 17:44:50
bool enable_sampling_ : 1;
bool enable_systrace_ :
Zhen Wang
2015/05/13 00:01:11
Those two members will be used in TraceConfig::Ini
dsinclair
2015/05/21 13:42:07
Sure, but we can also easily change the initialize
Zhen Wang
2015/05/22 23:38:04
Done.
| |
| 508 | |
| 509 StringList included_categories_; | |
| 510 StringList disabled_categories_; | |
| 511 StringList excluded_categories_; | |
| 512 StringList synthetic_delays_; | |
| 513 }; | |
|
dsinclair
2015/05/08 17:44:50
Should this have a DISALLOW_COPY_AND_ASSIGN?
Zhen Wang
2015/05/13 00:01:10
Existing CategoryFilter has copy constructor and o
dsinclair
2015/05/21 13:42:07
If it isn't needed let, let's put in the DISALLOW.
Zhen Wang
2015/05/22 23:38:04
COPY and ASSIGN are needed to implement CategoryFi
| |
| 514 | |
| 425 struct BASE_EXPORT TraceLogStatus { | 515 struct BASE_EXPORT TraceLogStatus { |
| 426 TraceLogStatus(); | 516 TraceLogStatus(); |
| 427 ~TraceLogStatus(); | 517 ~TraceLogStatus(); |
| 428 size_t event_capacity; | 518 size_t event_capacity; |
| 429 size_t event_count; | 519 size_t event_count; |
| 430 }; | 520 }; |
| 431 | 521 |
| 432 class BASE_EXPORT TraceLog { | 522 class BASE_EXPORT TraceLog { |
| 433 public: | 523 public: |
| 434 enum Mode { | 524 enum Mode { |
| (...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 814 subtle::AtomicWord generation_; | 904 subtle::AtomicWord generation_; |
| 815 bool use_worker_thread_; | 905 bool use_worker_thread_; |
| 816 | 906 |
| 817 DISALLOW_COPY_AND_ASSIGN(TraceLog); | 907 DISALLOW_COPY_AND_ASSIGN(TraceLog); |
| 818 }; | 908 }; |
| 819 | 909 |
| 820 } // namespace trace_event | 910 } // namespace trace_event |
| 821 } // namespace base | 911 } // namespace base |
| 822 | 912 |
| 823 #endif // BASE_TRACE_EVENT_TRACE_EVENT_IMPL_H_ | 913 #endif // BASE_TRACE_EVENT_TRACE_EVENT_IMPL_H_ |
| OLD | NEW |