| 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 | 
|---|