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

Unified Diff: base/trace_event/trace_log.cc

Issue 1923193002: Protect TraceLog::enabled_state_observer_list_ with a dedicated lock (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: New policy on EnabledStateObserver's callbacks, and remove TraceEventTestFixture.SelfRemovingObserv… Created 4 years, 8 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 side-by-side diff with in-line comments
Download patch
« base/trace_event/trace_event_unittest.cc ('K') | « base/trace_event/trace_log.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/trace_event/trace_log.cc
diff --git a/base/trace_event/trace_log.cc b/base/trace_event/trace_log.cc
index 1a375d146a9eb20582e7948677029c93c6a1842f..aca5d0ff5e9f2adec6be896057acefc8a3aa3499 100644
--- a/base/trace_event/trace_log.cc
+++ b/base/trace_event/trace_log.cc
@@ -569,78 +569,76 @@ void TraceLog::GetKnownCategoryGroups(
}
void TraceLog::SetEnabled(const TraceConfig& trace_config, Mode mode) {
- std::vector<EnabledStateObserver*> observer_list;
- {
- AutoLock lock(lock_);
-
- // Can't enable tracing when Flush() is in progress.
- DCHECK(!flush_task_runner_);
+ AutoLock lock(lock_);
- InternalTraceOptions new_options =
- GetInternalOptionsFromTraceConfig(trace_config);
+ // Can't enable tracing when Flush() is in progress.
+ DCHECK(!flush_task_runner_);
- InternalTraceOptions old_options = trace_options();
+ InternalTraceOptions new_options =
+ GetInternalOptionsFromTraceConfig(trace_config);
- if (IsEnabled()) {
- if (new_options != old_options) {
- DLOG(ERROR) << "Attempting to re-enable tracing with a different "
- << "set of options.";
- }
+ InternalTraceOptions old_options = trace_options();
- if (mode != mode_) {
- DLOG(ERROR) << "Attempting to re-enable tracing with a different mode.";
- }
-
- trace_config_.Merge(trace_config);
- UpdateCategoryGroupEnabledFlags();
- return;
+ if (IsEnabled()) {
+ if (new_options != old_options) {
+ DLOG(ERROR) << "Attempting to re-enable tracing with a different "
+ << "set of options.";
}
- if (dispatching_to_observer_list_) {
- DLOG(ERROR)
- << "Cannot manipulate TraceLog::Enabled state from an observer.";
- return;
+ if (mode != mode_) {
+ DLOG(ERROR) << "Attempting to re-enable tracing with a different mode.";
}
- mode_ = mode;
+ trace_config_.Merge(trace_config);
+ UpdateCategoryGroupEnabledFlags();
+ return;
+ }
- if (new_options != old_options) {
- subtle::NoBarrier_Store(&trace_options_, new_options);
- UseNextTraceBuffer();
- }
+ if (dispatching_to_observer_list_) {
+ DLOG(ERROR)
+ << "Cannot manipulate TraceLog::Enabled state from an observer.";
+ return;
+ }
- num_traces_recorded_++;
+ mode_ = mode;
- trace_config_ = TraceConfig(trace_config);
- UpdateCategoryGroupEnabledFlags();
- UpdateSyntheticDelaysFromTraceConfig();
-
- if (new_options & kInternalEnableSampling) {
- sampling_thread_.reset(new TraceSamplingThread);
- sampling_thread_->RegisterSampleBucket(
- &g_trace_state[0], "bucket0",
- Bind(&TraceSamplingThread::DefaultSamplingCallback));
- sampling_thread_->RegisterSampleBucket(
- &g_trace_state[1], "bucket1",
- Bind(&TraceSamplingThread::DefaultSamplingCallback));
- sampling_thread_->RegisterSampleBucket(
- &g_trace_state[2], "bucket2",
- Bind(&TraceSamplingThread::DefaultSamplingCallback));
- if (!PlatformThread::Create(0, sampling_thread_.get(),
- &sampling_thread_handle_)) {
- DCHECK(false) << "failed to create thread";
- }
- }
+ if (new_options != old_options) {
+ subtle::NoBarrier_Store(&trace_options_, new_options);
+ UseNextTraceBuffer();
+ }
- dispatching_to_observer_list_ = true;
- observer_list = enabled_state_observer_list_;
+ num_traces_recorded_++;
+
+ trace_config_ = TraceConfig(trace_config);
+ UpdateCategoryGroupEnabledFlags();
+ UpdateSyntheticDelaysFromTraceConfig();
+
+ if (new_options & kInternalEnableSampling) {
+ sampling_thread_.reset(new TraceSamplingThread);
+ sampling_thread_->RegisterSampleBucket(
+ &g_trace_state[0], "bucket0",
+ Bind(&TraceSamplingThread::DefaultSamplingCallback));
+ sampling_thread_->RegisterSampleBucket(
+ &g_trace_state[1], "bucket1",
+ Bind(&TraceSamplingThread::DefaultSamplingCallback));
+ sampling_thread_->RegisterSampleBucket(
+ &g_trace_state[2], "bucket2",
+ Bind(&TraceSamplingThread::DefaultSamplingCallback));
+ if (!PlatformThread::Create(0, sampling_thread_.get(),
+ &sampling_thread_handle_)) {
+ DCHECK(false) << "failed to create thread";
+ }
}
- // Notify observers outside the lock in case they trigger trace events.
- for (size_t i = 0; i < observer_list.size(); ++i)
- observer_list[i]->OnTraceLogEnabled();
{
- AutoLock lock(lock_);
+ AutoLock observer_list_lock(observer_list_lock_);
+ dispatching_to_observer_list_ = true;
+ {
+ // Notify observers outside the lock in case they trigger trace events.
+ AutoUnlock unlock(lock_);
+ for (size_t i = 0; i < enabled_state_observer_list_.size(); ++i)
+ enabled_state_observer_list_[i]->OnTraceLogEnabled();
+ }
dispatching_to_observer_list_ = false;
}
}
@@ -716,18 +714,18 @@ void TraceLog::SetDisabledWhileLocked() {
// Remove metadata events so they will not get added to a subsequent trace.
metadata_events_.clear();
- dispatching_to_observer_list_ = true;
- std::vector<EnabledStateObserver*> observer_list =
- enabled_state_observer_list_;
-
{
- // Dispatch to observers outside the lock in case the observer triggers a
- // trace event.
- AutoUnlock unlock(lock_);
- for (size_t i = 0; i < observer_list.size(); ++i)
- observer_list[i]->OnTraceLogDisabled();
+ AutoLock observer_list_lock(observer_list_lock_);
+ dispatching_to_observer_list_ = true;
+ {
+ // Dispatch to observers outside the lock in case the observer triggers a
+ // trace event.
+ AutoUnlock unlock(lock_);
+ for (size_t i = 0; i < enabled_state_observer_list_.size(); ++i)
+ enabled_state_observer_list_[i]->OnTraceLogDisabled();
+ }
+ dispatching_to_observer_list_ = false;
}
- dispatching_to_observer_list_ = false;
}
int TraceLog::GetNumTracesRecorded() {
@@ -738,12 +736,12 @@ int TraceLog::GetNumTracesRecorded() {
}
void TraceLog::AddEnabledStateObserver(EnabledStateObserver* listener) {
- AutoLock lock(lock_);
+ AutoLock observer_list_lock(observer_list_lock_);
enabled_state_observer_list_.push_back(listener);
}
void TraceLog::RemoveEnabledStateObserver(EnabledStateObserver* listener) {
- AutoLock lock(lock_);
+ AutoLock observer_list_lock(observer_list_lock_);
std::vector<EnabledStateObserver*>::iterator it =
std::find(enabled_state_observer_list_.begin(),
enabled_state_observer_list_.end(), listener);
@@ -752,7 +750,7 @@ void TraceLog::RemoveEnabledStateObserver(EnabledStateObserver* listener) {
}
bool TraceLog::HasEnabledStateObserver(EnabledStateObserver* listener) const {
- AutoLock lock(lock_);
+ AutoLock observer_list_lock(observer_list_lock_);
return ContainsValue(enabled_state_observer_list_, listener);
}
« base/trace_event/trace_event_unittest.cc ('K') | « base/trace_event/trace_log.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698