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::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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |