Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |