Index: base/debug/trace_event.h |
diff --git a/base/debug/trace_event.h b/base/debug/trace_event.h |
index 444c97514dc925ed31f46bbd3f7fdfb04399333b..b1a9b7177cbda37b601a4c8669a1d5603ba798a3 100644 |
--- a/base/debug/trace_event.h |
+++ b/base/debug/trace_event.h |
@@ -126,7 +126,7 @@ |
// the static variable is safe, as they will be serialized by the lock and |
// multiple calls will return the same pointer to the category. |
// |
-// Then the category.enabled flag is checked. This is a volatile bool, and |
+// Then the category_enabled flag is checked. This is a unsigned char, and |
// not intended to be multithread safe. It optimizes access to AddTraceEvent |
// which is threadsafe internally via TraceLog::lock_. The enabled flag may |
// cause some threads to incorrectly call or skip calling AddTraceEvent near |
@@ -160,9 +160,56 @@ |
#include "base/third_party/dynamic_annotations/dynamic_annotations.h" |
#include "base/timer.h" |
+//////////////////////////////////////////////////////////////////////////////// |
+// TODO(jbates): split this into a separate header. |
+// This header is designed to be give you trace_event macros without specifying |
+// how the events actually get collected and stored. If you need to expose trace |
+// event to some other universe, you can copy-and-paste this file and just |
+// implement these API macros. |
+ |
+// unsigned char* |
+// TRACE_EVENT_API_GET_CATEGORY_ENABLED(const char* category_name) |
+#define TRACE_EVENT_API_GET_CATEGORY_ENABLED \ |
+ base::debug::TraceLog::GetCategoryEnabled |
+ |
+// Returns the threshold_begin_id used by TRACE_IF_LONGER_THAN macros. |
+// int TRACE_EVENT_API_ADD_TRACE_EVENT( |
+// char phase, |
+// const unsigned char* category_enabled, |
+// const char* name, |
+// unsigned long long id, |
+// int num_args, |
+// const char** arg_names, |
+// const unsigned char* arg_types, |
+// const unsigned long long* arg_values, |
+// int threshold_begin_id, |
+// long long threshold, |
+// unsigned char flags) |
+#define TRACE_EVENT_API_ADD_TRACE_EVENT \ |
+ base::debug::TraceLog::GetInstance()->AddTraceEvent |
+ |
+// void TRACE_EVENT_API_ADD_COUNTER_EVENT( |
+// const unsigned char* category_enabled, |
+// const char* name, |
+// unsigned long long id, |
+// const char* arg1_name, int arg1_val, |
+// const char* arg2_name, int arg2_val, |
+// unsigned char flags) |
+#define TRACE_EVENT_API_ADD_COUNTER_EVENT \ |
+ base::debug::TraceLog::GetInstance()->AddCounterEvent |
+ |
+// Mangle |pointer| with a process ID hash so that if |pointer| occurs on more |
+// than one process, it will not collide in the trace data. |
+// unsigned long long TRACE_EVENT_API_GET_ID_FROM_POINTER(void* pointer) |
+#define TRACE_EVENT_API_GET_ID_FROM_POINTER \ |
+ base::debug::TraceLog::GetInstance()->GetInterProcessID |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+ |
// By default, const char* argument values are assumed to have long-lived scope |
// and will not be copied. Use this macro to force a const char* to be copied. |
-#define TRACE_STR_COPY(str) base::debug::TraceValue::StringWithCopy(str) |
+#define TRACE_STR_COPY(str) \ |
+ trace_event_internal::TraceStringWithCopy(str) |
// Older style trace macros with explicit id and extra data |
// Only these macros result in publishing data to ETW as currently implemented. |
@@ -187,12 +234,12 @@ |
// - category and name strings must have application lifetime (statics or |
// literals). They may not include " chars. |
#define TRACE_EVENT0(category, name) \ |
- TRACE_EVENT1(category, name, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD_SCOPED(category, name) |
#define TRACE_EVENT1(category, name, arg1_name, arg1_val) \ |
- TRACE_EVENT2(category, name, arg1_name, arg1_val, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD_SCOPED(category, name, arg1_name, arg1_val) |
#define TRACE_EVENT2(category, name, arg1_name, arg1_val, arg2_name, arg2_val) \ |
- INTERNAL_TRACE_EVENT_ADD_SCOPED( \ |
- category, name, arg1_name, arg1_val, arg2_name, arg2_val) |
+ INTERNAL_TRACE_EVENT_ADD_SCOPED(category, name, arg1_name, arg1_val, \ |
+ arg2_name, arg2_val) |
// Same as TRACE_EVENT except that they are not included in official builds. |
#ifdef OFFICIAL_BUILD |
@@ -229,25 +276,27 @@ |
// - category and name strings must have application lifetime (statics or |
// literals). They may not include " chars. |
#define TRACE_EVENT_INSTANT0(category, name) \ |
- TRACE_EVENT_INSTANT1(category, name, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, \ |
+ category, name, TRACE_EVENT_FLAG_NONE) |
#define TRACE_EVENT_INSTANT1(category, name, arg1_name, arg1_val) \ |
- TRACE_EVENT_INSTANT2(category, name, arg1_name, arg1_val, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, \ |
+ category, name, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val) |
#define TRACE_EVENT_INSTANT2(category, name, arg1_name, arg1_val, \ |
arg2_name, arg2_val) \ |
INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, \ |
- category, name, arg1_name, arg1_val, arg2_name, arg2_val, \ |
- TRACE_EVENT_FLAG_NONE) |
+ category, name, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, \ |
+ arg2_name, arg2_val) |
#define TRACE_EVENT_COPY_INSTANT0(category, name) \ |
- TRACE_EVENT_COPY_INSTANT1(category, name, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, \ |
+ category, name, TRACE_EVENT_FLAG_COPY) |
#define TRACE_EVENT_COPY_INSTANT1(category, name, arg1_name, arg1_val) \ |
- TRACE_EVENT_COPY_INSTANT2(category, name, arg1_name, arg1_val, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, \ |
+ category, name, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val) |
#define TRACE_EVENT_COPY_INSTANT2(category, name, arg1_name, arg1_val, \ |
arg2_name, arg2_val) \ |
INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, \ |
- category, name, \ |
- arg1_name, base::debug::TraceValue::ForceCopy(arg1_val), \ |
- arg2_name, base::debug::TraceValue::ForceCopy(arg2_val), \ |
- TRACE_EVENT_FLAG_COPY) |
+ category, name, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, \ |
+ arg2_name, arg2_val) |
// Records a single BEGIN event called "name" immediately, with 0, 1 or 2 |
// associated arguments. If the category is not enabled, then this |
@@ -255,50 +304,54 @@ |
// - category and name strings must have application lifetime (statics or |
// literals). They may not include " chars. |
#define TRACE_EVENT_BEGIN0(category, name) \ |
- TRACE_EVENT_BEGIN1(category, name, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, \ |
+ category, name, TRACE_EVENT_FLAG_NONE) |
#define TRACE_EVENT_BEGIN1(category, name, arg1_name, arg1_val) \ |
- TRACE_EVENT_BEGIN2(category, name, arg1_name, arg1_val, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, \ |
+ category, name, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val) |
#define TRACE_EVENT_BEGIN2(category, name, arg1_name, arg1_val, \ |
arg2_name, arg2_val) \ |
INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, \ |
- category, name, arg1_name, arg1_val, arg2_name, arg2_val, \ |
- TRACE_EVENT_FLAG_NONE) |
+ category, name, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, \ |
+ arg2_name, arg2_val) |
#define TRACE_EVENT_COPY_BEGIN0(category, name) \ |
- TRACE_EVENT_COPY_BEGIN1(category, name, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, \ |
+ category, name, TRACE_EVENT_FLAG_COPY) |
#define TRACE_EVENT_COPY_BEGIN1(category, name, arg1_name, arg1_val) \ |
- TRACE_EVENT_COPY_BEGIN2(category, name, arg1_name, arg1_val, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, \ |
+ category, name, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val) |
#define TRACE_EVENT_COPY_BEGIN2(category, name, arg1_name, arg1_val, \ |
arg2_name, arg2_val) \ |
INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, \ |
- category, name, \ |
- arg1_name, base::debug::TraceValue::ForceCopy(arg1_val), \ |
- arg2_name, base::debug::TraceValue::ForceCopy(arg2_val), \ |
- TRACE_EVENT_FLAG_COPY) |
+ category, name, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, \ |
+ arg2_name, arg2_val) |
// Records a single END event for "name" immediately. If the category |
// is not enabled, then this does nothing. |
// - category and name strings must have application lifetime (statics or |
// literals). They may not include " chars. |
#define TRACE_EVENT_END0(category, name) \ |
- TRACE_EVENT_END1(category, name, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, \ |
+ category, name, TRACE_EVENT_FLAG_NONE) |
#define TRACE_EVENT_END1(category, name, arg1_name, arg1_val) \ |
- TRACE_EVENT_END2(category, name, arg1_name, arg1_val, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, \ |
+ category, name, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val) |
#define TRACE_EVENT_END2(category, name, arg1_name, arg1_val, \ |
arg2_name, arg2_val) \ |
INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, \ |
- category, name, arg1_name, arg1_val, arg2_name, arg2_val, \ |
- TRACE_EVENT_FLAG_NONE) |
+ category, name, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, \ |
+ arg2_name, arg2_val) |
#define TRACE_EVENT_COPY_END0(category, name) \ |
- TRACE_EVENT_COPY_END1(category, name, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, \ |
+ category, name, TRACE_EVENT_FLAG_COPY) |
#define TRACE_EVENT_COPY_END1(category, name, arg1_name, arg1_val) \ |
- TRACE_EVENT_COPY_END2(category, name, arg1_name, arg1_val, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, \ |
+ category, name, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val) |
#define TRACE_EVENT_COPY_END2(category, name, arg1_name, arg1_val, \ |
arg2_name, arg2_val) \ |
INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, \ |
- category, name, \ |
- arg1_name, base::debug::TraceValue::ForceCopy(arg1_val), \ |
- arg2_name, base::debug::TraceValue::ForceCopy(arg2_val), \ |
- TRACE_EVENT_FLAG_COPY) |
+ category, name, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, \ |
+ arg2_name, arg2_val) |
// Time threshold event: |
// Only record the event if the duration is greater than the specified |
@@ -309,15 +362,15 @@ |
// - category and name strings must have application lifetime (statics or |
// literals). They may not include " chars. |
#define TRACE_EVENT_IF_LONGER_THAN0(threshold_us, category, name) \ |
- TRACE_EVENT_IF_LONGER_THAN1(threshold_us, category, name, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD_SCOPED_IF_LONGER_THAN(threshold_us, category, name) |
#define TRACE_EVENT_IF_LONGER_THAN1( \ |
- threshold_us, category, name, arg1_name, arg1_val) \ |
- TRACE_EVENT_IF_LONGER_THAN2(threshold_us, category, name, \ |
- arg1_name, arg1_val, NULL, 0) |
+ threshold_us, category, name, arg1_name, arg1_val) \ |
+ INTERNAL_TRACE_EVENT_ADD_SCOPED_IF_LONGER_THAN( \ |
+ threshold_us, category, name, arg1_name, arg1_val) |
#define TRACE_EVENT_IF_LONGER_THAN2( \ |
threshold_us, category, name, arg1_name, arg1_val, arg2_name, arg2_val) \ |
- INTERNAL_TRACE_EVENT_ADD_SCOPED_IF_LONGER_THAN(threshold_us, \ |
- category, name, arg1_name, arg1_val, arg2_name, arg2_val) |
+ INTERNAL_TRACE_EVENT_ADD_SCOPED_IF_LONGER_THAN( \ |
+ threshold_us, category, name, arg1_name, arg1_val, arg2_name, arg2_val) |
// Records the value of a counter called "name" immediately. Value |
// must be representable as a 32 bit integer. |
@@ -336,14 +389,14 @@ |
#define TRACE_COUNTER2(category, name, value1_name, value1_val, \ |
value2_name, value2_val) \ |
INTERNAL_TRACE_EVENT_ADD_COUNTER( \ |
- category, name, 0, value1_name, value1_val, value2_name, value2_val, \ |
+ category, name, trace_event_internal::kNoEventId, \ |
+ value1_name, value1_val, value2_name, value2_val, \ |
TRACE_EVENT_FLAG_NONE) |
#define TRACE_COPY_COUNTER2(category, name, value1_name, value1_val, \ |
value2_name, value2_val) \ |
INTERNAL_TRACE_EVENT_ADD_COUNTER( \ |
- category, name, 0, \ |
- value1_name, value1_val, \ |
- value2_name, value2_val, \ |
+ category, name, trace_event_internal::kNoEventId, \ |
+ value1_name, value1_val, value2_name, value2_val, \ |
TRACE_EVENT_FLAG_COPY) |
// Records the value of a counter called "name" immediately. Value |
@@ -392,48 +445,54 @@ |
// will be xored with a hash of the process ID so that the same pointer on |
// two different processes will not collide. |
#define TRACE_EVENT_START0(category, name, id) \ |
- TRACE_EVENT_START1(category, name, id, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_START, \ |
+ category, name, id, TRACE_EVENT_FLAG_HAS_ID) |
#define TRACE_EVENT_START1(category, name, id, arg1_name, arg1_val) \ |
- TRACE_EVENT_START2(category, name, id, arg1_name, arg1_val, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_START, \ |
+ category, name, id, TRACE_EVENT_FLAG_HAS_ID, arg1_name, arg1_val) |
#define TRACE_EVENT_START2(category, name, id, arg1_name, arg1_val, \ |
arg2_name, arg2_val) \ |
INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_START, \ |
- category, name, id, arg1_name, arg1_val, arg2_name, arg2_val, \ |
- TRACE_EVENT_FLAG_HAS_ID) |
+ category, name, id, TRACE_EVENT_FLAG_HAS_ID, \ |
+ arg1_name, arg1_val, arg2_name, arg2_val) |
#define TRACE_EVENT_COPY_START0(category, name, id) \ |
- TRACE_EVENT_COPY_START1(category, name, id, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_START, \ |
+ category, name, id, TRACE_EVENT_FLAG_HAS_ID | TRACE_EVENT_FLAG_COPY) |
#define TRACE_EVENT_COPY_START1(category, name, id, arg1_name, arg1_val) \ |
- TRACE_EVENT_COPY_START2(category, name, id, arg1_name, arg1_val, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_START, \ |
+ category, name, id, TRACE_EVENT_FLAG_HAS_ID | TRACE_EVENT_FLAG_COPY, \ |
+ arg1_name, arg1_val) |
#define TRACE_EVENT_COPY_START2(category, name, id, arg1_name, arg1_val, \ |
arg2_name, arg2_val) \ |
INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_START, \ |
- category, name, id, \ |
- arg1_name, base::debug::TraceValue::ForceCopy(arg1_val), \ |
- arg2_name, base::debug::TraceValue::ForceCopy(arg2_val), \ |
- TRACE_EVENT_FLAG_HAS_ID | TRACE_EVENT_FLAG_COPY) |
+ category, name, id, TRACE_EVENT_FLAG_HAS_ID | TRACE_EVENT_FLAG_COPY, \ |
+ arg1_name, arg1_val, arg2_name, arg2_val) |
// Records a single FINISH event for "name" immediately. If the category |
// is not enabled, then this does nothing. |
#define TRACE_EVENT_FINISH0(category, name, id) \ |
- TRACE_EVENT_FINISH1(category, name, id, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FINISH, \ |
+ category, name, id, TRACE_EVENT_FLAG_HAS_ID) |
#define TRACE_EVENT_FINISH1(category, name, id, arg1_name, arg1_val) \ |
- TRACE_EVENT_FINISH2(category, name, id, arg1_name, arg1_val, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FINISH, \ |
+ category, name, id, TRACE_EVENT_FLAG_HAS_ID, arg1_name, arg1_val) |
#define TRACE_EVENT_FINISH2(category, name, id, arg1_name, arg1_val, \ |
arg2_name, arg2_val) \ |
INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FINISH, \ |
- category, name, id, arg1_name, arg1_val, arg2_name, arg2_val, \ |
- TRACE_EVENT_FLAG_HAS_ID) |
+ category, name, id, TRACE_EVENT_FLAG_HAS_ID, \ |
+ arg1_name, arg1_val, arg2_name, arg2_val) |
#define TRACE_EVENT_COPY_FINISH0(category, name, id) \ |
- TRACE_EVENT_COPY_FINISH1(category, name, id, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FINISH, \ |
+ category, name, id, TRACE_EVENT_FLAG_HAS_ID | TRACE_EVENT_FLAG_COPY) |
#define TRACE_EVENT_COPY_FINISH1(category, name, id, arg1_name, arg1_val) \ |
- TRACE_EVENT_COPY_FINISH2(category, name, id, arg1_name, arg1_val, NULL, 0) |
+ INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FINISH, \ |
+ category, name, id, TRACE_EVENT_FLAG_HAS_ID | TRACE_EVENT_FLAG_COPY, \ |
+ arg1_name, arg1_val) |
#define TRACE_EVENT_COPY_FINISH2(category, name, id, arg1_name, arg1_val, \ |
arg2_name, arg2_val) \ |
INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FINISH, \ |
- category, name, id, \ |
- arg1_name, base::debug::TraceValue::ForceCopy(arg1_val), \ |
- arg2_name, base::debug::TraceValue::ForceCopy(arg2_val), \ |
- TRACE_EVENT_FLAG_HAS_ID | TRACE_EVENT_FLAG_COPY) |
+ category, name, id, TRACE_EVENT_FLAG_HAS_ID | TRACE_EVENT_FLAG_COPY, \ |
+ arg1_name, arg1_val, arg2_name, arg2_val) |
// Implementation detail: trace event macros create temporary variables |
@@ -449,23 +508,21 @@ |
// Implementation detail: internal macro to create static category. |
// - ANNOTATE_BENIGN_RACE, see Thread Safety above. |
#define INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category) \ |
- static const base::debug::TraceCategory* \ |
- INTERNAL_TRACE_EVENT_UID(catstatic) = NULL; \ |
+ static const unsigned char* INTERNAL_TRACE_EVENT_UID(catstatic) = NULL; \ |
ANNOTATE_BENIGN_RACE(&INTERNAL_TRACE_EVENT_UID(catstatic), \ |
"trace_event category"); \ |
if (!INTERNAL_TRACE_EVENT_UID(catstatic)) \ |
INTERNAL_TRACE_EVENT_UID(catstatic) = \ |
- base::debug::TraceLog::GetCategory(category); |
+ TRACE_EVENT_API_GET_CATEGORY_ENABLED(category); |
// Implementation detail: internal macro to create static category and add |
// event if the category is enabled. |
-#define INTERNAL_TRACE_EVENT_ADD( \ |
- phase, category, name, arg1_name, arg1_val, arg2_name, arg2_val, flags) \ |
+#define INTERNAL_TRACE_EVENT_ADD(phase, category, name, flags, ...) \ |
INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \ |
- if (INTERNAL_TRACE_EVENT_UID(catstatic)->enabled) { \ |
- base::debug::TraceLog::GetInstance()->AddTraceEvent( \ |
- phase, INTERNAL_TRACE_EVENT_UID(catstatic), \ |
- name, 0, arg1_name, arg1_val, arg2_name, arg2_val, -1, 0, flags); \ |
+ if (*INTERNAL_TRACE_EVENT_UID(catstatic)) { \ |
+ trace_event_internal::AddTraceEvent( \ |
+ phase, INTERNAL_TRACE_EVENT_UID(catstatic), name, \ |
+ trace_event_internal::kNoEventId, flags, ##__VA_ARGS__); \ |
} |
// Implementation detail: internal macro to create static category and |
@@ -473,26 +530,26 @@ |
#define INTERNAL_TRACE_EVENT_ADD_COUNTER( \ |
category, name, id, arg1_name, arg1_val, arg2_name, arg2_val, flags) \ |
INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \ |
- if (INTERNAL_TRACE_EVENT_UID(catstatic)->enabled) { \ |
- base::debug::TraceLog::GetInstance()->AddCounterEvent( \ |
+ if (*INTERNAL_TRACE_EVENT_UID(catstatic)) { \ |
+ TRACE_EVENT_API_ADD_COUNTER_EVENT( \ |
INTERNAL_TRACE_EVENT_UID(catstatic), \ |
- name, id, arg1_name, arg1_val, arg2_name, arg2_val, flags); \ |
+ name, trace_event_internal::TraceID(id).data(), \ |
+ arg1_name, arg1_val, arg2_name, arg2_val, flags); \ |
} |
// Implementation detail: internal macro to create static category and add begin |
// event if the category is enabled. Also adds the end event when the scope |
// ends. |
-#define INTERNAL_TRACE_EVENT_ADD_SCOPED( \ |
- category, name, arg1_name, arg1_val, arg2_name, arg2_val) \ |
+#define INTERNAL_TRACE_EVENT_ADD_SCOPED(category, name, ...) \ |
INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \ |
- base::debug::internal::TraceEndOnScopeClose \ |
+ trace_event_internal::TraceEndOnScopeClose \ |
INTERNAL_TRACE_EVENT_UID(profileScope); \ |
- if (INTERNAL_TRACE_EVENT_UID(catstatic)->enabled) { \ |
- base::debug::TraceLog::GetInstance()->AddTraceEvent( \ |
+ if (*INTERNAL_TRACE_EVENT_UID(catstatic)) { \ |
+ trace_event_internal::AddTraceEvent( \ |
TRACE_EVENT_PHASE_BEGIN, \ |
INTERNAL_TRACE_EVENT_UID(catstatic), \ |
- name, 0, arg1_name, arg1_val, arg2_name, arg2_val, -1, 0, \ |
- TRACE_EVENT_FLAG_NONE); \ |
+ name, trace_event_internal::kNoEventId, \ |
+ TRACE_EVENT_FLAG_NONE, ##__VA_ARGS__); \ |
INTERNAL_TRACE_EVENT_UID(profileScope).Initialize( \ |
INTERNAL_TRACE_EVENT_UID(catstatic), name); \ |
} |
@@ -501,17 +558,17 @@ |
// event if the category is enabled. Also adds the end event when the scope |
// ends. If the elapsed time is < threshold time, the begin/end pair is erased. |
#define INTERNAL_TRACE_EVENT_ADD_SCOPED_IF_LONGER_THAN(threshold, \ |
- category, name, arg1_name, arg1_val, arg2_name, arg2_val) \ |
+ category, name, ...) \ |
INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \ |
- base::debug::internal::TraceEndOnScopeCloseThreshold \ |
+ trace_event_internal::TraceEndOnScopeCloseThreshold \ |
INTERNAL_TRACE_EVENT_UID(profileScope); \ |
- if (INTERNAL_TRACE_EVENT_UID(catstatic)->enabled) { \ |
+ if (*INTERNAL_TRACE_EVENT_UID(catstatic)) { \ |
int INTERNAL_TRACE_EVENT_UID(begin_event_id) = \ |
- base::debug::TraceLog::GetInstance()->AddTraceEvent( \ |
+ trace_event_internal::AddTraceEvent( \ |
TRACE_EVENT_PHASE_BEGIN, \ |
INTERNAL_TRACE_EVENT_UID(catstatic), \ |
- name, 0, arg1_name, arg1_val, arg2_name, arg2_val, -1, 0, \ |
- TRACE_EVENT_FLAG_NONE); \ |
+ name, trace_event_internal::kNoEventId, \ |
+ TRACE_EVENT_FLAG_NONE, ##__VA_ARGS__); \ |
INTERNAL_TRACE_EVENT_UID(profileScope).Initialize( \ |
INTERNAL_TRACE_EVENT_UID(catstatic), name, \ |
INTERNAL_TRACE_EVENT_UID(begin_event_id), threshold); \ |
@@ -519,13 +576,14 @@ |
// Implementation detail: internal macro to create static category and add |
// event if the category is enabled. |
-#define INTERNAL_TRACE_EVENT_ADD_WITH_ID(phase, category, name, id, \ |
- arg1_name, arg1_val, arg2_name, arg2_val, flags) \ |
+#define INTERNAL_TRACE_EVENT_ADD_WITH_ID(phase, category, name, id, flags, \ |
+ ...) \ |
INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \ |
- if (INTERNAL_TRACE_EVENT_UID(catstatic)->enabled) { \ |
- base::debug::TraceLog::GetInstance()->AddTraceEvent( \ |
+ if (*INTERNAL_TRACE_EVENT_UID(catstatic)) { \ |
+ trace_event_internal::AddTraceEvent( \ |
phase, INTERNAL_TRACE_EVENT_UID(catstatic), \ |
- name, id, arg1_name, arg1_val, arg2_name, arg2_val, -1, 0, flags); \ |
+ name, trace_event_internal::TraceID(id).data(), flags, \ |
+ ##__VA_ARGS__); \ |
} |
template <typename Type> |
@@ -537,173 +595,35 @@ class RefCountedString; |
namespace debug { |
-// Categories allow enabling/disabling of streams of trace events |
-struct TraceCategory { |
- const char* name; |
- volatile bool enabled; |
-}; |
+const int kTraceMaxNumArgs = 2; |
-const size_t kTraceMaxNumArgs = 2; |
+// Notes regarding the following definitions: |
+// New values can be added and propagated to third party libraries, but existing |
+// definitions must never be changed, because third party libraries may use old |
+// definitions. |
// Phase indicates the nature of an event entry. E.g. part of a begin/end pair. |
-typedef char TraceEventPhase; |
-#define TRACE_EVENT_PHASE_BEGIN (base::debug::TraceEventPhase('B')) |
-#define TRACE_EVENT_PHASE_END (base::debug::TraceEventPhase('E')) |
-#define TRACE_EVENT_PHASE_INSTANT (base::debug::TraceEventPhase('I')) |
-#define TRACE_EVENT_PHASE_START (base::debug::TraceEventPhase('S')) |
-#define TRACE_EVENT_PHASE_FINISH (base::debug::TraceEventPhase('F')) |
-#define TRACE_EVENT_PHASE_METADATA (base::debug::TraceEventPhase('M')) |
-#define TRACE_EVENT_PHASE_COUNTER (base::debug::TraceEventPhase('C')) |
- |
-typedef uint8 TraceEventFlags; |
-#define TRACE_EVENT_FLAG_NONE (base::debug::TraceEventFlags(0)) |
-#define TRACE_EVENT_FLAG_COPY (base::debug::TraceEventFlags(1<<0)) |
-#define TRACE_EVENT_FLAG_HAS_ID (base::debug::TraceEventFlags(1<<1)) |
- |
-// Simple union of values. This is much lighter weight than base::Value, which |
-// requires dynamic allocation and a vtable. To keep the trace runtime overhead |
-// low, we want constant size storage here. |
-class BASE_EXPORT TraceValue { |
- public: |
- enum Type { |
- TRACE_TYPE_UNDEFINED, |
- TRACE_TYPE_BOOL, |
- TRACE_TYPE_UINT, |
- TRACE_TYPE_INT, |
- TRACE_TYPE_DOUBLE, |
- TRACE_TYPE_POINTER, |
- TRACE_TYPE_STRING, |
- TRACE_TYPE_STATIC_STRING |
- }; |
- |
- TraceValue() : type_(TRACE_TYPE_UNDEFINED) { |
- value_.as_uint = 0ull; |
- } |
- TraceValue(bool rhs) : type_(TRACE_TYPE_BOOL) { |
- value_.as_bool = rhs; |
- } |
- TraceValue(uint64 rhs) : type_(TRACE_TYPE_UINT) { |
- value_.as_uint = rhs; |
- } |
- TraceValue(uint32 rhs) : type_(TRACE_TYPE_UINT) { |
- value_.as_uint = rhs; |
- } |
- TraceValue(uint16 rhs) : type_(TRACE_TYPE_UINT) { |
- value_.as_uint = rhs; |
- } |
- TraceValue(uint8 rhs) : type_(TRACE_TYPE_UINT) { |
- value_.as_uint = rhs; |
- } |
- TraceValue(int64 rhs) : type_(TRACE_TYPE_INT) { |
- value_.as_int = rhs; |
- } |
- TraceValue(int32 rhs) : type_(TRACE_TYPE_INT) { |
- value_.as_int = rhs; |
- } |
- TraceValue(int16 rhs) : type_(TRACE_TYPE_INT) { |
- value_.as_int = rhs; |
- } |
- TraceValue(int8 rhs) : type_(TRACE_TYPE_INT) { |
- value_.as_int = rhs; |
- } |
- TraceValue(double rhs) : type_(TRACE_TYPE_DOUBLE) { |
- value_.as_double = rhs; |
- } |
- TraceValue(const void* rhs) : type_(TRACE_TYPE_POINTER) { |
- value_.as_pointer = rhs; |
- } |
- TraceValue(const std::string& rhs) : type_(TRACE_TYPE_STRING) { |
- value_.as_string = rhs.c_str(); |
- } |
- TraceValue(const char* rhs) : type_(TRACE_TYPE_STATIC_STRING) { |
- value_.as_string = rhs; |
- } |
- |
- static TraceValue StringWithCopy(const char* rhs) { |
- TraceValue value(rhs); |
- if (rhs) |
- value.type_ = TRACE_TYPE_STRING; |
- return value; |
- } |
- |
- static TraceValue ForceCopy(const TraceValue& rhs) { |
- TraceValue value(rhs); |
- if (value.type_ == TRACE_TYPE_STATIC_STRING && value.as_string()) |
- value.type_ = TRACE_TYPE_STRING; |
- return value; |
- } |
- |
- bool is_string() const { |
- return type_ == TRACE_TYPE_STRING || type_ == TRACE_TYPE_STATIC_STRING; |
- } |
- |
- void AppendAsJSON(std::string* out) const; |
- |
- Type type() const { |
- return type_; |
- } |
- uint64 as_uint() const { |
- DCHECK_EQ(TRACE_TYPE_UINT, type_); |
- return value_.as_uint; |
- } |
- bool as_bool() const { |
- DCHECK_EQ(TRACE_TYPE_BOOL, type_); |
- return value_.as_bool; |
- } |
- int64 as_int() const { |
- DCHECK_EQ(TRACE_TYPE_INT, type_); |
- return value_.as_int; |
- } |
- double as_double() const { |
- DCHECK_EQ(TRACE_TYPE_DOUBLE, type_); |
- return value_.as_double; |
- } |
- const void* as_pointer() const { |
- DCHECK_EQ(TRACE_TYPE_POINTER, type_); |
- return value_.as_pointer; |
- } |
- const char* as_string() const { |
- DCHECK(is_string()); |
- return value_.as_string; |
- } |
- const char** as_assignable_string() { |
- DCHECK_EQ(TRACE_TYPE_STRING, type_); |
- return &value_.as_string; |
- } |
- |
- private: |
- union Value { |
- bool as_bool; |
- uint64 as_uint; |
- int64 as_int; |
- double as_double; |
- const void* as_pointer; |
- const char* as_string; |
- }; |
- |
- Type type_; |
- Value value_; |
-}; |
- |
-// TraceID encapsulates an ID that can either be an integer or pointer. Pointers |
-// are mangled with the Process ID so that they are unlikely to collide when the |
-// same pointer is used on different processes. |
-class BASE_EXPORT TraceID { |
- public: |
- TraceID() : data_(0u) {} |
- TraceID(void* rhs); |
- TraceID(unsigned long long rhs) : data_(static_cast<uint64>(rhs)) {} |
- TraceID(unsigned long rhs) : data_(static_cast<uint64>(rhs)) {} |
- TraceID(unsigned int rhs) : data_(static_cast<uint64>(rhs)) {} |
- TraceID(long long rhs) : data_(static_cast<uint64>(rhs)) {} |
- TraceID(long rhs) : data_(static_cast<uint64>(rhs)) {} |
- TraceID(int rhs) : data_(static_cast<uint64>(rhs)) {} |
- |
- uint64 data() const { return data_; } |
- |
- private: |
- uint64 data_; |
-}; |
+#define TRACE_EVENT_PHASE_BEGIN ('B') |
+#define TRACE_EVENT_PHASE_END ('E') |
+#define TRACE_EVENT_PHASE_INSTANT ('I') |
+#define TRACE_EVENT_PHASE_START ('S') |
+#define TRACE_EVENT_PHASE_FINISH ('F') |
+#define TRACE_EVENT_PHASE_METADATA ('M') |
+#define TRACE_EVENT_PHASE_COUNTER ('C') |
+ |
+// Flags for changing the behavior of TRACE_EVENT_API_ADD_TRACE_EVENT. |
+#define TRACE_EVENT_FLAG_NONE (static_cast<unsigned char>(0)) |
+#define TRACE_EVENT_FLAG_COPY (static_cast<unsigned char>(1<<0)) |
+#define TRACE_EVENT_FLAG_HAS_ID (static_cast<unsigned char>(1<<1)) |
+ |
+// Type values for identifying types in the TraceValue union. |
+#define TRACE_VALUE_TYPE_BOOL (static_cast<unsigned char>(1)) |
+#define TRACE_VALUE_TYPE_UINT (static_cast<unsigned char>(2)) |
+#define TRACE_VALUE_TYPE_INT (static_cast<unsigned char>(3)) |
+#define TRACE_VALUE_TYPE_DOUBLE (static_cast<unsigned char>(4)) |
+#define TRACE_VALUE_TYPE_POINTER (static_cast<unsigned char>(5)) |
+#define TRACE_VALUE_TYPE_STRING (static_cast<unsigned char>(6)) |
+#define TRACE_VALUE_TYPE_COPY_STRING (static_cast<unsigned char>(7)) |
// Output records are "Events" and can be obtained via the |
// OutputCallback whenever the tracing system decides to flush. This |
@@ -711,26 +631,29 @@ class BASE_EXPORT TraceID { |
// force it to happen. |
class BASE_EXPORT TraceEvent { |
public: |
+ union TraceValue { |
+ bool as_bool; |
+ unsigned long long as_uint; |
+ long long as_int; |
+ double as_double; |
+ const void* as_pointer; |
+ const char* as_string; |
+ }; |
+ |
TraceEvent(); |
TraceEvent(int thread_id, |
TimeTicks timestamp, |
- TraceEventPhase phase, |
- const TraceCategory* category, |
+ char phase, |
+ const unsigned char* category_enabled, |
const char* name, |
- TraceID id, |
- const char* arg1_name, const TraceValue& arg1_val, |
- const char* arg2_name, const TraceValue& arg2_val, |
- TraceEventFlags flags); |
+ unsigned long long id, |
+ int num_args, |
+ const char** arg_names, |
+ const unsigned char* arg_types, |
+ const unsigned long long* arg_values, |
+ unsigned char flags); |
~TraceEvent(); |
- static char GetPhaseChar(TraceEventPhase phase) { |
- return static_cast<char>(phase); |
- } |
- |
- static TraceEventPhase GetPhase(const char* phase) { |
- return static_cast<TraceEventPhase>(*phase); |
- } |
- |
// Serialize event data to JSON |
static void AppendEventsAsJSON(const std::vector<TraceEvent>& events, |
size_t start, |
@@ -752,15 +675,16 @@ class BASE_EXPORT TraceEvent { |
// Note: these are ordered by size (largest first) for optimal packing. |
TimeTicks timestamp_; |
// id_ can be used to store phase-specific data. |
- TraceID id_; |
+ unsigned long long id_; |
TraceValue arg_values_[kTraceMaxNumArgs]; |
const char* arg_names_[kTraceMaxNumArgs]; |
- const TraceCategory* category_; |
+ const unsigned char* category_enabled_; |
const char* name_; |
scoped_refptr<base::RefCountedString> parameter_copy_storage_; |
int thread_id_; |
- TraceEventPhase phase_; |
- TraceEventFlags flags_; |
+ char phase_; |
+ unsigned char flags_; |
+ unsigned char arg_types_[kTraceMaxNumArgs]; |
}; |
@@ -870,7 +794,8 @@ class BASE_EXPORT TraceLog { |
void Flush(); |
// Called by TRACE_EVENT* macros, don't call this directly. |
- static const TraceCategory* GetCategory(const char* name); |
+ static const unsigned char* GetCategoryEnabled(const char* name); |
+ static const char* GetCategoryName(const unsigned char* category_enabled); |
// Called by TRACE_EVENT* macros, don't call this directly. |
// Returns the index in the internal vector of the event if it was added, or |
@@ -880,36 +805,41 @@ class BASE_EXPORT TraceLog { |
// is less than the threshold, the begin/end event pair is dropped. |
// If |copy| is set, |name|, |arg_name1| and |arg_name2| will be deep copied |
// into the event; see "Memory scoping note" and TRACE_EVENT_COPY_XXX above. |
- int AddTraceEvent(TraceEventPhase phase, |
- const TraceCategory* category, |
+ int AddTraceEvent(char phase, |
+ const unsigned char* category_enabled, |
const char* name, |
- TraceID id, |
- const char* arg1_name, TraceValue arg1_val, |
- const char* arg2_name, TraceValue arg2_val, |
+ unsigned long long id, |
+ int num_args, |
+ const char** arg_names, |
+ const unsigned char* arg_types, |
+ const unsigned long long* arg_values, |
int threshold_begin_id, |
- int64 threshold, |
- TraceEventFlags flags); |
- static void AddTraceEventEtw(TraceEventPhase phase, |
+ long long threshold, |
+ unsigned char flags); |
+ static void AddTraceEventEtw(char phase, |
const char* name, |
const void* id, |
const char* extra); |
- static void AddTraceEventEtw(TraceEventPhase phase, |
+ static void AddTraceEventEtw(char phase, |
const char* name, |
const void* id, |
const std::string& extra); |
// A wrapper around AddTraceEvent used by TRACE_COUNTERx macros |
// that allows only integer values for the counters. |
- int AddCounterEvent(const TraceCategory* category, |
- const char* name, |
- TraceID id, |
- const char* arg1_name, int32 arg1_val, |
- const char* arg2_name, int32 arg2_val, |
- TraceEventFlags flags); |
- |
- // Mangle |id| with a hash based on the process ID so that if |id| occurs on |
+ void AddCounterEvent(const unsigned char* category_enabled, |
+ const char* name, |
+ unsigned long long id, |
+ const char* arg1_name, int arg1_val, |
+ const char* arg2_name, int arg2_val, |
+ unsigned char flags); |
+ |
+ // Mangle |ptr| with a hash based on the process ID so that if |ptr| occurs on |
// more than one process, it will not collide. |
- uint64 GetIntraProcessID(uint64 id) const { return id ^ process_id_hash_; } |
+ unsigned long long GetInterProcessID(void* ptr) const { |
+ return static_cast<unsigned long long>(reinterpret_cast<uintptr_t>(ptr)) ^ |
+ process_id_hash_; |
+ } |
int process_id() const { return process_id_; } |
@@ -937,7 +867,7 @@ class BASE_EXPORT TraceLog { |
TraceLog(); |
~TraceLog(); |
- const TraceCategory* GetCategoryInternal(const char* name); |
+ const unsigned char* GetCategoryEnabledInternal(const char* name); |
void AddThreadNameMetadataEvents(); |
void AddClockSyncMetadataEvents(); |
@@ -954,14 +884,180 @@ class BASE_EXPORT TraceLog { |
base::hash_map<int, std::string> thread_names_; |
// XORed with TraceID to make it unlikely to collide with other processes. |
- uint64 process_id_hash_; |
+ unsigned long long process_id_hash_; |
int process_id_; |
DISALLOW_COPY_AND_ASSIGN(TraceLog); |
}; |
-namespace internal { |
+} // namespace debug |
+} // namespace base |
+ |
+namespace trace_event_internal { |
+ |
+// Specify these values when the corresponding argument of AddTraceEvent is not |
+// used. |
+const int kZeroNumArgs = 0; |
+const int kNoThreshholdBeginId = -1; |
+const long long kNoThresholdValue = 0; |
+const unsigned long long kNoEventId = 0; |
+ |
+// TraceID encapsulates an ID that can either be an integer or pointer. Pointers |
+// are mangled with the Process ID so that they are unlikely to collide when the |
+// same pointer is used on different processes. |
+class BASE_EXPORT TraceID { |
+ public: |
+ explicit TraceID(void* rhs) : |
+ data_(TRACE_EVENT_API_GET_ID_FROM_POINTER(rhs)) {} |
+ explicit TraceID(unsigned long long rhs) : data_(rhs) {} |
+ explicit TraceID(unsigned long rhs) : data_(rhs) {} |
+ explicit TraceID(unsigned int rhs) : data_(rhs) {} |
+ explicit TraceID(unsigned short rhs) : data_(rhs) {} |
+ explicit TraceID(unsigned char rhs) : data_(rhs) {} |
+ explicit TraceID(long long rhs) : |
+ data_(static_cast<unsigned long long>(rhs)) {} |
+ explicit TraceID(long rhs) : data_(static_cast<unsigned long long>(rhs)) {} |
+ explicit TraceID(int rhs) : data_(static_cast<unsigned long long>(rhs)) {} |
+ explicit TraceID(short rhs) : data_(static_cast<unsigned long long>(rhs)) {} |
+ explicit TraceID(signed char rhs) : |
+ data_(static_cast<unsigned long long>(rhs)) {} |
+ |
+ unsigned long long data() const { return data_; } |
+ |
+ private: |
+ unsigned long long data_; |
+}; |
+ |
+// Simple union to store various types as unsigned long long. |
+union TraceValueUnion { |
+ bool as_bool; |
+ unsigned long long as_uint; |
+ long long as_int; |
+ double as_double; |
+ const void* as_pointer; |
+ const char* as_string; |
+}; |
+ |
+// Simple container for const char* that should be copied instead of retained. |
+class TraceStringWithCopy { |
+ public: |
+ explicit TraceStringWithCopy(const char* str) : str_(str) {} |
+ operator const char* () const { return str_; } |
+ private: |
+ const char* str_; |
+}; |
+ |
+// Define SetTraceValue for each allowed type. It stores the type and |
+// value in the return arguments. This allows this API to avoid declaring any |
+// structures so that it is portable to third_party libraries. |
+#define INTERNAL_DECLARE_SET_TRACE_VALUE(actual_type, \ |
+ union_member, \ |
+ value_type_id) \ |
+ static inline void SetTraceValue(actual_type arg, \ |
+ unsigned char* type, \ |
+ unsigned long long* value) { \ |
+ TraceValueUnion type_value; \ |
+ type_value.union_member = arg; \ |
+ *type = value_type_id; \ |
+ *value = type_value.as_uint; \ |
+ } |
+// Simpler form for int types that can be safely casted. |
+#define INTERNAL_DECLARE_SET_TRACE_VALUE_INT(actual_type, \ |
+ value_type_id) \ |
+ static inline void SetTraceValue(actual_type arg, \ |
+ unsigned char* type, \ |
+ unsigned long long* value) { \ |
+ *type = value_type_id; \ |
+ *value = static_cast<unsigned long long>(arg); \ |
+ } |
+ |
+INTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned long long, TRACE_VALUE_TYPE_UINT) |
+INTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned int, TRACE_VALUE_TYPE_UINT) |
+INTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned short, TRACE_VALUE_TYPE_UINT) |
+INTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned char, TRACE_VALUE_TYPE_UINT) |
+INTERNAL_DECLARE_SET_TRACE_VALUE_INT(long long, TRACE_VALUE_TYPE_INT) |
+INTERNAL_DECLARE_SET_TRACE_VALUE_INT(int, TRACE_VALUE_TYPE_INT) |
+INTERNAL_DECLARE_SET_TRACE_VALUE_INT(short, TRACE_VALUE_TYPE_INT) |
+INTERNAL_DECLARE_SET_TRACE_VALUE_INT(signed char, TRACE_VALUE_TYPE_INT) |
+INTERNAL_DECLARE_SET_TRACE_VALUE(bool, as_bool, TRACE_VALUE_TYPE_BOOL) |
+INTERNAL_DECLARE_SET_TRACE_VALUE(double, as_double, TRACE_VALUE_TYPE_DOUBLE) |
+INTERNAL_DECLARE_SET_TRACE_VALUE(const void*, as_pointer, |
+ TRACE_VALUE_TYPE_POINTER) |
+INTERNAL_DECLARE_SET_TRACE_VALUE(const char*, as_string, |
+ TRACE_VALUE_TYPE_STRING) |
+INTERNAL_DECLARE_SET_TRACE_VALUE(const TraceStringWithCopy&, as_string, |
+ TRACE_VALUE_TYPE_COPY_STRING) |
+ |
+#undef INTERNAL_DECLARE_SET_TRACE_VALUE |
+#undef INTERNAL_DECLARE_SET_TRACE_VALUE_INT |
+ |
+// std::string version of SetTraceValue so that trace arguments can be strings. |
+static inline void SetTraceValue(const std::string& arg, |
+ unsigned char* type, |
+ unsigned long long* value) { |
+ TraceValueUnion type_value; |
+ type_value.as_string = arg.c_str(); |
+ *type = TRACE_VALUE_TYPE_COPY_STRING; |
+ *value = type_value.as_uint; |
+} |
+ |
+// These AddTraceEvent template functions are defined here instead of in the |
+// macro, because the arg_values could be temporary objects, such as |
+// std::string. In order to store pointers to the internal c_str and pass |
+// through to the tracing API, the arg_values must live throughout |
+// these procedures. |
+ |
+static inline int AddTraceEvent(char phase, |
+ const unsigned char* category_enabled, |
+ const char* name, |
+ unsigned long long id, |
+ unsigned char flags) { |
+ return TRACE_EVENT_API_ADD_TRACE_EVENT( |
+ phase, category_enabled, name, id, |
+ kZeroNumArgs, NULL, NULL, NULL, |
+ kNoThreshholdBeginId, kNoThresholdValue, flags); |
+} |
+ |
+template<class ARG1_TYPE> |
+static inline int AddTraceEvent(char phase, |
+ const unsigned char* category_enabled, |
+ const char* name, |
+ unsigned long long id, |
+ unsigned char flags, |
+ const char* arg1_name, |
+ const ARG1_TYPE& arg1_val) { |
+ const int num_args = 1; |
+ unsigned char arg_types[1]; |
+ unsigned long long arg_values[1]; |
+ SetTraceValue(arg1_val, &arg_types[0], &arg_values[0]); |
+ return TRACE_EVENT_API_ADD_TRACE_EVENT( |
+ phase, category_enabled, name, id, |
+ num_args, &arg1_name, arg_types, arg_values, |
+ kNoThreshholdBeginId, kNoThresholdValue, flags); |
+} |
+ |
+template<class ARG1_TYPE, class ARG2_TYPE> |
+static inline int AddTraceEvent(char phase, |
+ const unsigned char* category_enabled, |
+ const char* name, |
+ unsigned long long id, |
+ unsigned char flags, |
+ const char* arg1_name, |
+ const ARG1_TYPE& arg1_val, |
+ const char* arg2_name, |
+ const ARG2_TYPE& arg2_val) { |
+ const int num_args = 2; |
+ const char* arg_names[2] = { arg1_name, arg2_name }; |
+ unsigned char arg_types[2]; |
+ unsigned long long arg_values[2]; |
+ SetTraceValue(arg1_val, &arg_types[0], &arg_values[0]); |
+ SetTraceValue(arg2_val, &arg_types[1], &arg_values[1]); |
+ return TRACE_EVENT_API_ADD_TRACE_EVENT( |
+ phase, category_enabled, name, id, |
+ num_args, arg_names, arg_types, arg_values, |
+ kNoThreshholdBeginId, kNoThresholdValue, flags); |
+} |
// Used by TRACE_EVENTx macro. Do not use directly. |
class BASE_EXPORT TraceEndOnScopeClose { |
@@ -973,7 +1069,7 @@ class BASE_EXPORT TraceEndOnScopeClose { |
AddEventIfEnabled(); |
} |
- void Initialize(const TraceCategory* category, |
+ void Initialize(const unsigned char* category_enabled, |
const char* name); |
private: |
@@ -986,7 +1082,7 @@ class BASE_EXPORT TraceEndOnScopeClose { |
// members of this class instead, compiler warnings occur about potential |
// uninitialized accesses. |
struct Data { |
- const TraceCategory* category; |
+ const unsigned char* category_enabled; |
const char* name; |
}; |
Data* p_data_; |
@@ -1005,10 +1101,10 @@ class BASE_EXPORT TraceEndOnScopeCloseThreshold { |
// Called by macros only when tracing is enabled at the point when the begin |
// event is added. |
- void Initialize(const TraceCategory* category, |
+ void Initialize(const unsigned char* category_enabled, |
const char* name, |
int threshold_begin_id, |
- int64 threshold); |
+ long long threshold); |
private: |
// Add the end event if the category is still enabled. |
@@ -1020,8 +1116,8 @@ class BASE_EXPORT TraceEndOnScopeCloseThreshold { |
// members of this class instead, compiler warnings occur about potential |
// uninitialized accesses. |
struct Data { |
- int64 threshold; |
- const TraceCategory* category; |
+ long long threshold; |
+ const unsigned char* category_enabled; |
const char* name; |
int threshold_begin_id; |
}; |
@@ -1029,9 +1125,6 @@ class BASE_EXPORT TraceEndOnScopeCloseThreshold { |
Data data_; |
}; |
-} // namespace internal |
- |
-} // namespace debug |
-} // namespace base |
+} // namespace trace_event_internal |
#endif // BASE_DEBUG_TRACE_EVENT_H_ |