Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(130)

Side by Side Diff: base/debug/trace_event_impl.h

Issue 425593002: Refactor trace_event_impl's SetEnabled to use TraceOptions. Propagate this through the whole stack. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Pull enable_systrace to TraceOptions Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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_DEBUG_TRACE_EVENT_IMPL_H_ 6 #ifndef BASE_DEBUG_TRACE_EVENT_IMPL_H_
7 #define BASE_DEBUG_TRACE_EVENT_IMPL_H_ 7 #define BASE_DEBUG_TRACE_EVENT_IMPL_H_
8 8
9 #include <stack> 9 #include <stack>
10 #include <string> 10 #include <string>
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 const char* category) const; 357 const char* category) const;
358 358
359 StringList included_; 359 StringList included_;
360 StringList disabled_; 360 StringList disabled_;
361 StringList excluded_; 361 StringList excluded_;
362 StringList delays_; 362 StringList delays_;
363 }; 363 };
364 364
365 class TraceSamplingThread; 365 class TraceSamplingThread;
366 366
367 struct BASE_EXPORT TraceOptions {
368
369 // Options determines how the trace buffer stores data.
370 enum RecordMode {
nduca 2014/07/29 00:15:00 you could hoist this to be parallel to trace optio
nednguyen 2014/07/29 19:33:20 Done.
371 // Record until the trace buffer is full.
372 RECORD_UNTIL_FULL,
373
374 // Record until the user ends the trace. The trace buffer is a fixed size
375 // and we use it as a ring buffer during recording.
376 RECORD_CONTINUOUSLY,
377
378 // Echo to console. Events are discarded.
379 ECHO_TO_CONSOLE,
380 };
381
382 TraceOptions()
383 : record_mode(RECORD_UNTIL_FULL),
384 enable_sampling(false),
385 enable_systrace(false) {}
386
387 TraceOptions(RecordMode record_mode)
388 : record_mode(record_mode),
389 enable_sampling(false),
390 enable_systrace(false) {}
391
392 TraceOptions& EnableSampling(bool option) {
nduca 2014/07/29 00:15:01 you've exposed the fields so you don't need these
nednguyen 2014/07/29 19:33:20 This allow inlining TraceOptions(...).EnableSampli
393 enable_sampling = option;
394 return *this;
395 }
396
397 TraceOptions& EnableSystrace(bool option) {
398 enable_systrace = option;
399 return *this;
400 }
401
402 explicit TraceOptions(StringPiece options);
nduca 2014/07/29 00:15:00 std::string
nednguyen 2014/07/29 19:33:20 Done.
403
404 std::string ToString() const;
405
406 RecordMode record_mode;
407 bool enable_sampling;
408 bool enable_systrace;
409 };
410
367 class BASE_EXPORT TraceLog { 411 class BASE_EXPORT TraceLog {
368 public: 412 public:
369 enum Mode { 413 enum Mode {
370 DISABLED = 0, 414 DISABLED = 0,
371 RECORDING_MODE, 415 RECORDING_MODE,
372 MONITORING_MODE, 416 MONITORING_MODE,
373 }; 417 };
374 418
375 // Options determines how the trace buffer stores data.
376 enum Options {
377 // Record until the trace buffer is full.
378 RECORD_UNTIL_FULL = 1 << 0,
379
380 // Record until the user ends the trace. The trace buffer is a fixed size
381 // and we use it as a ring buffer during recording.
382 RECORD_CONTINUOUSLY = 1 << 1,
383
384 // Enable the sampling profiler in the recording mode.
385 ENABLE_SAMPLING = 1 << 2,
386
387 // Echo to console. Events are discarded.
388 ECHO_TO_CONSOLE = 1 << 3,
389 };
390
391 // The pointer returned from GetCategoryGroupEnabledInternal() points to a 419 // The pointer returned from GetCategoryGroupEnabledInternal() points to a
392 // value with zero or more of the following bits. Used in this class only. 420 // value with zero or more of the following bits. Used in this class only.
393 // The TRACE_EVENT macros should only use the value as a bool. 421 // The TRACE_EVENT macros should only use the value as a bool.
394 // These values must be in sync with macro values in TraceEvent.h in Blink. 422 // These values must be in sync with macro values in TraceEvent.h in Blink.
395 enum CategoryGroupEnabledFlags { 423 enum CategoryGroupEnabledFlags {
396 // Category group enabled for the recording mode. 424 // Category group enabled for the recording mode.
397 ENABLED_FOR_RECORDING = 1 << 0, 425 ENABLED_FOR_RECORDING = 1 << 0,
398 // Category group enabled for the monitoring mode. 426 // Category group enabled for the monitoring mode.
399 ENABLED_FOR_MONITORING = 1 << 1, 427 ENABLED_FOR_MONITORING = 1 << 1,
400 // Category group enabled by SetEventCallbackEnabled(). 428 // Category group enabled by SetEventCallbackEnabled().
401 ENABLED_FOR_EVENT_CALLBACK = 1 << 2, 429 ENABLED_FOR_EVENT_CALLBACK = 1 << 2,
402 }; 430 };
403 431
404 static TraceLog* GetInstance(); 432 static TraceLog* GetInstance();
405 433
406 // Get set of known category groups. This can change as new code paths are 434 // Get set of known category groups. This can change as new code paths are
407 // reached. The known category groups are inserted into |category_groups|. 435 // reached. The known category groups are inserted into |category_groups|.
408 void GetKnownCategoryGroups(std::vector<std::string>* category_groups); 436 void GetKnownCategoryGroups(std::vector<std::string>* category_groups);
409 437
410 // Retrieves a copy (for thread-safety) of the current CategoryFilter. 438 // Retrieves a copy (for thread-safety) of the current CategoryFilter.
411 CategoryFilter GetCurrentCategoryFilter(); 439 CategoryFilter GetCurrentCategoryFilter();
412 440
413 Options trace_options() const { 441 // Retrieves a copy (for thread-safety) of the current TraceOptions.
414 return static_cast<Options>(subtle::NoBarrier_Load(&trace_options_)); 442 TraceOptions GetCurrentTraceOptions() const;
415 }
416 443
417 // Enables normal tracing (recording trace events in the trace buffer). 444 // Enables normal tracing (recording trace events in the trace buffer).
418 // See CategoryFilter comments for details on how to control what categories 445 // See CategoryFilter comments for details on how to control what categories
419 // will be traced. If tracing has already been enabled, |category_filter| will 446 // will be traced. If tracing has already been enabled, |category_filter| will
420 // be merged into the current category filter. 447 // be merged into the current category filter.
421 void SetEnabled(const CategoryFilter& category_filter, 448 void SetEnabled(const CategoryFilter& category_filter,
422 Mode mode, Options options); 449 Mode mode, TraceOptions options);
423 450
424 // Disables normal tracing for all categories. 451 // Disables normal tracing for all categories.
425 void SetDisabled(); 452 void SetDisabled();
426 453
427 bool IsEnabled() { return mode_ != DISABLED; } 454 bool IsEnabled() { return mode_ != DISABLED; }
428 455
429 // The number of times we have begun recording traces. If tracing is off, 456 // The number of times we have begun recording traces. If tracing is off,
430 // returns -1. If tracing is on, then it returns the number of times we have 457 // returns -1. If tracing is on, then it returns the number of times we have
431 // recorded a trace. By watching for this number to increment, you can 458 // recorded a trace. By watching for this number to increment, you can
432 // passively discover when a new trace has begun. This is then used to 459 // passively discover when a new trace has begun. This is then used to
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
592 void SetTimeOffset(TimeDelta offset); 619 void SetTimeOffset(TimeDelta offset);
593 620
594 size_t GetObserverCountForTest() const; 621 size_t GetObserverCountForTest() const;
595 622
596 // Call this method if the current thread may block the message loop to 623 // Call this method if the current thread may block the message loop to
597 // prevent the thread from using the thread-local buffer because the thread 624 // prevent the thread from using the thread-local buffer because the thread
598 // may not handle the flush request in time causing lost of unflushed events. 625 // may not handle the flush request in time causing lost of unflushed events.
599 void SetCurrentThreadBlocksMessageLoop(); 626 void SetCurrentThreadBlocksMessageLoop();
600 627
601 private: 628 private:
629 typedef unsigned int InternalTraceOptions;
630
602 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, 631 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
603 TraceBufferRingBufferGetReturnChunk); 632 TraceBufferRingBufferGetReturnChunk);
604 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, 633 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
605 TraceBufferRingBufferHalfIteration); 634 TraceBufferRingBufferHalfIteration);
606 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, 635 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
607 TraceBufferRingBufferFullIteration); 636 TraceBufferRingBufferFullIteration);
608 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, 637 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
609 TraceBufferVectorReportFull); 638 TraceBufferVectorReportFull);
639 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
640 ConvertTraceOptionsToInternalOptions);
641
610 642
611 // This allows constructor and destructor to be private and usable only 643 // This allows constructor and destructor to be private and usable only
612 // by the Singleton class. 644 // by the Singleton class.
613 friend struct DefaultSingletonTraits<TraceLog>; 645 friend struct DefaultSingletonTraits<TraceLog>;
614 646
615 // Enable/disable each category group based on the current mode_, 647 // Enable/disable each category group based on the current mode_,
616 // category_filter_, event_callback_ and event_callback_category_filter_. 648 // category_filter_, event_callback_ and event_callback_category_filter_.
617 // Enable the category group in the enabled mode if category_filter_ matches 649 // Enable the category group in the enabled mode if category_filter_ matches
618 // the category group, or event_callback_ is not null and 650 // the category group, or event_callback_ is not null and
619 // event_callback_category_filter_ matches the category group. 651 // event_callback_category_filter_ matches the category group.
620 void UpdateCategoryGroupEnabledFlags(); 652 void UpdateCategoryGroupEnabledFlags();
621 void UpdateCategoryGroupEnabledFlag(size_t category_index); 653 void UpdateCategoryGroupEnabledFlag(size_t category_index);
622 654
623 // Configure synthetic delays based on the values set in the current 655 // Configure synthetic delays based on the values set in the current
624 // category filter. 656 // category filter.
625 void UpdateSyntheticDelaysFromCategoryFilter(); 657 void UpdateSyntheticDelaysFromCategoryFilter();
626 658
659 InternalTraceOptions GetInternalOptionsFromTraceOptions(
660 const TraceOptions& options);
661
627 class ThreadLocalEventBuffer; 662 class ThreadLocalEventBuffer;
628 class OptionalAutoLock; 663 class OptionalAutoLock;
629 664
630 TraceLog(); 665 TraceLog();
631 ~TraceLog(); 666 ~TraceLog();
632 const unsigned char* GetCategoryGroupEnabledInternal(const char* name); 667 const unsigned char* GetCategoryGroupEnabledInternal(const char* name);
633 void AddMetadataEventsWhileLocked(); 668 void AddMetadataEventsWhileLocked();
634 669
670 InternalTraceOptions trace_options() const {
671 return static_cast<InternalTraceOptions>(
672 subtle::NoBarrier_Load(&trace_options_));
673 }
674
635 TraceBuffer* trace_buffer() const { return logged_events_.get(); } 675 TraceBuffer* trace_buffer() const { return logged_events_.get(); }
636 TraceBuffer* CreateTraceBuffer(); 676 TraceBuffer* CreateTraceBuffer();
637 TraceBuffer* CreateTraceBufferVectorOfSize(size_t max_chunks); 677 TraceBuffer* CreateTraceBufferVectorOfSize(size_t max_chunks);
638 678
639 std::string EventToConsoleMessage(unsigned char phase, 679 std::string EventToConsoleMessage(unsigned char phase,
640 const TimeTicks& timestamp, 680 const TimeTicks& timestamp,
641 TraceEvent* trace_event); 681 TraceEvent* trace_event);
642 682
643 TraceEvent* AddEventToThreadSharedChunkWhileLocked(TraceEventHandle* handle, 683 TraceEvent* AddEventToThreadSharedChunkWhileLocked(TraceEventHandle* handle,
644 bool check_buffer_is_full); 684 bool check_buffer_is_full);
(...skipping 19 matching lines...) Expand all
664 } 704 }
665 void UseNextTraceBuffer(); 705 void UseNextTraceBuffer();
666 706
667 TimeTicks OffsetNow() const { 707 TimeTicks OffsetNow() const {
668 return OffsetTimestamp(TimeTicks::NowFromSystemTraceTime()); 708 return OffsetTimestamp(TimeTicks::NowFromSystemTraceTime());
669 } 709 }
670 TimeTicks OffsetTimestamp(const TimeTicks& timestamp) const { 710 TimeTicks OffsetTimestamp(const TimeTicks& timestamp) const {
671 return timestamp - time_offset_; 711 return timestamp - time_offset_;
672 } 712 }
673 713
714 // Internal representation of trace options since we store the currently used
715 // trace option as an AtomicWord.
716 static const InternalTraceOptions NONE;
717 static const InternalTraceOptions RECORD_UNTIL_FULL;
718 static const InternalTraceOptions RECORD_CONTINUOUSLY;
719 static const InternalTraceOptions ENABLE_SAMPLING;
720 static const InternalTraceOptions ECHO_TO_CONSOLE;
721
674 // This lock protects TraceLog member accesses (except for members protected 722 // This lock protects TraceLog member accesses (except for members protected
675 // by thread_info_lock_) from arbitrary threads. 723 // by thread_info_lock_) from arbitrary threads.
676 mutable Lock lock_; 724 mutable Lock lock_;
677 // This lock protects accesses to thread_names_, thread_event_start_times_ 725 // This lock protects accesses to thread_names_, thread_event_start_times_
678 // and thread_colors_. 726 // and thread_colors_.
679 Lock thread_info_lock_; 727 Lock thread_info_lock_;
680 int locked_line_; 728 int locked_line_;
681 Mode mode_; 729 Mode mode_;
682 int num_traces_recorded_; 730 int num_traces_recorded_;
683 scoped_ptr<TraceBuffer> logged_events_; 731 scoped_ptr<TraceBuffer> logged_events_;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 scoped_refptr<MessageLoopProxy> flush_message_loop_proxy_; 785 scoped_refptr<MessageLoopProxy> flush_message_loop_proxy_;
738 subtle::AtomicWord generation_; 786 subtle::AtomicWord generation_;
739 787
740 DISALLOW_COPY_AND_ASSIGN(TraceLog); 788 DISALLOW_COPY_AND_ASSIGN(TraceLog);
741 }; 789 };
742 790
743 } // namespace debug 791 } // namespace debug
744 } // namespace base 792 } // namespace base
745 793
746 #endif // BASE_DEBUG_TRACE_EVENT_IMPL_H_ 794 #endif // BASE_DEBUG_TRACE_EVENT_IMPL_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698