Chromium Code Reviews| Index: base/trace_event/trace_log.cc |
| diff --git a/base/trace_event/trace_log.cc b/base/trace_event/trace_log.cc |
| index 5692e835bab88905786ba53616796c3ff086914c..def404eea83f79953e5d922a4ad1027f3fdc0e1b 100644 |
| --- a/base/trace_event/trace_log.cc |
| +++ b/base/trace_event/trace_log.cc |
| @@ -333,6 +333,16 @@ void TraceLog::ThreadLocalEventBuffer::FlushWhileLocked() { |
| // find the generation mismatch and delete this buffer soon. |
| } |
| +struct TraceLog::RegisteredThreadSafeObserver { |
| + RegisteredThreadSafeObserver(WeakPtr<ThreadSafeEnabledStateObserver> observer) |
| + : observer_(observer), task_runner_(ThreadTaskRunnerHandle::Get()) {} |
| + |
| + ~RegisteredThreadSafeObserver() {} |
| + |
| + WeakPtr<ThreadSafeEnabledStateObserver> observer_; |
|
Primiano Tucci (use gerrit)
2016/05/09 17:18:29
nit since this is an internal struct, and you are
Xiaocheng
2016/05/10 09:33:33
Done.
|
| + scoped_refptr<TaskRunner> task_runner_; |
|
Primiano Tucci (use gerrit)
2016/05/09 17:18:29
Can you s/TaskRunner/SequencedTaskRunner/. It will
Xiaocheng
2016/05/10 09:33:33
Done.
|
| +}; |
| + |
| TraceLogStatus::TraceLogStatus() : event_capacity(0), event_count(0) {} |
| TraceLogStatus::~TraceLogStatus() {} |
| @@ -632,6 +642,12 @@ void TraceLog::SetEnabled(const TraceConfig& trace_config, Mode mode) { |
| } |
| } |
| + for (auto it = thread_safe_observers_.begin(); |
|
Primiano Tucci (use gerrit)
2016/05/09 17:18:29
I think you can more concisely:
for (const auto& i
Xiaocheng
2016/05/10 09:33:33
Done.
|
| + it != thread_safe_observers_.end(); ++it) |
| + it->second.task_runner_->PostTask( |
| + FROM_HERE, Bind(&ThreadSafeEnabledStateObserver::OnTraceLogEnabled, |
| + it->second.observer_)); |
| + |
| dispatching_to_observer_list_ = true; |
| observer_list = enabled_state_observer_list_; |
| } |
| @@ -716,6 +732,12 @@ void TraceLog::SetDisabledWhileLocked() { |
| // Remove metadata events so they will not get added to a subsequent trace. |
| metadata_events_.clear(); |
| + for (auto it = thread_safe_observers_.begin(); |
| + it != thread_safe_observers_.end(); ++it) |
| + it->second.task_runner_->PostTask( |
| + FROM_HERE, Bind(&ThreadSafeEnabledStateObserver::OnTraceLogDisabled, |
| + it->second.observer_)); |
| + |
| dispatching_to_observer_list_ = true; |
| std::vector<EnabledStateObserver*> observer_list = |
| enabled_state_observer_list_; |
| @@ -1710,6 +1732,33 @@ void ConvertableToTraceFormat::EstimateTraceMemoryOverhead( |
| overhead->Add("ConvertableToTraceFormat(Unknown)", sizeof(*this)); |
| } |
| +int TraceLog::AddThreadSafeEnabledStateObserver( |
| + WeakPtr<ThreadSafeEnabledStateObserver> listener) { |
| + AutoLock lock(lock_); |
| + int id = thread_safe_observers_.empty() |
|
Primiano Tucci (use gerrit)
2016/05/09 17:18:29
Yeah I think we don't need this ID logic. Just use
Xiaocheng
2016/05/10 09:33:33
Done.
|
| + ? 1 |
| + : thread_safe_observers_.rbegin()->first + 1; |
| + thread_safe_observers_.insert( |
| + std::make_pair(id, RegisteredThreadSafeObserver(listener))); |
| + return id; |
| +} |
| + |
| +void TraceLog::RemoveThreadSafeEnabledStateObserver(int listener_id) { |
| + AutoLock lock(lock_); |
| + thread_safe_observers_.erase(listener_id); |
| +} |
| + |
| +bool TraceLog::HasThreadSafeEnabledStateObserver(int listener_id) const { |
| + AutoLock lock(lock_); |
| + return thread_safe_observers_.find(listener_id) != |
| + thread_safe_observers_.end(); |
| +} |
| + |
| +size_t TraceLog::GetThreadSafeObserverCountForTest() const { |
| + AutoLock lock(lock_); |
| + return thread_safe_observers_.size(); |
| +} |
| + |
| } // namespace trace_event |
| } // namespace base |