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

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: Follow the same lock usage as ESO 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
« no previous file with comments | « 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::RegisteredAsyncObserver {
337 RegisteredAsyncObserver(WeakPtr<AsyncEnabledStateObserver> observer)
338 : observer(observer), task_runner(ThreadTaskRunnerHandle::Get()) {}
339 ~RegisteredAsyncObserver() {}
340
341 WeakPtr<AsyncEnabledStateObserver> observer;
342 scoped_refptr<SequencedTaskRunner> task_runner;
343 };
344
336 TraceLogStatus::TraceLogStatus() : event_capacity(0), event_count(0) {} 345 TraceLogStatus::TraceLogStatus() : event_capacity(0), event_count(0) {}
337 346
338 TraceLogStatus::~TraceLogStatus() {} 347 TraceLogStatus::~TraceLogStatus() {}
339 348
340 // static 349 // static
341 TraceLog* TraceLog::GetInstance() { 350 TraceLog* TraceLog::GetInstance() {
342 return Singleton<TraceLog, LeakySingletonTraits<TraceLog>>::get(); 351 return Singleton<TraceLog, LeakySingletonTraits<TraceLog>>::get();
343 } 352 }
344 353
345 TraceLog::TraceLog() 354 TraceLog::TraceLog()
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 void TraceLog::GetKnownCategoryGroups( 572 void TraceLog::GetKnownCategoryGroups(
564 std::vector<std::string>* category_groups) { 573 std::vector<std::string>* category_groups) {
565 AutoLock lock(lock_); 574 AutoLock lock(lock_);
566 size_t category_index = base::subtle::NoBarrier_Load(&g_category_index); 575 size_t category_index = base::subtle::NoBarrier_Load(&g_category_index);
567 for (size_t i = g_num_builtin_categories; i < category_index; i++) 576 for (size_t i = g_num_builtin_categories; i < category_index; i++)
568 category_groups->push_back(g_category_groups[i]); 577 category_groups->push_back(g_category_groups[i]);
569 } 578 }
570 579
571 void TraceLog::SetEnabled(const TraceConfig& trace_config, Mode mode) { 580 void TraceLog::SetEnabled(const TraceConfig& trace_config, Mode mode) {
572 std::vector<EnabledStateObserver*> observer_list; 581 std::vector<EnabledStateObserver*> observer_list;
582 std::map<AsyncEnabledStateObserver*, RegisteredAsyncObserver> observer_map;
573 { 583 {
574 AutoLock lock(lock_); 584 AutoLock lock(lock_);
575 585
576 // Can't enable tracing when Flush() is in progress. 586 // Can't enable tracing when Flush() is in progress.
577 DCHECK(!flush_task_runner_); 587 DCHECK(!flush_task_runner_);
578 588
579 InternalTraceOptions new_options = 589 InternalTraceOptions new_options =
580 GetInternalOptionsFromTraceConfig(trace_config); 590 GetInternalOptionsFromTraceConfig(trace_config);
581 591
582 InternalTraceOptions old_options = trace_options(); 592 InternalTraceOptions old_options = trace_options();
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
635 dispatching_to_observer_list_ = true; 645 dispatching_to_observer_list_ = true;
636 observer_list = enabled_state_observer_list_; 646 observer_list = enabled_state_observer_list_;
647 observer_map = async_observers_;
alph 2016/05/11 22:35:52 You don't need to copy the map. You can iterate ov
637 } 648 }
638 // Notify observers outside the lock in case they trigger trace events. 649 // Notify observers outside the lock in case they trigger trace events.
639 for (size_t i = 0; i < observer_list.size(); ++i) 650 for (size_t i = 0; i < observer_list.size(); ++i)
640 observer_list[i]->OnTraceLogEnabled(); 651 observer_list[i]->OnTraceLogEnabled();
652 for (const auto& it : observer_map) {
653 it.second.task_runner->PostTask(
654 FROM_HERE, Bind(&AsyncEnabledStateObserver::OnTraceLogEnabled,
655 it.second.observer));
656 }
641 657
642 { 658 {
643 AutoLock lock(lock_); 659 AutoLock lock(lock_);
644 dispatching_to_observer_list_ = false; 660 dispatching_to_observer_list_ = false;
645 } 661 }
646 } 662 }
647 663
648 void TraceLog::SetArgumentFilterPredicate( 664 void TraceLog::SetArgumentFilterPredicate(
649 const ArgumentFilterPredicate& argument_filter_predicate) { 665 const ArgumentFilterPredicate& argument_filter_predicate) {
650 AutoLock lock(lock_); 666 AutoLock lock(lock_);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
719 dispatching_to_observer_list_ = true; 735 dispatching_to_observer_list_ = true;
720 std::vector<EnabledStateObserver*> observer_list = 736 std::vector<EnabledStateObserver*> observer_list =
721 enabled_state_observer_list_; 737 enabled_state_observer_list_;
738 std::map<AsyncEnabledStateObserver*, RegisteredAsyncObserver> observer_map =
739 async_observers_;
722 740
723 { 741 {
724 // Dispatch to observers outside the lock in case the observer triggers a 742 // Dispatch to observers outside the lock in case the observer triggers a
725 // trace event. 743 // trace event.
726 AutoUnlock unlock(lock_); 744 AutoUnlock unlock(lock_);
727 for (size_t i = 0; i < observer_list.size(); ++i) 745 for (size_t i = 0; i < observer_list.size(); ++i)
728 observer_list[i]->OnTraceLogDisabled(); 746 observer_list[i]->OnTraceLogDisabled();
747 for (const auto& it : observer_map) {
748 it.second.task_runner->PostTask(
749 FROM_HERE, Bind(&AsyncEnabledStateObserver::OnTraceLogDisabled,
750 it.second.observer));
751 }
729 } 752 }
730 dispatching_to_observer_list_ = false; 753 dispatching_to_observer_list_ = false;
731 } 754 }
732 755
733 int TraceLog::GetNumTracesRecorded() { 756 int TraceLog::GetNumTracesRecorded() {
734 AutoLock lock(lock_); 757 AutoLock lock(lock_);
735 if (!IsEnabled()) 758 if (!IsEnabled())
736 return -1; 759 return -1;
737 return num_traces_recorded_; 760 return num_traces_recorded_;
738 } 761 }
(...skipping 964 matching lines...) Expand 10 before | Expand all | Expand 10 after
1703 } 1726 }
1704 } 1727 }
1705 } 1728 }
1706 #endif // defined(OS_WIN) 1729 #endif // defined(OS_WIN)
1707 1730
1708 void ConvertableToTraceFormat::EstimateTraceMemoryOverhead( 1731 void ConvertableToTraceFormat::EstimateTraceMemoryOverhead(
1709 TraceEventMemoryOverhead* overhead) { 1732 TraceEventMemoryOverhead* overhead) {
1710 overhead->Add("ConvertableToTraceFormat(Unknown)", sizeof(*this)); 1733 overhead->Add("ConvertableToTraceFormat(Unknown)", sizeof(*this));
1711 } 1734 }
1712 1735
1736 void TraceLog::AddAsyncEnabledStateObserver(
1737 WeakPtr<AsyncEnabledStateObserver> listener) {
1738 AutoLock lock(lock_);
1739 async_observers_.insert(
1740 std::make_pair(listener.get(), RegisteredAsyncObserver(listener)));
1741 }
1742
1743 void TraceLog::RemoveAsyncEnabledStateObserver(
1744 AsyncEnabledStateObserver* listener) {
1745 AutoLock lock(lock_);
1746 async_observers_.erase(listener);
1747 }
1748
1749 bool TraceLog::HasAsyncEnabledStateObserver(
1750 AsyncEnabledStateObserver* listener) const {
1751 AutoLock lock(lock_);
1752 return ContainsKey(async_observers_, listener);
1753 }
1754
1713 } // namespace trace_event 1755 } // namespace trace_event
1714 } // namespace base 1756 } // namespace base
1715 1757
1716 namespace trace_event_internal { 1758 namespace trace_event_internal {
1717 1759
1718 ScopedTraceBinaryEfficient::ScopedTraceBinaryEfficient( 1760 ScopedTraceBinaryEfficient::ScopedTraceBinaryEfficient(
1719 const char* category_group, 1761 const char* category_group,
1720 const char* name) { 1762 const char* name) {
1721 // The single atom works because for now the category_group can only be "gpu". 1763 // The single atom works because for now the category_group can only be "gpu".
1722 DCHECK_EQ(strcmp(category_group, "gpu"), 0); 1764 DCHECK_EQ(strcmp(category_group, "gpu"), 0);
(...skipping 21 matching lines...) Expand all
1744 } 1786 }
1745 1787
1746 ScopedTraceBinaryEfficient::~ScopedTraceBinaryEfficient() { 1788 ScopedTraceBinaryEfficient::~ScopedTraceBinaryEfficient() {
1747 if (*category_group_enabled_) { 1789 if (*category_group_enabled_) {
1748 TRACE_EVENT_API_UPDATE_TRACE_EVENT_DURATION(category_group_enabled_, name_, 1790 TRACE_EVENT_API_UPDATE_TRACE_EVENT_DURATION(category_group_enabled_, name_,
1749 event_handle_); 1791 event_handle_);
1750 } 1792 }
1751 } 1793 }
1752 1794
1753 } // namespace trace_event_internal 1795 } // namespace trace_event_internal
OLDNEW
« no previous file with comments | « base/trace_event/trace_log.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698