Index: base/debug/trace_event.h |
diff --git a/base/debug/trace_event.h b/base/debug/trace_event.h |
index 58bd02370bff9bbefb4f02c1aa5c4535d33112b4..9f9bde8890cebe48af3810254d0a44ead69b2f5c 100644 |
--- a/base/debug/trace_event.h |
+++ b/base/debug/trace_event.h |
@@ -265,6 +265,23 @@ |
category, name, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, \ |
arg2_name, arg2_val) |
+// Similar to TRACE_EVENT_BEGINx but with a custom |at| timestamp provided. |
+// - |id| is used to match the _BEGIN event with the _END event. |
+// Events are considered to match if their category, name and id values all |
+// match. |id| must either be a pointer or an integer value up to 64 bits. If |
+// it's a pointer, the bits 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_BEGIN_WITH_ID_TID_AND_TIMESTAMP0(category, \ |
+ name, id, tid, ts) \ |
+ INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ |
+ TRACE_EVENT_PHASE_ASYNC_BEGIN, category, name, id, tid, ts, \ |
+ TRACE_EVENT_FLAG_NONE) |
+#define TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0( \ |
+ category, name, id, tid, ts) \ |
+ INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ |
+ TRACE_EVENT_PHASE_ASYNC_BEGIN, category, name, id, tid, ts, \ |
+ TRACE_EVENT_FLAG_COPY) |
+ |
// 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 |
@@ -292,6 +309,23 @@ |
category, name, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, \ |
arg2_name, arg2_val) |
+// Similar to TRACE_EVENT_ENDx but with a custom |at| timestamp provided. |
+// - |id| is used to match the _BEGIN event with the _END event. |
+// Events are considered to match if their category, name and id values all |
+// match. |id| must either be a pointer or an integer value up to 64 bits. If |
+// it's a pointer, the bits 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_END_WITH_ID_TID_AND_TIMESTAMP0(category, \ |
+ name, id, tid, ts) \ |
+ INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ |
+ TRACE_EVENT_PHASE_ASYNC_END, category, name, id, tid, ts, \ |
+ TRACE_EVENT_FLAG_NONE) |
+#define TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0( \ |
+ category, name, id, tid, ts) \ |
+ INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ |
+ TRACE_EVENT_PHASE_ASYNC_END, category, name, id, tid, ts, \ |
+ TRACE_EVENT_FLAG_COPY) |
+ |
// Records the value of a counter called "name" immediately. Value |
// must be representable as a 32 bit integer. |
// - category and name strings must have application lifetime (statics or |
@@ -561,12 +595,15 @@ |
#define TRACE_EVENT_API_GET_CATEGORY_ENABLED \ |
base::debug::TraceLog::GetCategoryEnabled |
-// Add a trace event to the platform tracing system. |
-// void TRACE_EVENT_API_ADD_TRACE_EVENT( |
+// Add a trace event to the platform tracing system. Returns thresholdBeginId |
+// for use in a corresponding end TRACE_EVENT_API_ADD_TRACE_EVENT call. |
+// int TRACE_EVENT_API_ADD_TRACE_EVENT( |
// char phase, |
// const unsigned char* category_enabled, |
// const char* name, |
// unsigned long long id, |
+// int thread_id, |
+// int64 timestamp, |
// int num_args, |
// const char** arg_names, |
// const unsigned char* arg_types, |
@@ -650,6 +687,23 @@ |
} \ |
} while (0) |
+// Implementation detail: internal macro to create static category and add |
+// event if the category is enabled. |
+#define INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(phase, category, \ |
+ name, id, tid, ts, flags, ...) \ |
+ do { \ |
+ INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \ |
+ if (*INTERNAL_TRACE_EVENT_UID(catstatic)) { \ |
+ unsigned char trace_event_flags = flags | TRACE_EVENT_FLAG_HAS_ID; \ |
+ trace_event_internal::TraceID trace_event_trace_id( \ |
+ id, &trace_event_flags); \ |
+ trace_event_internal::AddTraceEvent( \ |
+ phase, INTERNAL_TRACE_EVENT_UID(catstatic), \ |
+ name, trace_event_trace_id.data(), tid, ts, \ |
+ trace_event_flags, ##__VA_ARGS__); \ |
+ } \ |
+ } while (0) |
+ |
// 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 |
@@ -836,44 +890,78 @@ static inline void SetTraceValue(const std::string& arg, |
// these procedures. |
static inline void AddTraceEvent(char phase, |
- const unsigned char* category_enabled, |
- const char* name, |
- unsigned long long id, |
- unsigned char flags) { |
+ const unsigned char* category_enabled, |
+ const char* name, |
+ unsigned long long id, |
+ int thread_id, |
+ int64 timestamp, |
+ unsigned char flags) { |
TRACE_EVENT_API_ADD_TRACE_EVENT( |
- phase, category_enabled, name, id, |
+ phase, category_enabled, name, id, thread_id, timestamp, |
kZeroNumArgs, NULL, NULL, NULL, |
flags); |
} |
+static inline void AddTraceEvent(char phase, |
+ const unsigned char* category_enabled, |
+ const char* name, |
+ unsigned long long id, |
+ unsigned char flags) { |
+ int thread_id = static_cast<int>(base::PlatformThread::CurrentId()); |
+ base::TimeTicks now = base::TimeTicks::NowFromSystemTraceTime() - |
nduca
2012/12/20 20:19:27
Can we take off the TimeOffset inside the TraceLog
dsinclair
2013/01/28 16:45:07
Done.
|
+ base::debug::TraceLog::GetInstance()->GetTimeOffset(); |
+ AddTraceEvent(phase, category_enabled, name, id, thread_id, |
+ now.ToInternalValue(), flags); |
+} |
+ |
template<class ARG1_TYPE> |
static inline void 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 unsigned char* category_enabled, |
+ const char* name, |
+ unsigned long long id, |
+ int thread_id, |
+ int64 timestamp, |
+ 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]); |
TRACE_EVENT_API_ADD_TRACE_EVENT( |
- phase, category_enabled, name, id, |
+ phase, category_enabled, name, id, thread_id, timestamp, |
num_args, &arg1_name, arg_types, arg_values, |
flags); |
} |
+template<class ARG1_TYPE> |
+static inline void 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) { |
+ int thread_id = static_cast<int>(base::PlatformThread::CurrentId()); |
+ base::TimeTicks now = base::TimeTicks::NowFromSystemTraceTime() - |
+ base::debug::TraceLog::GetInstance()->GetTimeOffset(); |
+ AddTraceEvent(phase, category_enabled, name, id, thread_id, |
+ now.ToInternalValue(), flags, |
+ arg1_name, arg1_val); |
+} |
+ |
template<class ARG1_TYPE, class ARG2_TYPE> |
static inline void 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 unsigned char* category_enabled, |
+ const char* name, |
+ unsigned long long id, |
+ int thread_id, |
+ int64 timestamp, |
+ 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]; |
@@ -881,11 +969,29 @@ static inline void AddTraceEvent(char phase, |
SetTraceValue(arg1_val, &arg_types[0], &arg_values[0]); |
SetTraceValue(arg2_val, &arg_types[1], &arg_values[1]); |
TRACE_EVENT_API_ADD_TRACE_EVENT( |
- phase, category_enabled, name, id, |
+ phase, category_enabled, name, id, thread_id, timestamp, |
num_args, arg_names, arg_types, arg_values, |
flags); |
} |
+template<class ARG1_TYPE, class ARG2_TYPE> |
+static inline void 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) { |
+ int thread_id = static_cast<int>(base::PlatformThread::CurrentId()); |
+ base::TimeTicks now = base::TimeTicks::NowFromSystemTraceTime() - |
+ base::debug::TraceLog::GetInstance()->GetTimeOffset(); |
+ AddTraceEvent(phase, category_enabled, name, id, thread_id, |
+ now.ToInternalValue(), flags, |
+ arg1_name, arg1_val, arg2_name, arg2_val); |
+} |
+ |
// Used by TRACE_EVENTx macro. Do not use directly. |
class BASE_EXPORT TraceEndOnScopeClose { |
public: |