| 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 1191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1202 uintptr_t category_ptr = reinterpret_cast<uintptr_t>(category_group_enabled); | 1202 uintptr_t category_ptr = reinterpret_cast<uintptr_t>(category_group_enabled); |
| 1203 DCHECK(category_ptr >= category_begin && | 1203 DCHECK(category_ptr >= category_begin && |
| 1204 category_ptr < reinterpret_cast<uintptr_t>( | 1204 category_ptr < reinterpret_cast<uintptr_t>( |
| 1205 g_category_group_enabled + MAX_CATEGORY_GROUPS)) << | 1205 g_category_group_enabled + MAX_CATEGORY_GROUPS)) << |
| 1206 "out of bounds category pointer"; | 1206 "out of bounds category pointer"; |
| 1207 uintptr_t category_index = | 1207 uintptr_t category_index = |
| 1208 (category_ptr - category_begin) / sizeof(g_category_group_enabled[0]); | 1208 (category_ptr - category_begin) / sizeof(g_category_group_enabled[0]); |
| 1209 return g_category_groups[category_index]; | 1209 return g_category_groups[category_index]; |
| 1210 } | 1210 } |
| 1211 | 1211 |
| 1212 void TraceLog::UpdateCategoryGroupEnabledFlag(int category_index) { | 1212 void TraceLog::UpdateCategoryGroupEnabledFlag(size_t category_index) { |
| 1213 unsigned char enabled_flag = 0; | 1213 unsigned char enabled_flag = 0; |
| 1214 const char* category_group = g_category_groups[category_index]; | 1214 const char* category_group = g_category_groups[category_index]; |
| 1215 if (mode_ == RECORDING_MODE && | 1215 if (mode_ == RECORDING_MODE && |
| 1216 category_filter_.IsCategoryGroupEnabled(category_group)) | 1216 category_filter_.IsCategoryGroupEnabled(category_group)) |
| 1217 enabled_flag |= ENABLED_FOR_RECORDING; | 1217 enabled_flag |= ENABLED_FOR_RECORDING; |
| 1218 else if (mode_ == MONITORING_MODE && | 1218 else if (mode_ == MONITORING_MODE && |
| 1219 category_filter_.IsCategoryGroupEnabled(category_group)) | 1219 category_filter_.IsCategoryGroupEnabled(category_group)) |
| 1220 enabled_flag |= ENABLED_FOR_MONITORING; | 1220 enabled_flag |= ENABLED_FOR_MONITORING; |
| 1221 if (event_callback_ && | 1221 if (event_callback_ && |
| 1222 event_callback_category_filter_.IsCategoryGroupEnabled(category_group)) | 1222 event_callback_category_filter_.IsCategoryGroupEnabled(category_group)) |
| 1223 enabled_flag |= ENABLED_FOR_EVENT_CALLBACK; | 1223 enabled_flag |= ENABLED_FOR_EVENT_CALLBACK; |
| 1224 g_category_group_enabled[category_index] = enabled_flag; | 1224 g_category_group_enabled[category_index] = enabled_flag; |
| 1225 } | 1225 } |
| 1226 | 1226 |
| 1227 void TraceLog::UpdateCategoryGroupEnabledFlags() { | 1227 void TraceLog::UpdateCategoryGroupEnabledFlags() { |
| 1228 int category_index = base::subtle::NoBarrier_Load(&g_category_index); | 1228 size_t category_index = base::subtle::NoBarrier_Load(&g_category_index); |
| 1229 for (int i = 0; i < category_index; i++) | 1229 for (size_t i = 0; i < category_index; i++) |
| 1230 UpdateCategoryGroupEnabledFlag(i); | 1230 UpdateCategoryGroupEnabledFlag(i); |
| 1231 } | 1231 } |
| 1232 | 1232 |
| 1233 void TraceLog::UpdateSyntheticDelaysFromCategoryFilter() { | 1233 void TraceLog::UpdateSyntheticDelaysFromCategoryFilter() { |
| 1234 ResetTraceEventSyntheticDelays(); | 1234 ResetTraceEventSyntheticDelays(); |
| 1235 const CategoryFilter::StringList& delays = | 1235 const CategoryFilter::StringList& delays = |
| 1236 category_filter_.GetSyntheticDelayValues(); | 1236 category_filter_.GetSyntheticDelayValues(); |
| 1237 CategoryFilter::StringList::const_iterator ci; | 1237 CategoryFilter::StringList::const_iterator ci; |
| 1238 for (ci = delays.begin(); ci != delays.end(); ++ci) { | 1238 for (ci = delays.begin(); ci != delays.end(); ++ci) { |
| 1239 StringTokenizer tokens(*ci, ";"); | 1239 StringTokenizer tokens(*ci, ";"); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1257 } | 1257 } |
| 1258 } | 1258 } |
| 1259 } | 1259 } |
| 1260 } | 1260 } |
| 1261 | 1261 |
| 1262 const unsigned char* TraceLog::GetCategoryGroupEnabledInternal( | 1262 const unsigned char* TraceLog::GetCategoryGroupEnabledInternal( |
| 1263 const char* category_group) { | 1263 const char* category_group) { |
| 1264 DCHECK(!strchr(category_group, '"')) << | 1264 DCHECK(!strchr(category_group, '"')) << |
| 1265 "Category groups may not contain double quote"; | 1265 "Category groups may not contain double quote"; |
| 1266 // The g_category_groups is append only, avoid using a lock for the fast path. | 1266 // The g_category_groups is append only, avoid using a lock for the fast path. |
| 1267 int current_category_index = base::subtle::Acquire_Load(&g_category_index); | 1267 size_t current_category_index = base::subtle::Acquire_Load(&g_category_index); |
| 1268 | 1268 |
| 1269 // Search for pre-existing category group. | 1269 // Search for pre-existing category group. |
| 1270 for (int i = 0; i < current_category_index; ++i) { | 1270 for (size_t i = 0; i < current_category_index; ++i) { |
| 1271 if (strcmp(g_category_groups[i], category_group) == 0) { | 1271 if (strcmp(g_category_groups[i], category_group) == 0) { |
| 1272 return &g_category_group_enabled[i]; | 1272 return &g_category_group_enabled[i]; |
| 1273 } | 1273 } |
| 1274 } | 1274 } |
| 1275 | 1275 |
| 1276 unsigned char* category_group_enabled = NULL; | 1276 unsigned char* category_group_enabled = NULL; |
| 1277 // This is the slow path: the lock is not held in the case above, so more | 1277 // This is the slow path: the lock is not held in the case above, so more |
| 1278 // than one thread could have reached here trying to add the same category. | 1278 // than one thread could have reached here trying to add the same category. |
| 1279 // Only hold to lock when actually appending a new category, and | 1279 // Only hold to lock when actually appending a new category, and |
| 1280 // check the categories groups again. | 1280 // check the categories groups again. |
| 1281 AutoLock lock(lock_); | 1281 AutoLock lock(lock_); |
| 1282 int category_index = base::subtle::Acquire_Load(&g_category_index); | 1282 size_t category_index = base::subtle::Acquire_Load(&g_category_index); |
| 1283 for (int i = 0; i < category_index; ++i) { | 1283 for (size_t i = 0; i < category_index; ++i) { |
| 1284 if (strcmp(g_category_groups[i], category_group) == 0) { | 1284 if (strcmp(g_category_groups[i], category_group) == 0) { |
| 1285 return &g_category_group_enabled[i]; | 1285 return &g_category_group_enabled[i]; |
| 1286 } | 1286 } |
| 1287 } | 1287 } |
| 1288 | 1288 |
| 1289 // Create a new category group. | 1289 // Create a new category group. |
| 1290 DCHECK(category_index < MAX_CATEGORY_GROUPS) << | 1290 DCHECK(category_index < MAX_CATEGORY_GROUPS) << |
| 1291 "must increase MAX_CATEGORY_GROUPS"; | 1291 "must increase MAX_CATEGORY_GROUPS"; |
| 1292 if (category_index < MAX_CATEGORY_GROUPS) { | 1292 if (category_index < MAX_CATEGORY_GROUPS) { |
| 1293 // Don't hold on to the category_group pointer, so that we can create | 1293 // Don't hold on to the category_group pointer, so that we can create |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1309 &g_category_group_enabled[g_category_categories_exhausted]; | 1309 &g_category_group_enabled[g_category_categories_exhausted]; |
| 1310 } | 1310 } |
| 1311 return category_group_enabled; | 1311 return category_group_enabled; |
| 1312 } | 1312 } |
| 1313 | 1313 |
| 1314 void TraceLog::GetKnownCategoryGroups( | 1314 void TraceLog::GetKnownCategoryGroups( |
| 1315 std::vector<std::string>* category_groups) { | 1315 std::vector<std::string>* category_groups) { |
| 1316 AutoLock lock(lock_); | 1316 AutoLock lock(lock_); |
| 1317 category_groups->push_back( | 1317 category_groups->push_back( |
| 1318 g_category_groups[g_category_trace_event_overhead]); | 1318 g_category_groups[g_category_trace_event_overhead]); |
| 1319 int category_index = base::subtle::NoBarrier_Load(&g_category_index); | 1319 size_t category_index = base::subtle::NoBarrier_Load(&g_category_index); |
| 1320 for (int i = g_num_builtin_categories; i < category_index; i++) | 1320 for (size_t i = g_num_builtin_categories; i < category_index; i++) |
| 1321 category_groups->push_back(g_category_groups[i]); | 1321 category_groups->push_back(g_category_groups[i]); |
| 1322 } | 1322 } |
| 1323 | 1323 |
| 1324 void TraceLog::SetEnabled(const CategoryFilter& category_filter, | 1324 void TraceLog::SetEnabled(const CategoryFilter& category_filter, |
| 1325 Mode mode, | 1325 Mode mode, |
| 1326 Options options) { | 1326 Options options) { |
| 1327 std::vector<EnabledStateObserver*> observer_list; | 1327 std::vector<EnabledStateObserver*> observer_list; |
| 1328 { | 1328 { |
| 1329 AutoLock lock(lock_); | 1329 AutoLock lock(lock_); |
| 1330 | 1330 |
| (...skipping 1097 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2428 } | 2428 } |
| 2429 | 2429 |
| 2430 ScopedTraceBinaryEfficient::~ScopedTraceBinaryEfficient() { | 2430 ScopedTraceBinaryEfficient::~ScopedTraceBinaryEfficient() { |
| 2431 if (*category_group_enabled_) { | 2431 if (*category_group_enabled_) { |
| 2432 TRACE_EVENT_API_UPDATE_TRACE_EVENT_DURATION(category_group_enabled_, | 2432 TRACE_EVENT_API_UPDATE_TRACE_EVENT_DURATION(category_group_enabled_, |
| 2433 name_, event_handle_); | 2433 name_, event_handle_); |
| 2434 } | 2434 } |
| 2435 } | 2435 } |
| 2436 | 2436 |
| 2437 } // namespace trace_event_internal | 2437 } // namespace trace_event_internal |
| OLD | NEW |