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..04a405312c51c66d4f216f1e009819fd6c8c16f2 100644 |
| --- a/base/debug/trace_event_impl.cc |
| +++ b/base/debug/trace_event_impl.cc |
| @@ -970,6 +970,49 @@ TraceBucketData::~TraceBucketData() { |
| //////////////////////////////////////////////////////////////////////////////// |
| // |
| +// TraceOptions |
| +// |
| +//////////////////////////////////////////////////////////////////////////////// |
| + |
| +TraceOptions::TraceOptions(StringPiece options) |
| + : record_mode(RECORD_UNTIL_FULL), enable_sampling(false) { |
| + std::vector<std::string> split; |
| + std::vector<std::string>::iterator iter; |
| + |
| + base::SplitString(options.as_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; |
| + } |
| + } |
| +} |
| + |
| +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(); |
| + } |
| + return enable_sampling ? ret + "," + kEnableSampling : ret; |
| +} |
| + |
| +//////////////////////////////////////////////////////////////////////////////// |
| +// |
| // TraceLog |
| // |
| //////////////////////////////////////////////////////////////////////////////// |
| @@ -1175,7 +1218,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(TraceOptions::ECHO_TO_CONSOLE, false)); |
| } |
| #endif |
| @@ -1325,7 +1370,7 @@ void TraceLog::GetKnownCategoryGroups( |
| void TraceLog::SetEnabled(const CategoryFilter& category_filter, |
| Mode mode, |
| - Options options) { |
| + TraceOptions options) { |
| std::vector<EnabledStateObserver*> observer_list; |
| { |
| AutoLock lock(lock_); |
| @@ -1333,10 +1378,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 +1406,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 +1417,7 @@ void TraceLog::SetEnabled(const CategoryFilter& category_filter, |
| UpdateCategoryGroupEnabledFlags(); |
| UpdateSyntheticDelaysFromCategoryFilter(); |
| - if (options & ENABLE_SAMPLING) { |
| + if (new_options & ENABLE_SAMPLING) { |
| sampling_thread_.reset(new TraceSamplingThread); |
| sampling_thread_->RegisterSampleBucket( |
| &g_trace_state[0], |
| @@ -1402,11 +1450,41 @@ void TraceLog::SetEnabled(const CategoryFilter& category_filter, |
| } |
| } |
| +TraceLog::InternalTraceOptions TraceLog::GetInternalOptionsFromTraceOptions( |
|
dsinclair
2014/07/28 18:52:36
The spit between trace options and internal trace
nednguyen
2014/07/28 20:27:22
The InternalTraceOptions is only used by the trace
|
| + const TraceOptions& options) { |
| + InternalTraceOptions ret = options.enable_sampling ? ENABLE_SAMPLING : NONE; |
| + switch (options.record_mode) { |
| + case TraceOptions::RECORD_UNTIL_FULL: |
| + return ret | RECORD_UNTIL_FULL; |
| + case TraceOptions::RECORD_CONTINUOUSLY: |
| + return ret | RECORD_CONTINUOUSLY; |
| + case TraceOptions::ECHO_TO_CONSOLE: |
| + return ret | ECHO_TO_CONSOLE; |
| + } |
| + NOTREACHED(); |
| + return NONE; |
| +} |
| + |
| CategoryFilter TraceLog::GetCurrentCategoryFilter() { |
| AutoLock lock(lock_); |
| return category_filter_; |
| } |
| +TraceOptions TraceLog::GetCurrentTraceOptions() const { |
| + TraceOptions ret; |
| + InternalTraceOptions option = trace_options(); |
| + ret.enable_sampling = (option & ENABLE_SAMPLING) != 0; |
| + if (option & RECORD_UNTIL_FULL) |
| + ret.record_mode = TraceOptions::RECORD_UNTIL_FULL; |
| + else if (option & RECORD_CONTINUOUSLY) |
| + ret.record_mode = TraceOptions::RECORD_CONTINUOUSLY; |
| + else if (option & ECHO_TO_CONSOLE) |
| + ret.record_mode = TraceOptions::ECHO_TO_CONSOLE; |
| + else |
| + NOTREACHED(); |
| + return ret; |
| +} |
| + |
| void TraceLog::SetDisabled() { |
| AutoLock lock(lock_); |
| SetDisabledWhileLocked(); |
| @@ -1496,7 +1574,7 @@ bool TraceLog::BufferIsFull() const { |
| } |
| TraceBuffer* TraceLog::CreateTraceBuffer() { |
| - Options options = trace_options(); |
| + InternalTraceOptions options = trace_options(); |
| if (options & RECORD_CONTINUOUSLY) |
| return new TraceBufferRingBuffer(kTraceEventRingBufferChunks); |
| else if ((options & ENABLE_SAMPLING) && mode_ == MONITORING_MODE) |