Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project 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 <stdio.h> | 5 #include <stdio.h> |
| 6 #include <string.h> | 6 #include <string.h> |
| 7 | 7 |
| 8 #include "include/libplatform/v8-tracing.h" | 8 #include "include/libplatform/v8-tracing.h" |
| 9 | 9 |
| 10 #include "src/base/platform/mutex.h" | 10 #include "src/base/platform/mutex.h" |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 31 // Indexes here have to match the g_category_groups array indexes above. | 31 // Indexes here have to match the g_category_groups array indexes above. |
| 32 const int g_category_already_shutdown = 1; | 32 const int g_category_already_shutdown = 1; |
| 33 const int g_category_categories_exhausted = 2; | 33 const int g_category_categories_exhausted = 2; |
| 34 // Metadata category not used in V8. | 34 // Metadata category not used in V8. |
| 35 // const int g_category_metadata = 3; | 35 // const int g_category_metadata = 3; |
| 36 const int g_num_builtin_categories = 4; | 36 const int g_num_builtin_categories = 4; |
| 37 | 37 |
| 38 // Skip default categories. | 38 // Skip default categories. |
| 39 v8::base::AtomicWord g_category_index = g_num_builtin_categories; | 39 v8::base::AtomicWord g_category_index = g_num_builtin_categories; |
| 40 | 40 |
| 41 TracingController::TracingController() {} | |
| 42 | |
| 43 TracingController::~TracingController() {} | |
| 44 | |
| 41 void TracingController::Initialize(TraceBuffer* trace_buffer) { | 45 void TracingController::Initialize(TraceBuffer* trace_buffer) { |
| 42 trace_buffer_.reset(trace_buffer); | 46 trace_buffer_.reset(trace_buffer); |
| 47 mutex_.reset(new base::Mutex()); | |
| 43 } | 48 } |
| 44 | 49 |
| 45 uint64_t TracingController::AddTraceEvent( | 50 uint64_t TracingController::AddTraceEvent( |
| 46 char phase, const uint8_t* category_enabled_flag, const char* name, | 51 char phase, const uint8_t* category_enabled_flag, const char* name, |
| 47 const char* scope, uint64_t id, uint64_t bind_id, int num_args, | 52 const char* scope, uint64_t id, uint64_t bind_id, int num_args, |
| 48 const char** arg_names, const uint8_t* arg_types, | 53 const char** arg_names, const uint8_t* arg_types, |
| 49 const uint64_t* arg_values, unsigned int flags) { | 54 const uint64_t* arg_values, unsigned int flags) { |
| 50 uint64_t handle; | 55 uint64_t handle; |
| 51 TraceObject* trace_object = trace_buffer_->AddTraceEvent(&handle); | 56 TraceObject* trace_object = trace_buffer_->AddTraceEvent(&handle); |
| 52 if (trace_object) { | 57 if (trace_object) { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 86 MAX_CATEGORY_GROUPS)); | 91 MAX_CATEGORY_GROUPS)); |
| 87 uintptr_t category_index = | 92 uintptr_t category_index = |
| 88 (category_ptr - category_begin) / sizeof(g_category_group_enabled[0]); | 93 (category_ptr - category_begin) / sizeof(g_category_group_enabled[0]); |
| 89 return g_category_groups[category_index]; | 94 return g_category_groups[category_index]; |
| 90 } | 95 } |
| 91 | 96 |
| 92 void TracingController::StartTracing(TraceConfig* trace_config) { | 97 void TracingController::StartTracing(TraceConfig* trace_config) { |
| 93 trace_config_.reset(trace_config); | 98 trace_config_.reset(trace_config); |
| 94 mode_ = RECORDING_MODE; | 99 mode_ = RECORDING_MODE; |
| 95 UpdateCategoryGroupEnabledFlags(); | 100 UpdateCategoryGroupEnabledFlags(); |
| 101 std::unordered_set<Platform::TraceStateObserver*> observers_copy; | |
| 102 { | |
| 103 base::LockGuard<base::Mutex> lock(mutex_.get()); | |
| 104 observers_copy = observers_; | |
|
fmeawad
2016/09/27 18:05:49
nit: I would argue that the copy constructor has t
caseq
2016/09/27 18:09:04
No. This is about not invoking callbacks from unde
| |
| 105 } | |
| 106 for (auto o : observers_copy) { | |
| 107 o->OnTraceEnabled(); | |
| 108 } | |
| 96 } | 109 } |
| 97 | 110 |
| 98 void TracingController::StopTracing() { | 111 void TracingController::StopTracing() { |
| 99 mode_ = DISABLED; | 112 mode_ = DISABLED; |
| 100 UpdateCategoryGroupEnabledFlags(); | 113 UpdateCategoryGroupEnabledFlags(); |
| 114 std::unordered_set<Platform::TraceStateObserver*> observers_copy; | |
| 115 { | |
| 116 base::LockGuard<base::Mutex> lock(mutex_.get()); | |
| 117 observers_copy = observers_; | |
| 118 } | |
| 119 for (auto o : observers_copy) { | |
| 120 o->OnTraceDisabled(); | |
|
caseq
2016/09/27 17:50:22
I'm a bit concerned about this being potentially c
fmeawad
2016/09/27 18:05:49
We need to disable the observer on stop tracing, i
alph
2016/09/27 19:10:53
I moved StopTracing to the very beginning of platf
| |
| 121 } | |
| 101 trace_buffer_->Flush(); | 122 trace_buffer_->Flush(); |
| 102 } | 123 } |
| 103 | 124 |
| 104 void TracingController::UpdateCategoryGroupEnabledFlag(size_t category_index) { | 125 void TracingController::UpdateCategoryGroupEnabledFlag(size_t category_index) { |
| 105 unsigned char enabled_flag = 0; | 126 unsigned char enabled_flag = 0; |
| 106 const char* category_group = g_category_groups[category_index]; | 127 const char* category_group = g_category_groups[category_index]; |
| 107 if (mode_ == RECORDING_MODE && | 128 if (mode_ == RECORDING_MODE && |
| 108 trace_config_->IsCategoryGroupEnabled(category_group)) { | 129 trace_config_->IsCategoryGroupEnabled(category_group)) { |
| 109 enabled_flag |= ENABLED_FOR_RECORDING; | 130 enabled_flag |= ENABLED_FOR_RECORDING; |
| 110 } | 131 } |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 165 category_group_enabled = &g_category_group_enabled[category_index]; | 186 category_group_enabled = &g_category_group_enabled[category_index]; |
| 166 // Update the max index now. | 187 // Update the max index now. |
| 167 base::Release_Store(&g_category_index, category_index + 1); | 188 base::Release_Store(&g_category_index, category_index + 1); |
| 168 } else { | 189 } else { |
| 169 category_group_enabled = | 190 category_group_enabled = |
| 170 &g_category_group_enabled[g_category_categories_exhausted]; | 191 &g_category_group_enabled[g_category_categories_exhausted]; |
| 171 } | 192 } |
| 172 return category_group_enabled; | 193 return category_group_enabled; |
| 173 } | 194 } |
| 174 | 195 |
| 196 void TracingController::AddTraceStateObserver( | |
| 197 Platform::TraceStateObserver* observer) { | |
| 198 base::LockGuard<base::Mutex> lock(mutex_.get()); | |
| 199 observers_.insert(observer); | |
| 200 } | |
| 201 | |
| 202 void TracingController::RemoveTraceStateObserver( | |
| 203 Platform::TraceStateObserver* observer) { | |
| 204 base::LockGuard<base::Mutex> lock(mutex_.get()); | |
| 205 DCHECK(observers_.find(observer) != observers_.end()); | |
| 206 observers_.erase(observer); | |
| 207 } | |
| 208 | |
| 175 } // namespace tracing | 209 } // namespace tracing |
| 176 } // namespace platform | 210 } // namespace platform |
| 177 } // namespace v8 | 211 } // namespace v8 |
| OLD | NEW |