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

Side by Side Diff: base/trace_event/trace_log.cc

Issue 1956323002: Introduce TraceLog::AsyncEnabledStateObserver (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 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
« base/trace_event/trace_log.h ('K') | « base/trace_event/trace_log.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 #include "base/trace_event/trace_log.h" 5 #include "base/trace_event/trace_log.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <memory> 9 #include <memory>
10 #include <utility> 10 #include <utility>
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 326
327 trace_log_->lock_.AssertAcquired(); 327 trace_log_->lock_.AssertAcquired();
328 if (trace_log_->CheckGeneration(generation_)) { 328 if (trace_log_->CheckGeneration(generation_)) {
329 // Return the chunk to the buffer only if the generation matches. 329 // Return the chunk to the buffer only if the generation matches.
330 trace_log_->logged_events_->ReturnChunk(chunk_index_, std::move(chunk_)); 330 trace_log_->logged_events_->ReturnChunk(chunk_index_, std::move(chunk_));
331 } 331 }
332 // Otherwise this method may be called from the destructor, or TraceLog will 332 // Otherwise this method may be called from the destructor, or TraceLog will
333 // find the generation mismatch and delete this buffer soon. 333 // find the generation mismatch and delete this buffer soon.
334 } 334 }
335 335
336 struct TraceLog::RegisteredThreadSafeObserver {
337 RegisteredThreadSafeObserver(WeakPtr<ThreadSafeEnabledStateObserver> observer)
338 : observer_(observer), task_runner_(ThreadTaskRunnerHandle::Get()) {}
339
340 ~RegisteredThreadSafeObserver() {}
341
342 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.
343 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.
344 };
345
336 TraceLogStatus::TraceLogStatus() : event_capacity(0), event_count(0) {} 346 TraceLogStatus::TraceLogStatus() : event_capacity(0), event_count(0) {}
337 347
338 TraceLogStatus::~TraceLogStatus() {} 348 TraceLogStatus::~TraceLogStatus() {}
339 349
340 // static 350 // static
341 TraceLog* TraceLog::GetInstance() { 351 TraceLog* TraceLog::GetInstance() {
342 return Singleton<TraceLog, LeakySingletonTraits<TraceLog>>::get(); 352 return Singleton<TraceLog, LeakySingletonTraits<TraceLog>>::get();
343 } 353 }
344 354
345 TraceLog::TraceLog() 355 TraceLog::TraceLog()
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
625 Bind(&TraceSamplingThread::DefaultSamplingCallback)); 635 Bind(&TraceSamplingThread::DefaultSamplingCallback));
626 sampling_thread_->RegisterSampleBucket( 636 sampling_thread_->RegisterSampleBucket(
627 &g_trace_state[2], "bucket2", 637 &g_trace_state[2], "bucket2",
628 Bind(&TraceSamplingThread::DefaultSamplingCallback)); 638 Bind(&TraceSamplingThread::DefaultSamplingCallback));
629 if (!PlatformThread::Create(0, sampling_thread_.get(), 639 if (!PlatformThread::Create(0, sampling_thread_.get(),
630 &sampling_thread_handle_)) { 640 &sampling_thread_handle_)) {
631 DCHECK(false) << "failed to create thread"; 641 DCHECK(false) << "failed to create thread";
632 } 642 }
633 } 643 }
634 644
645 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.
646 it != thread_safe_observers_.end(); ++it)
647 it->second.task_runner_->PostTask(
648 FROM_HERE, Bind(&ThreadSafeEnabledStateObserver::OnTraceLogEnabled,
649 it->second.observer_));
650
635 dispatching_to_observer_list_ = true; 651 dispatching_to_observer_list_ = true;
636 observer_list = enabled_state_observer_list_; 652 observer_list = enabled_state_observer_list_;
637 } 653 }
638 // Notify observers outside the lock in case they trigger trace events. 654 // Notify observers outside the lock in case they trigger trace events.
639 for (size_t i = 0; i < observer_list.size(); ++i) 655 for (size_t i = 0; i < observer_list.size(); ++i)
640 observer_list[i]->OnTraceLogEnabled(); 656 observer_list[i]->OnTraceLogEnabled();
641 657
642 { 658 {
643 AutoLock lock(lock_); 659 AutoLock lock(lock_);
644 dispatching_to_observer_list_ = false; 660 dispatching_to_observer_list_ = false;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
709 725
710 trace_config_.Clear(); 726 trace_config_.Clear();
711 subtle::NoBarrier_Store(&watch_category_, 0); 727 subtle::NoBarrier_Store(&watch_category_, 0);
712 watch_event_name_ = ""; 728 watch_event_name_ = "";
713 UpdateCategoryGroupEnabledFlags(); 729 UpdateCategoryGroupEnabledFlags();
714 AddMetadataEventsWhileLocked(); 730 AddMetadataEventsWhileLocked();
715 731
716 // Remove metadata events so they will not get added to a subsequent trace. 732 // Remove metadata events so they will not get added to a subsequent trace.
717 metadata_events_.clear(); 733 metadata_events_.clear();
718 734
735 for (auto it = thread_safe_observers_.begin();
736 it != thread_safe_observers_.end(); ++it)
737 it->second.task_runner_->PostTask(
738 FROM_HERE, Bind(&ThreadSafeEnabledStateObserver::OnTraceLogDisabled,
739 it->second.observer_));
740
719 dispatching_to_observer_list_ = true; 741 dispatching_to_observer_list_ = true;
720 std::vector<EnabledStateObserver*> observer_list = 742 std::vector<EnabledStateObserver*> observer_list =
721 enabled_state_observer_list_; 743 enabled_state_observer_list_;
722 744
723 { 745 {
724 // Dispatch to observers outside the lock in case the observer triggers a 746 // Dispatch to observers outside the lock in case the observer triggers a
725 // trace event. 747 // trace event.
726 AutoUnlock unlock(lock_); 748 AutoUnlock unlock(lock_);
727 for (size_t i = 0; i < observer_list.size(); ++i) 749 for (size_t i = 0; i < observer_list.size(); ++i)
728 observer_list[i]->OnTraceLogDisabled(); 750 observer_list[i]->OnTraceLogDisabled();
(...skipping 974 matching lines...) Expand 10 before | Expand all | Expand 10 after
1703 } 1725 }
1704 } 1726 }
1705 } 1727 }
1706 #endif // defined(OS_WIN) 1728 #endif // defined(OS_WIN)
1707 1729
1708 void ConvertableToTraceFormat::EstimateTraceMemoryOverhead( 1730 void ConvertableToTraceFormat::EstimateTraceMemoryOverhead(
1709 TraceEventMemoryOverhead* overhead) { 1731 TraceEventMemoryOverhead* overhead) {
1710 overhead->Add("ConvertableToTraceFormat(Unknown)", sizeof(*this)); 1732 overhead->Add("ConvertableToTraceFormat(Unknown)", sizeof(*this));
1711 } 1733 }
1712 1734
1735 int TraceLog::AddThreadSafeEnabledStateObserver(
1736 WeakPtr<ThreadSafeEnabledStateObserver> listener) {
1737 AutoLock lock(lock_);
1738 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.
1739 ? 1
1740 : thread_safe_observers_.rbegin()->first + 1;
1741 thread_safe_observers_.insert(
1742 std::make_pair(id, RegisteredThreadSafeObserver(listener)));
1743 return id;
1744 }
1745
1746 void TraceLog::RemoveThreadSafeEnabledStateObserver(int listener_id) {
1747 AutoLock lock(lock_);
1748 thread_safe_observers_.erase(listener_id);
1749 }
1750
1751 bool TraceLog::HasThreadSafeEnabledStateObserver(int listener_id) const {
1752 AutoLock lock(lock_);
1753 return thread_safe_observers_.find(listener_id) !=
1754 thread_safe_observers_.end();
1755 }
1756
1757 size_t TraceLog::GetThreadSafeObserverCountForTest() const {
1758 AutoLock lock(lock_);
1759 return thread_safe_observers_.size();
1760 }
1761
1713 } // namespace trace_event 1762 } // namespace trace_event
1714 } // namespace base 1763 } // namespace base
1715 1764
1716 namespace trace_event_internal { 1765 namespace trace_event_internal {
1717 1766
1718 ScopedTraceBinaryEfficient::ScopedTraceBinaryEfficient( 1767 ScopedTraceBinaryEfficient::ScopedTraceBinaryEfficient(
1719 const char* category_group, 1768 const char* category_group,
1720 const char* name) { 1769 const char* name) {
1721 // The single atom works because for now the category_group can only be "gpu". 1770 // The single atom works because for now the category_group can only be "gpu".
1722 DCHECK_EQ(strcmp(category_group, "gpu"), 0); 1771 DCHECK_EQ(strcmp(category_group, "gpu"), 0);
(...skipping 21 matching lines...) Expand all
1744 } 1793 }
1745 1794
1746 ScopedTraceBinaryEfficient::~ScopedTraceBinaryEfficient() { 1795 ScopedTraceBinaryEfficient::~ScopedTraceBinaryEfficient() {
1747 if (*category_group_enabled_) { 1796 if (*category_group_enabled_) {
1748 TRACE_EVENT_API_UPDATE_TRACE_EVENT_DURATION(category_group_enabled_, name_, 1797 TRACE_EVENT_API_UPDATE_TRACE_EVENT_DURATION(category_group_enabled_, name_,
1749 event_handle_); 1798 event_handle_);
1750 } 1799 }
1751 } 1800 }
1752 1801
1753 } // namespace trace_event_internal 1802 } // namespace trace_event_internal
OLDNEW
« base/trace_event/trace_log.h ('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