Chromium Code Reviews| Index: base/debug/trace_event_impl.cc |
| diff --git a/base/debug/trace_event_impl.cc b/base/debug/trace_event_impl.cc |
| index 93ec6fe29974f891c499c7c6a03645bc645198df..eb2944ee18cc69f8d724789a9a05b38c28320fa2 100644 |
| --- a/base/debug/trace_event_impl.cc |
| +++ b/base/debug/trace_event_impl.cc |
| @@ -58,6 +58,13 @@ namespace { |
| // trace. |
| const int kOverheadReportThresholdInMicroseconds = 50; |
| +// String options that can be used to initialize TraceOptions. |
| +const char kRecordUntilFull[] = "record-until-full"; |
| +const char kRecordContinuously[] = "record-continuously"; |
| +const char kTraceToConsole[] = "trace-to-console"; |
| +const char kEnableSampling[] = "enable-sampling"; |
| +const char kEnableSystrace[] = "enable-systrace"; |
| + |
| // Controls the number of trace events we will buffer in-memory |
| // before throwing them away. |
| const size_t kTraceBufferChunkSize = TraceBufferChunk::kTraceBufferChunkSize; |
| @@ -970,6 +977,57 @@ TraceBucketData::~TraceBucketData() { |
| //////////////////////////////////////////////////////////////////////////////// |
| // |
| +// TraceOptions |
| +// |
| +//////////////////////////////////////////////////////////////////////////////// |
| + |
| +TraceOptions::TraceOptions(const std::string& options_string) |
| + : record_mode(RECORD_UNTIL_FULL), |
| + enable_sampling(false), |
| + enable_systrace(false) { |
| + std::vector<std::string> split; |
| + std::vector<std::string>::iterator iter; |
| + |
| + base::SplitString(options_string, ',', &split); |
| + for (iter = split.begin(); iter != split.end(); ++iter) { |
| + if (*iter == kRecordUntilFull) { |
| + record_mode = RECORD_UNTIL_FULL; |
| + } else if (*iter == kRecordContinuously) { |
| + record_mode = RECORD_CONTINUOUSLY; |
| + } else if (*iter == kTraceToConsole) { |
| + record_mode = ECHO_TO_CONSOLE; |
| + } else if (*iter == kEnableSampling) { |
| + enable_sampling = true; |
| + } else if (*iter == kEnableSystrace) { |
| + enable_systrace = true; |
| + } |
| + } |
| +} |
| + |
| +std::string TraceOptions::ToString() const { |
| + std::string ret; |
| + switch (record_mode) { |
| + case RECORD_UNTIL_FULL: |
| + ret = kRecordUntilFull; |
| + break; |
| + case RECORD_CONTINUOUSLY: |
| + ret = kRecordContinuously; |
| + break; |
| + case ECHO_TO_CONSOLE: |
| + ret = kTraceToConsole; |
| + break; |
| + default: |
| + NOTREACHED(); |
| + } |
| + if (enable_sampling) |
| + ret = ret + "," + kEnableSampling; |
| + if (enable_systrace) |
| + ret = ret + "," + kEnableSystrace; |
| + return ret; |
| +} |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// |
| // TraceLog |
| // |
| //////////////////////////////////////////////////////////////////////////////// |
| @@ -1137,7 +1195,7 @@ TraceLog::TraceLog() |
| process_id_hash_(0), |
| process_id_(0), |
| watch_category_(0), |
| - trace_options_(RECORD_UNTIL_FULL), |
| + trace_options_(kInternalRecordUntilFull), |
|
dsinclair
2014/07/30 14:25:24
RECORD_UNTIL_FULL is the default value, shouldn't
nednguyen
2014/07/30 16:51:12
It's the default value of TraceOptions, not the in
|
| sampling_thread_handle_(0), |
| category_filter_(CategoryFilter::kDefaultCategoryFilterString), |
| event_callback_category_filter_( |
| @@ -1175,7 +1233,9 @@ TraceLog::TraceLog() |
| LOG(ERROR) << "Start " << switches::kTraceToConsole |
| << " with CategoryFilter '" << filter << "'."; |
| - SetEnabled(CategoryFilter(filter), RECORDING_MODE, ECHO_TO_CONSOLE); |
| + SetEnabled(CategoryFilter(filter), |
| + RECORDING_MODE, |
| + TraceOptions(ECHO_TO_CONSOLE)); |
| } |
| #endif |
| @@ -1325,7 +1385,7 @@ void TraceLog::GetKnownCategoryGroups( |
| void TraceLog::SetEnabled(const CategoryFilter& category_filter, |
| Mode mode, |
| - Options options) { |
| + const TraceOptions& options) { |
| std::vector<EnabledStateObserver*> observer_list; |
| { |
| AutoLock lock(lock_); |
| @@ -1333,10 +1393,13 @@ void TraceLog::SetEnabled(const CategoryFilter& category_filter, |
| // Can't enable tracing when Flush() is in progress. |
| DCHECK(!flush_message_loop_proxy_.get()); |
| - Options old_options = trace_options(); |
| + InternalTraceOptions new_options = |
| + GetInternalOptionsFromTraceOptions(options); |
| + |
| + InternalTraceOptions old_options = trace_options(); |
| if (IsEnabled()) { |
| - if (options != old_options) { |
| + if (new_options != old_options) { |
| DLOG(ERROR) << "Attempting to re-enable tracing with a different " |
| << "set of options."; |
| } |
| @@ -1358,8 +1421,8 @@ void TraceLog::SetEnabled(const CategoryFilter& category_filter, |
| mode_ = mode; |
| - if (options != old_options) { |
| - subtle::NoBarrier_Store(&trace_options_, options); |
| + if (new_options != old_options) { |
| + subtle::NoBarrier_Store(&trace_options_, new_options); |
| UseNextTraceBuffer(); |
| } |
| @@ -1369,7 +1432,7 @@ void TraceLog::SetEnabled(const CategoryFilter& category_filter, |
| UpdateCategoryGroupEnabledFlags(); |
| UpdateSyntheticDelaysFromCategoryFilter(); |
| - if (options & ENABLE_SAMPLING) { |
| + if (new_options & kInternalEnableSampling) { |
| sampling_thread_.reset(new TraceSamplingThread); |
| sampling_thread_->RegisterSampleBucket( |
| &g_trace_state[0], |
| @@ -1402,11 +1465,42 @@ void TraceLog::SetEnabled(const CategoryFilter& category_filter, |
| } |
| } |
| +TraceLog::InternalTraceOptions TraceLog::GetInternalOptionsFromTraceOptions( |
| + const TraceOptions& options) { |
| + InternalTraceOptions ret = |
| + options.enable_sampling ? kInternalEnableSampling : kInternalNone; |
|
dsinclair
2014/07/30 14:25:24
What about systrace?
nednguyen
2014/07/30 16:51:12
Systrace is not handled here.
|
| + switch (options.record_mode) { |
| + case RECORD_UNTIL_FULL: |
| + return ret | kInternalRecordUntilFull; |
| + case RECORD_CONTINUOUSLY: |
| + return ret | kInternalRecordContinuously; |
| + case ECHO_TO_CONSOLE: |
| + return ret | kInternalEchoToConsole; |
| + } |
| + NOTREACHED(); |
| + return kInternalNone; |
| +} |
| + |
| CategoryFilter TraceLog::GetCurrentCategoryFilter() { |
| AutoLock lock(lock_); |
| return category_filter_; |
| } |
| +TraceOptions TraceLog::GetCurrentTraceOptions() const { |
| + TraceOptions ret; |
| + InternalTraceOptions option = trace_options(); |
| + ret.enable_sampling = (option & kInternalEnableSampling) != 0; |
|
dsinclair
2014/07/30 14:25:24
What about systrace?
nednguyen
2014/07/30 16:51:12
ditto
|
| + if (option & kInternalRecordUntilFull) |
| + ret.record_mode = RECORD_UNTIL_FULL; |
| + else if (option & kInternalRecordContinuously) |
| + ret.record_mode = RECORD_CONTINUOUSLY; |
| + else if (option & kInternalEchoToConsole) |
| + ret.record_mode = ECHO_TO_CONSOLE; |
| + else |
| + NOTREACHED(); |
| + return ret; |
| +} |
| + |
| void TraceLog::SetDisabled() { |
| AutoLock lock(lock_); |
| SetDisabledWhileLocked(); |
| @@ -1496,12 +1590,12 @@ bool TraceLog::BufferIsFull() const { |
| } |
| TraceBuffer* TraceLog::CreateTraceBuffer() { |
| - Options options = trace_options(); |
| - if (options & RECORD_CONTINUOUSLY) |
| + InternalTraceOptions options = trace_options(); |
| + if (options & kInternalRecordContinuously) |
| return new TraceBufferRingBuffer(kTraceEventRingBufferChunks); |
| - else if ((options & ENABLE_SAMPLING) && mode_ == MONITORING_MODE) |
| + else if ((options & kInternalEnableSampling) && mode_ == MONITORING_MODE) |
| return new TraceBufferRingBuffer(kMonitorTraceEventBufferChunks); |
| - else if (options & ECHO_TO_CONSOLE) |
| + else if (options & kInternalEchoToConsole) |
| return new TraceBufferRingBuffer(kEchoToConsoleTraceEventBufferChunks); |
| return CreateTraceBufferVectorOfSize(kTraceEventVectorBufferChunks); |
| } |
| @@ -1874,7 +1968,7 @@ TraceEventHandle TraceLog::AddTraceEventWithThreadIdAndTimestamp( |
| #endif |
| } |
| - if (trace_options() & ECHO_TO_CONSOLE) { |
| + if (trace_options() & kInternalEchoToConsole) { |
| console_message = EventToConsoleMessage( |
| phase == TRACE_EVENT_PHASE_COMPLETE ? TRACE_EVENT_PHASE_BEGIN : phase, |
| timestamp, trace_event); |
| @@ -2017,7 +2111,7 @@ void TraceLog::UpdateTraceEventDuration( |
| #endif |
| } |
| - if (trace_options() & ECHO_TO_CONSOLE) { |
| + if (trace_options() & kInternalEchoToConsole) { |
| console_message = EventToConsoleMessage(TRACE_EVENT_PHASE_END, |
| now, trace_event); |
| } |