| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/debug/trace_event_impl.h" | 5 #include "base/debug/trace_event_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/base_switches.h" | 9 #include "base/base_switches.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 }; | 43 }; |
| 44 | 44 |
| 45 // The thread buckets for the sampling profiler. | 45 // The thread buckets for the sampling profiler. |
| 46 BASE_EXPORT TRACE_EVENT_API_ATOMIC_WORD g_trace_state[3]; | 46 BASE_EXPORT TRACE_EVENT_API_ATOMIC_WORD g_trace_state[3]; |
| 47 | 47 |
| 48 namespace base { | 48 namespace base { |
| 49 namespace debug { | 49 namespace debug { |
| 50 | 50 |
| 51 // Controls the number of trace events we will buffer in-memory | 51 // Controls the number of trace events we will buffer in-memory |
| 52 // before throwing them away. | 52 // before throwing them away. |
| 53 const size_t kTraceEventBufferSize = 500000; | 53 const size_t kTraceEventVectorBufferSize = 250000; |
| 54 const size_t kTraceEventRingBufferSize = kTraceEventVectorBufferSize / 4; |
| 54 const size_t kTraceEventBatchSize = 1000; | 55 const size_t kTraceEventBatchSize = 1000; |
| 55 const size_t kTraceEventInitialBufferSize = 1024; | 56 const size_t kTraceEventInitialBufferSize = 1024; |
| 56 | 57 |
| 57 #define MAX_CATEGORY_GROUPS 100 | 58 #define MAX_CATEGORY_GROUPS 100 |
| 58 | 59 |
| 59 namespace { | 60 namespace { |
| 60 | 61 |
| 61 // Parallel arrays g_category_groups and g_category_group_enabled are separate | 62 // Parallel arrays g_category_groups and g_category_group_enabled are separate |
| 62 // so that a pointer to a member of g_category_group_enabled can be easily | 63 // so that a pointer to a member of g_category_group_enabled can be easily |
| 63 // converted to an index into g_category_groups. This allows macros to deal | 64 // converted to an index into g_category_groups. This allows macros to deal |
| (...skipping 17 matching lines...) Expand all Loading... |
| 81 // The name of the current thread. This is used to decide if the current | 82 // The name of the current thread. This is used to decide if the current |
| 82 // thread name has changed. We combine all the seen thread names into the | 83 // thread name has changed. We combine all the seen thread names into the |
| 83 // output name for the thread. | 84 // output name for the thread. |
| 84 LazyInstance<ThreadLocalPointer<const char> >::Leaky | 85 LazyInstance<ThreadLocalPointer<const char> >::Leaky |
| 85 g_current_thread_name = LAZY_INSTANCE_INITIALIZER; | 86 g_current_thread_name = LAZY_INSTANCE_INITIALIZER; |
| 86 | 87 |
| 87 const char kRecordUntilFull[] = "record-until-full"; | 88 const char kRecordUntilFull[] = "record-until-full"; |
| 88 const char kRecordContinuously[] = "record-continuously"; | 89 const char kRecordContinuously[] = "record-continuously"; |
| 89 const char kEnableSampling[] = "enable-sampling"; | 90 const char kEnableSampling[] = "enable-sampling"; |
| 90 | 91 |
| 91 size_t NextIndex(size_t index) { | |
| 92 index++; | |
| 93 if (index >= kTraceEventBufferSize) | |
| 94 index = 0; | |
| 95 return index; | |
| 96 } | |
| 97 | |
| 98 } // namespace | 92 } // namespace |
| 99 | 93 |
| 100 class TraceBufferRingBuffer : public TraceBuffer { | 94 class TraceBufferRingBuffer : public TraceBuffer { |
| 101 public: | 95 public: |
| 102 TraceBufferRingBuffer() | 96 TraceBufferRingBuffer() |
| 103 : unused_event_index_(0), | 97 : unused_event_index_(0), |
| 104 oldest_event_index_(0) { | 98 oldest_event_index_(0) { |
| 105 logged_events_.reserve(kTraceEventInitialBufferSize); | 99 logged_events_.reserve(kTraceEventInitialBufferSize); |
| 106 } | 100 } |
| 107 | 101 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 | 147 |
| 154 virtual const TraceEvent& GetEventAt(size_t index) const OVERRIDE { | 148 virtual const TraceEvent& GetEventAt(size_t index) const OVERRIDE { |
| 155 DCHECK(index < logged_events_.size()); | 149 DCHECK(index < logged_events_.size()); |
| 156 return logged_events_[index]; | 150 return logged_events_[index]; |
| 157 } | 151 } |
| 158 | 152 |
| 159 virtual size_t Size() const OVERRIDE { | 153 virtual size_t Size() const OVERRIDE { |
| 160 return logged_events_.size(); | 154 return logged_events_.size(); |
| 161 } | 155 } |
| 162 | 156 |
| 157 virtual size_t Capacity() const OVERRIDE { |
| 158 return kTraceEventRingBufferSize; |
| 159 } |
| 160 |
| 163 private: | 161 private: |
| 162 static size_t NextIndex(size_t index) { |
| 163 index++; |
| 164 if (index >= kTraceEventRingBufferSize) |
| 165 index = 0; |
| 166 return index; |
| 167 } |
| 168 |
| 164 size_t unused_event_index_; | 169 size_t unused_event_index_; |
| 165 size_t oldest_event_index_; | 170 size_t oldest_event_index_; |
| 166 std::vector<TraceEvent> logged_events_; | 171 std::vector<TraceEvent> logged_events_; |
| 167 | 172 |
| 168 DISALLOW_COPY_AND_ASSIGN(TraceBufferRingBuffer); | 173 DISALLOW_COPY_AND_ASSIGN(TraceBufferRingBuffer); |
| 169 }; | 174 }; |
| 170 | 175 |
| 171 class TraceBufferVector : public TraceBuffer { | 176 class TraceBufferVector : public TraceBuffer { |
| 172 public: | 177 public: |
| 173 TraceBufferVector() : current_iteration_index_(0) { | 178 TraceBufferVector() : current_iteration_index_(0) { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 189 virtual bool HasMoreEvents() const OVERRIDE { | 194 virtual bool HasMoreEvents() const OVERRIDE { |
| 190 return current_iteration_index_ < Size(); | 195 return current_iteration_index_ < Size(); |
| 191 } | 196 } |
| 192 | 197 |
| 193 virtual const TraceEvent& NextEvent() OVERRIDE { | 198 virtual const TraceEvent& NextEvent() OVERRIDE { |
| 194 DCHECK(HasMoreEvents()); | 199 DCHECK(HasMoreEvents()); |
| 195 return GetEventAt(current_iteration_index_++); | 200 return GetEventAt(current_iteration_index_++); |
| 196 } | 201 } |
| 197 | 202 |
| 198 virtual bool IsFull() const OVERRIDE { | 203 virtual bool IsFull() const OVERRIDE { |
| 199 return Size() >= kTraceEventBufferSize; | 204 return Size() >= kTraceEventVectorBufferSize; |
| 200 } | 205 } |
| 201 | 206 |
| 202 virtual size_t CountEnabledByName( | 207 virtual size_t CountEnabledByName( |
| 203 const unsigned char* category, | 208 const unsigned char* category, |
| 204 const std::string& event_name) const OVERRIDE { | 209 const std::string& event_name) const OVERRIDE { |
| 205 size_t notify_count = 0; | 210 size_t notify_count = 0; |
| 206 for (size_t i = 0; i < Size(); i++) { | 211 for (size_t i = 0; i < Size(); i++) { |
| 207 const TraceEvent& event = GetEventAt(i); | 212 const TraceEvent& event = GetEventAt(i); |
| 208 if (category == event.category_group_enabled() && | 213 if (category == event.category_group_enabled() && |
| 209 strcmp(event_name.c_str(), event.name()) == 0) { | 214 strcmp(event_name.c_str(), event.name()) == 0) { |
| 210 ++notify_count; | 215 ++notify_count; |
| 211 } | 216 } |
| 212 } | 217 } |
| 213 return notify_count; | 218 return notify_count; |
| 214 } | 219 } |
| 215 | 220 |
| 216 virtual const TraceEvent& GetEventAt(size_t index) const OVERRIDE { | 221 virtual const TraceEvent& GetEventAt(size_t index) const OVERRIDE { |
| 217 DCHECK(index < logged_events_.size()); | 222 DCHECK(index < logged_events_.size()); |
| 218 return logged_events_[index]; | 223 return logged_events_[index]; |
| 219 } | 224 } |
| 220 | 225 |
| 221 virtual size_t Size() const OVERRIDE { | 226 virtual size_t Size() const OVERRIDE { |
| 222 return logged_events_.size(); | 227 return logged_events_.size(); |
| 223 } | 228 } |
| 224 | 229 |
| 230 virtual size_t Capacity() const OVERRIDE { |
| 231 return kTraceEventVectorBufferSize; |
| 232 } |
| 233 |
| 225 private: | 234 private: |
| 226 size_t current_iteration_index_; | 235 size_t current_iteration_index_; |
| 227 std::vector<TraceEvent> logged_events_; | 236 std::vector<TraceEvent> logged_events_; |
| 228 | 237 |
| 229 DISALLOW_COPY_AND_ASSIGN(TraceBufferVector); | 238 DISALLOW_COPY_AND_ASSIGN(TraceBufferVector); |
| 230 }; | 239 }; |
| 231 | 240 |
| 232 class TraceBufferDiscardsEvents : public TraceBuffer { | 241 class TraceBufferDiscardsEvents : public TraceBuffer { |
| 233 public: | 242 public: |
| 234 virtual ~TraceBufferDiscardsEvents() { } | 243 virtual ~TraceBufferDiscardsEvents() { } |
| 235 | 244 |
| 236 virtual void AddEvent(const TraceEvent& event) OVERRIDE {} | 245 virtual void AddEvent(const TraceEvent& event) OVERRIDE {} |
| 237 virtual bool HasMoreEvents() const OVERRIDE { return false; } | 246 virtual bool HasMoreEvents() const OVERRIDE { return false; } |
| 238 | 247 |
| 239 virtual const TraceEvent& NextEvent() OVERRIDE { | 248 virtual const TraceEvent& NextEvent() OVERRIDE { |
| 240 NOTREACHED(); | 249 NOTREACHED(); |
| 241 return *static_cast<TraceEvent*>(NULL); | 250 return *static_cast<TraceEvent*>(NULL); |
| 242 } | 251 } |
| 243 | 252 |
| 244 virtual bool IsFull() const OVERRIDE { return false; } | 253 virtual bool IsFull() const OVERRIDE { return false; } |
| 245 | 254 |
| 246 virtual size_t CountEnabledByName( | 255 virtual size_t CountEnabledByName( |
| 247 const unsigned char* category, | 256 const unsigned char* category, |
| 248 const std::string& event_name) const OVERRIDE { | 257 const std::string& event_name) const OVERRIDE { |
| 249 return 0; | 258 return 0; |
| 250 } | 259 } |
| 251 | 260 |
| 252 virtual size_t Size() const OVERRIDE { return 0; } | 261 virtual size_t Size() const OVERRIDE { return 0; } |
| 253 | 262 |
| 263 // As this buffer is never full, we can return any positive number. |
| 264 virtual size_t Capacity() const OVERRIDE { return 1; } |
| 265 |
| 254 virtual const TraceEvent& GetEventAt(size_t index) const OVERRIDE { | 266 virtual const TraceEvent& GetEventAt(size_t index) const OVERRIDE { |
| 255 NOTREACHED(); | 267 NOTREACHED(); |
| 256 return *static_cast<TraceEvent*>(NULL); | 268 return *static_cast<TraceEvent*>(NULL); |
| 257 } | 269 } |
| 258 }; | 270 }; |
| 259 | 271 |
| 260 //////////////////////////////////////////////////////////////////////////////// | 272 //////////////////////////////////////////////////////////////////////////////// |
| 261 // | 273 // |
| 262 // TraceEvent | 274 // TraceEvent |
| 263 // | 275 // |
| (...skipping 817 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1081 | 1093 |
| 1082 bool TraceLog::HasEnabledStateObserver(EnabledStateObserver* listener) const { | 1094 bool TraceLog::HasEnabledStateObserver(EnabledStateObserver* listener) const { |
| 1083 std::vector<EnabledStateObserver*>::const_iterator it = | 1095 std::vector<EnabledStateObserver*>::const_iterator it = |
| 1084 std::find(enabled_state_observer_list_.begin(), | 1096 std::find(enabled_state_observer_list_.begin(), |
| 1085 enabled_state_observer_list_.end(), | 1097 enabled_state_observer_list_.end(), |
| 1086 listener); | 1098 listener); |
| 1087 return it != enabled_state_observer_list_.end(); | 1099 return it != enabled_state_observer_list_.end(); |
| 1088 } | 1100 } |
| 1089 | 1101 |
| 1090 float TraceLog::GetBufferPercentFull() const { | 1102 float TraceLog::GetBufferPercentFull() const { |
| 1091 return (float)((double)logged_events_->Size()/(double)kTraceEventBufferSize); | 1103 return static_cast<float>(static_cast<double>(logged_events_->Size()) / |
| 1104 logged_events_->Capacity()); |
| 1092 } | 1105 } |
| 1093 | 1106 |
| 1094 void TraceLog::SetNotificationCallback( | 1107 void TraceLog::SetNotificationCallback( |
| 1095 const TraceLog::NotificationCallback& cb) { | 1108 const TraceLog::NotificationCallback& cb) { |
| 1096 AutoLock lock(lock_); | 1109 AutoLock lock(lock_); |
| 1097 notification_callback_ = cb; | 1110 notification_callback_ = cb; |
| 1098 } | 1111 } |
| 1099 | 1112 |
| 1100 TraceBuffer* TraceLog::GetTraceBuffer() { | 1113 TraceBuffer* TraceLog::GetTraceBuffer() { |
| 1101 if (trace_options_ & RECORD_CONTINUOUSLY) | 1114 if (trace_options_ & RECORD_CONTINUOUSLY) |
| (...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1683 0, // num_args | 1696 0, // num_args |
| 1684 NULL, // arg_names | 1697 NULL, // arg_names |
| 1685 NULL, // arg_types | 1698 NULL, // arg_types |
| 1686 NULL, // arg_values | 1699 NULL, // arg_values |
| 1687 NULL, // convertable values | 1700 NULL, // convertable values |
| 1688 TRACE_EVENT_FLAG_NONE); // flags | 1701 TRACE_EVENT_FLAG_NONE); // flags |
| 1689 } | 1702 } |
| 1690 } | 1703 } |
| 1691 | 1704 |
| 1692 } // namespace trace_event_internal | 1705 } // namespace trace_event_internal |
| OLD | NEW |