summaryrefslogtreecommitdiffstats
path: root/base
diff options
context:
space:
mode:
authorchiniforooshan <chiniforooshan@chromium.org>2016-02-01 11:19:39 -0800
committerCommit bot <commit-bot@chromium.org>2016-02-01 19:20:50 +0000
commit12827b68174c363351b05a8e7f7c29e1d9c0c01d (patch)
tree5487a7ad80c44b2fa096a68dc4b6c838b332ef29 /base
parent9b785ed1bb9c7f1630f6201a485839e40eb9dc86 (diff)
downloadchromium_src-12827b68174c363351b05a8e7f7c29e1d9c0c01d.zip
chromium_src-12827b68174c363351b05a8e7f7c29e1d9c0c01d.tar.gz
chromium_src-12827b68174c363351b05a8e7f7c29e1d9c0c01d.tar.bz2
Add Scopes to Trace IDs
This enables us to us scoped IDs in tracing without doubling the number of macros. Design doc: https://docs.google.com/document/d/1ODGoUwjcyiM2RwD8OD_gpRCxkBubcKArA8_n3W43HAY/edit?usp=sharing BUG=579112 Review URL: https://codereview.chromium.org/1487793002 Cr-Commit-Position: refs/heads/master@{#372718}
Diffstat (limited to 'base')
-rw-r--r--base/trace_event/memory_dump_manager.cc4
-rw-r--r--base/trace_event/trace_event.h243
-rw-r--r--base/trace_event/trace_event_impl.cc12
-rw-r--r--base/trace_event/trace_event_impl.h5
-rw-r--r--base/trace_event/trace_event_unittest.cc66
-rw-r--r--base/trace_event/trace_log.cc24
-rw-r--r--base/trace_event/trace_log.h6
-rw-r--r--base/trace_event/trace_sampling_thread.cc6
8 files changed, 251 insertions, 115 deletions
diff --git a/base/trace_event/memory_dump_manager.cc b/base/trace_event/memory_dump_manager.cc
index cb59448..a549202 100644
--- a/base/trace_event/memory_dump_manager.cc
+++ b/base/trace_event/memory_dump_manager.cc
@@ -20,6 +20,7 @@
#include "base/trace_event/memory_dump_provider.h"
#include "base/trace_event/memory_dump_session_state.h"
#include "base/trace_event/process_memory_dump.h"
+#include "base/trace_event/trace_event.h"
#include "base/trace_event/trace_event_argument.h"
#include "build/build_config.h"
@@ -493,7 +494,8 @@ void MemoryDumpManager::FinalizeDumpAndAddToTrace(
TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_PROCESS_ID(
TRACE_EVENT_PHASE_MEMORY_DUMP,
TraceLog::GetCategoryGroupEnabled(kTraceCategory), event_name,
- dump_guid, pid, kTraceEventNumArgs, kTraceEventArgNames,
+ trace_event_internal::kGlobalScope, dump_guid, pid,
+ kTraceEventNumArgs, kTraceEventArgNames,
kTraceEventArgTypes, nullptr /* arg_values */, &event_value,
TRACE_EVENT_FLAG_HAS_ID);
}
diff --git a/base/trace_event/trace_event.h b/base/trace_event/trace_event.h
index a9a92d4..e9507f7 100644
--- a/base/trace_event/trace_event.h
+++ b/base/trace_event/trace_event.h
@@ -37,6 +37,11 @@
#define TRACE_ID_DONT_MANGLE(id) \
trace_event_internal::TraceID::DontMangle(id)
+// By default, trace IDs are eventually converted to a single 64-bit number. Use
+// this macro to add a scope string.
+#define TRACE_ID_WITH_SCOPE(scope, id) \
+ trace_event_internal::TraceID::WithScope(scope, id)
+
// Sets the current sample state to the given category and name (both must be
// constant strings). These states are intended for a sampling profiler.
// Implementation note: we store category and name together because we don't
@@ -99,6 +104,7 @@
// char phase,
// const unsigned char* category_group_enabled,
// const char* name,
+// const char* scope,
// unsigned long long id,
// int num_args,
// const char** arg_names,
@@ -116,6 +122,7 @@
// char phase,
// const unsigned char* category_group_enabled,
// const char* name,
+// const char* scope,
// unsigned long long id,
// unsigned long long bind_id,
// int num_args,
@@ -135,6 +142,7 @@
// char phase,
// const unsigned char* category_group_enabled,
// const char* name,
+// const char* scope,
// unsigned long long id,
// int process_id,
// int num_args,
@@ -153,6 +161,7 @@
// char phase,
// const unsigned char* category_group_enabled,
// const char* name,
+// const char* scope,
// unsigned long long id,
// int thread_id,
// const TimeTicks& timestamp,
@@ -244,8 +253,8 @@ TRACE_EVENT_API_CLASS_EXPORT extern \
if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \
trace_event_internal::AddTraceEvent( \
phase, INTERNAL_TRACE_EVENT_UID(category_group_enabled), name, \
- trace_event_internal::kNoId, flags, \
- trace_event_internal::kNoId, ##__VA_ARGS__); \
+ trace_event_internal::kGlobalScope, trace_event_internal::kNoId, \
+ flags, trace_event_internal::kNoId, ##__VA_ARGS__); \
} \
} while (0)
@@ -260,8 +269,9 @@ TRACE_EVENT_API_CLASS_EXPORT extern \
trace_event_internal::AddTraceEvent( \
TRACE_EVENT_PHASE_COMPLETE, \
INTERNAL_TRACE_EVENT_UID(category_group_enabled), name, \
- trace_event_internal::kNoId, TRACE_EVENT_FLAG_NONE, \
- trace_event_internal::kNoId, ##__VA_ARGS__); \
+ trace_event_internal::kGlobalScope, trace_event_internal::kNoId, \
+ TRACE_EVENT_FLAG_NONE, trace_event_internal::kNoId, \
+ ##__VA_ARGS__); \
INTERNAL_TRACE_EVENT_UID(tracer).Initialize( \
INTERNAL_TRACE_EVENT_UID(category_group_enabled), name, h); \
}
@@ -278,8 +288,8 @@ TRACE_EVENT_API_CLASS_EXPORT extern \
trace_event_internal::AddTraceEvent( \
TRACE_EVENT_PHASE_COMPLETE, \
INTERNAL_TRACE_EVENT_UID(category_group_enabled), name, \
- trace_event_internal::kNoId, trace_event_flags, \
- trace_event_bind_id.data(), ##__VA_ARGS__); \
+ trace_event_internal::kGlobalScope, trace_event_internal::kNoId, \
+ trace_event_flags, trace_event_bind_id.raw_id(), ##__VA_ARGS__); \
INTERNAL_TRACE_EVENT_UID(tracer).Initialize( \
INTERNAL_TRACE_EVENT_UID(category_group_enabled), name, h); \
}
@@ -296,8 +306,8 @@ TRACE_EVENT_API_CLASS_EXPORT extern \
id, &trace_event_flags); \
trace_event_internal::AddTraceEvent( \
phase, INTERNAL_TRACE_EVENT_UID(category_group_enabled), \
- name, trace_event_trace_id.data(), trace_event_flags, \
- trace_event_internal::kNoId, ##__VA_ARGS__); \
+ name, trace_event_trace_id.scope(), trace_event_trace_id.raw_id(), \
+ trace_event_flags, trace_event_internal::kNoId, ##__VA_ARGS__); \
} \
} while (0)
@@ -310,7 +320,8 @@ TRACE_EVENT_API_CLASS_EXPORT extern \
if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \
trace_event_internal::AddTraceEventWithThreadIdAndTimestamp( \
phase, INTERNAL_TRACE_EVENT_UID(category_group_enabled), name, \
- trace_event_internal::kNoId, TRACE_EVENT_API_CURRENT_THREAD_ID, \
+ trace_event_internal::kGlobalScope, trace_event_internal::kNoId, \
+ TRACE_EVENT_API_CURRENT_THREAD_ID, \
base::TimeTicks::FromInternalValue(timestamp), \
flags | TRACE_EVENT_FLAG_EXPLICIT_TIMESTAMP, \
trace_event_internal::kNoId, ##__VA_ARGS__); \
@@ -329,8 +340,8 @@ TRACE_EVENT_API_CLASS_EXPORT extern \
&trace_event_flags); \
trace_event_internal::AddTraceEventWithThreadIdAndTimestamp( \
phase, INTERNAL_TRACE_EVENT_UID(category_group_enabled), name, \
- trace_event_trace_id.data(), thread_id, \
- base::TimeTicks::FromInternalValue(timestamp), \
+ trace_event_trace_id.scope(), trace_event_trace_id.raw_id(), \
+ thread_id, base::TimeTicks::FromInternalValue(timestamp), \
trace_event_flags | TRACE_EVENT_FLAG_EXPLICIT_TIMESTAMP, \
trace_event_internal::kNoId, ##__VA_ARGS__); \
} \
@@ -347,6 +358,7 @@ namespace trace_event_internal {
// Specify these values when the corresponding argument of AddTraceEvent is not
// used.
const int kZeroNumArgs = 0;
+const std::nullptr_t kGlobalScope = nullptr;
const unsigned long long kNoId = 0;
// TraceID encapsulates an ID that can either be an integer or pointer. Pointers
@@ -354,87 +366,112 @@ const unsigned long long kNoId = 0;
// collide when the same pointer is used on different processes.
class TraceID {
public:
+ class WithScope {
+ public:
+ WithScope(const char* scope, unsigned long long raw_id)
+ : scope_(scope), raw_id_(raw_id) {}
+ unsigned long long raw_id() const { return raw_id_; }
+ const char* scope() const { return scope_; }
+ private:
+ const char* scope_ = nullptr;
+ unsigned long long raw_id_;
+ };
+
class DontMangle {
public:
- explicit DontMangle(const void* id)
- : data_(static_cast<unsigned long long>(
- reinterpret_cast<uintptr_t>(id))) {}
- explicit DontMangle(unsigned long long id) : data_(id) {}
- explicit DontMangle(unsigned long id) : data_(id) {}
- explicit DontMangle(unsigned int id) : data_(id) {}
- explicit DontMangle(unsigned short id) : data_(id) {}
- explicit DontMangle(unsigned char id) : data_(id) {}
- explicit DontMangle(long long id)
- : data_(static_cast<unsigned long long>(id)) {}
- explicit DontMangle(long id)
- : data_(static_cast<unsigned long long>(id)) {}
- explicit DontMangle(int id)
- : data_(static_cast<unsigned long long>(id)) {}
- explicit DontMangle(short id)
- : data_(static_cast<unsigned long long>(id)) {}
- explicit DontMangle(signed char id)
- : data_(static_cast<unsigned long long>(id)) {}
- unsigned long long data() const { return data_; }
+ explicit DontMangle(const void* raw_id)
+ : raw_id_(static_cast<unsigned long long>(
+ reinterpret_cast<uintptr_t>(raw_id))) {}
+ explicit DontMangle(unsigned long long raw_id) : raw_id_(raw_id) {}
+ explicit DontMangle(unsigned long raw_id) : raw_id_(raw_id) {}
+ explicit DontMangle(unsigned int raw_id) : raw_id_(raw_id) {}
+ explicit DontMangle(unsigned short raw_id) : raw_id_(raw_id) {}
+ explicit DontMangle(unsigned char raw_id) : raw_id_(raw_id) {}
+ explicit DontMangle(long long raw_id)
+ : raw_id_(static_cast<unsigned long long>(raw_id)) {}
+ explicit DontMangle(long raw_id)
+ : raw_id_(static_cast<unsigned long long>(raw_id)) {}
+ explicit DontMangle(int raw_id)
+ : raw_id_(static_cast<unsigned long long>(raw_id)) {}
+ explicit DontMangle(short raw_id)
+ : raw_id_(static_cast<unsigned long long>(raw_id)) {}
+ explicit DontMangle(signed char raw_id)
+ : raw_id_(static_cast<unsigned long long>(raw_id)) {}
+ explicit DontMangle(WithScope scoped_id)
+ : scope_(scoped_id.scope()), raw_id_(scoped_id.raw_id()) {}
+ const char* scope() const { return scope_; }
+ unsigned long long raw_id() const { return raw_id_; }
private:
- unsigned long long data_;
+ const char* scope_ = nullptr;
+ unsigned long long raw_id_;
};
class ForceMangle {
public:
- explicit ForceMangle(unsigned long long id) : data_(id) {}
- explicit ForceMangle(unsigned long id) : data_(id) {}
- explicit ForceMangle(unsigned int id) : data_(id) {}
- explicit ForceMangle(unsigned short id) : data_(id) {}
- explicit ForceMangle(unsigned char id) : data_(id) {}
- explicit ForceMangle(long long id)
- : data_(static_cast<unsigned long long>(id)) {}
- explicit ForceMangle(long id)
- : data_(static_cast<unsigned long long>(id)) {}
- explicit ForceMangle(int id)
- : data_(static_cast<unsigned long long>(id)) {}
- explicit ForceMangle(short id)
- : data_(static_cast<unsigned long long>(id)) {}
- explicit ForceMangle(signed char id)
- : data_(static_cast<unsigned long long>(id)) {}
- unsigned long long data() const { return data_; }
+ explicit ForceMangle(unsigned long long raw_id) : raw_id_(raw_id) {}
+ explicit ForceMangle(unsigned long raw_id) : raw_id_(raw_id) {}
+ explicit ForceMangle(unsigned int raw_id) : raw_id_(raw_id) {}
+ explicit ForceMangle(unsigned short raw_id) : raw_id_(raw_id) {}
+ explicit ForceMangle(unsigned char raw_id) : raw_id_(raw_id) {}
+ explicit ForceMangle(long long raw_id)
+ : raw_id_(static_cast<unsigned long long>(raw_id)) {}
+ explicit ForceMangle(long raw_id)
+ : raw_id_(static_cast<unsigned long long>(raw_id)) {}
+ explicit ForceMangle(int raw_id)
+ : raw_id_(static_cast<unsigned long long>(raw_id)) {}
+ explicit ForceMangle(short raw_id)
+ : raw_id_(static_cast<unsigned long long>(raw_id)) {}
+ explicit ForceMangle(signed char raw_id)
+ : raw_id_(static_cast<unsigned long long>(raw_id)) {}
+ unsigned long long raw_id() const { return raw_id_; }
private:
- unsigned long long data_;
+ unsigned long long raw_id_;
};
- TraceID(const void* id, unsigned int* flags)
- : data_(static_cast<unsigned long long>(
- reinterpret_cast<uintptr_t>(id))) {
+ TraceID(const void* raw_id, unsigned int* flags)
+ : raw_id_(static_cast<unsigned long long>(
+ reinterpret_cast<uintptr_t>(raw_id))) {
*flags |= TRACE_EVENT_FLAG_MANGLE_ID;
}
- TraceID(ForceMangle id, unsigned int* flags) : data_(id.data()) {
+ TraceID(ForceMangle raw_id, unsigned int* flags) : raw_id_(raw_id.raw_id()) {
*flags |= TRACE_EVENT_FLAG_MANGLE_ID;
}
- TraceID(DontMangle id, unsigned int* flags) : data_(id.data()) {
+ TraceID(DontMangle maybe_scoped_id, unsigned int* flags)
+ : scope_(maybe_scoped_id.scope()), raw_id_(maybe_scoped_id.raw_id()) {
+ }
+ TraceID(unsigned long long raw_id, unsigned int* flags) : raw_id_(raw_id) {
+ (void)flags;
}
- TraceID(unsigned long long id, unsigned int* flags)
- : data_(id) { (void)flags; }
- TraceID(unsigned long id, unsigned int* flags)
- : data_(id) { (void)flags; }
- TraceID(unsigned int id, unsigned int* flags)
- : data_(id) { (void)flags; }
- TraceID(unsigned short id, unsigned int* flags)
- : data_(id) { (void)flags; }
- TraceID(unsigned char id, unsigned int* flags)
- : data_(id) { (void)flags; }
- TraceID(long long id, unsigned int* flags)
- : data_(static_cast<unsigned long long>(id)) { (void)flags; }
- TraceID(long id, unsigned int* flags)
- : data_(static_cast<unsigned long long>(id)) { (void)flags; }
- TraceID(int id, unsigned int* flags)
- : data_(static_cast<unsigned long long>(id)) { (void)flags; }
- TraceID(short id, unsigned int* flags)
- : data_(static_cast<unsigned long long>(id)) { (void)flags; }
- TraceID(signed char id, unsigned int* flags)
- : data_(static_cast<unsigned long long>(id)) { (void)flags; }
-
- unsigned long long data() const { return data_; }
+ TraceID(unsigned long raw_id, unsigned int* flags) : raw_id_(raw_id) {
+ (void)flags;
+ }
+ TraceID(unsigned int raw_id, unsigned int* flags) : raw_id_(raw_id) {
+ (void)flags;
+ }
+ TraceID(unsigned short raw_id, unsigned int* flags) : raw_id_(raw_id) {
+ (void)flags;
+ }
+ TraceID(unsigned char raw_id, unsigned int* flags) : raw_id_(raw_id) {
+ (void)flags;
+ }
+ TraceID(long long raw_id, unsigned int* flags)
+ : raw_id_(static_cast<unsigned long long>(raw_id)) { (void)flags; }
+ TraceID(long raw_id, unsigned int* flags)
+ : raw_id_(static_cast<unsigned long long>(raw_id)) { (void)flags; }
+ TraceID(int raw_id, unsigned int* flags)
+ : raw_id_(static_cast<unsigned long long>(raw_id)) { (void)flags; }
+ TraceID(short raw_id, unsigned int* flags)
+ : raw_id_(static_cast<unsigned long long>(raw_id)) { (void)flags; }
+ TraceID(signed char raw_id, unsigned int* flags)
+ : raw_id_(static_cast<unsigned long long>(raw_id)) { (void)flags; }
+ TraceID(WithScope scoped_id, unsigned int* flags)
+ : scope_(scoped_id.scope()), raw_id_(scoped_id.raw_id()) {}
+
+ unsigned long long raw_id() const { return raw_id_; }
+ const char* scope() const { return scope_; }
private:
- unsigned long long data_;
+ const char* scope_ = nullptr;
+ unsigned long long raw_id_;
};
// Simple union to store various types as unsigned long long.
@@ -550,6 +587,7 @@ AddTraceEventWithThreadIdAndTimestamp(
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
int thread_id,
const base::TimeTicks& timestamp,
@@ -561,8 +599,8 @@ AddTraceEventWithThreadIdAndTimestamp(
const int num_args = 1;
unsigned char arg_types[1] = { TRACE_VALUE_TYPE_CONVERTABLE };
return TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP(
- phase, category_group_enabled, name, id, bind_id, thread_id, timestamp,
- num_args, &arg1_name, arg_types, NULL, &arg1_val, flags);
+ phase, category_group_enabled, name, scope, id, bind_id, thread_id,
+ timestamp, num_args, &arg1_name, arg_types, NULL, &arg1_val, flags);
}
template<class ARG1_TYPE>
@@ -571,6 +609,7 @@ AddTraceEventWithThreadIdAndTimestamp(
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
int thread_id,
const base::TimeTicks& timestamp,
@@ -594,8 +633,9 @@ AddTraceEventWithThreadIdAndTimestamp(
convertable_values[1] = arg2_val;
return TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP(
- phase, category_group_enabled, name, id, bind_id, thread_id, timestamp,
- num_args, arg_names, arg_types, arg_values, convertable_values, flags);
+ phase, category_group_enabled, name, scope, id, bind_id, thread_id,
+ timestamp, num_args, arg_names, arg_types, arg_values, convertable_values,
+ flags);
}
template<class ARG2_TYPE>
@@ -604,6 +644,7 @@ AddTraceEventWithThreadIdAndTimestamp(
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
int thread_id,
const base::TimeTicks& timestamp,
@@ -627,8 +668,9 @@ AddTraceEventWithThreadIdAndTimestamp(
convertable_values[0] = arg1_val;
return TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP(
- phase, category_group_enabled, name, id, bind_id, thread_id, timestamp,
- num_args, arg_names, arg_types, arg_values, convertable_values, flags);
+ phase, category_group_enabled, name, scope, id, bind_id, thread_id,
+ timestamp, num_args, arg_names, arg_types, arg_values, convertable_values,
+ flags);
}
static inline base::trace_event::TraceEventHandle
@@ -636,6 +678,7 @@ AddTraceEventWithThreadIdAndTimestamp(
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
int thread_id,
const base::TimeTicks& timestamp,
@@ -654,8 +697,9 @@ AddTraceEventWithThreadIdAndTimestamp(
convertable_values[2] = {arg1_val, arg2_val};
return TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP(
- phase, category_group_enabled, name, id, bind_id, thread_id, timestamp,
- num_args, arg_names, arg_types, NULL, convertable_values, flags);
+ phase, category_group_enabled, name, scope, id, bind_id, thread_id,
+ timestamp, num_args, arg_names, arg_types, NULL, convertable_values,
+ flags);
}
static inline base::trace_event::TraceEventHandle
@@ -663,27 +707,30 @@ AddTraceEventWithThreadIdAndTimestamp(
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
int thread_id,
const base::TimeTicks& timestamp,
unsigned int flags,
unsigned long long bind_id) {
return TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP(
- phase, category_group_enabled, name, id, bind_id, thread_id, timestamp,
- kZeroNumArgs, NULL, NULL, NULL, NULL, flags);
+ phase, category_group_enabled, name, scope, id, bind_id, thread_id,
+ timestamp, kZeroNumArgs, NULL, NULL, NULL, NULL, flags);
}
static inline base::trace_event::TraceEventHandle AddTraceEvent(
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
unsigned int flags,
unsigned long long bind_id) {
const int thread_id = static_cast<int>(base::PlatformThread::CurrentId());
const base::TimeTicks now = base::TimeTicks::Now();
return AddTraceEventWithThreadIdAndTimestamp(
- phase, category_group_enabled, name, id, thread_id, now, flags, bind_id);
+ phase, category_group_enabled, name, scope, id, thread_id, now, flags,
+ bind_id);
}
template<class ARG1_TYPE>
@@ -692,6 +739,7 @@ AddTraceEventWithThreadIdAndTimestamp(
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
int thread_id,
const base::TimeTicks& timestamp,
@@ -704,8 +752,8 @@ AddTraceEventWithThreadIdAndTimestamp(
unsigned long long arg_values[1];
SetTraceValue(arg1_val, &arg_types[0], &arg_values[0]);
return TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP(
- phase, category_group_enabled, name, id, bind_id, thread_id, timestamp,
- num_args, &arg1_name, arg_types, arg_values, NULL, flags);
+ phase, category_group_enabled, name, scope, id, bind_id, thread_id,
+ timestamp, num_args, &arg1_name, arg_types, arg_values, NULL, flags);
}
template<class ARG1_TYPE>
@@ -713,6 +761,7 @@ static inline base::trace_event::TraceEventHandle AddTraceEvent(
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
unsigned int flags,
unsigned long long bind_id,
@@ -720,9 +769,9 @@ static inline base::trace_event::TraceEventHandle AddTraceEvent(
const ARG1_TYPE& arg1_val) {
int thread_id = static_cast<int>(base::PlatformThread::CurrentId());
base::TimeTicks now = base::TimeTicks::Now();
- return AddTraceEventWithThreadIdAndTimestamp(phase, category_group_enabled,
- name, id, thread_id, now, flags,
- bind_id, arg1_name, arg1_val);
+ return AddTraceEventWithThreadIdAndTimestamp(
+ phase, category_group_enabled, name, scope, id, thread_id, now, flags,
+ bind_id, arg1_name, arg1_val);
}
template<class ARG1_TYPE, class ARG2_TYPE>
@@ -731,6 +780,7 @@ AddTraceEventWithThreadIdAndTimestamp(
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
int thread_id,
const base::TimeTicks& timestamp,
@@ -747,8 +797,8 @@ AddTraceEventWithThreadIdAndTimestamp(
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_WITH_THREAD_ID_AND_TIMESTAMP(
- phase, category_group_enabled, name, id, bind_id, thread_id, timestamp,
- num_args, arg_names, arg_types, arg_values, NULL, flags);
+ phase, category_group_enabled, name, scope, id, bind_id, thread_id,
+ timestamp, num_args, arg_names, arg_types, arg_values, NULL, flags);
}
template<class ARG1_TYPE, class ARG2_TYPE>
@@ -756,6 +806,7 @@ static inline base::trace_event::TraceEventHandle AddTraceEvent(
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
unsigned int flags,
unsigned long long bind_id,
@@ -766,8 +817,8 @@ static inline base::trace_event::TraceEventHandle AddTraceEvent(
int thread_id = static_cast<int>(base::PlatformThread::CurrentId());
base::TimeTicks now = base::TimeTicks::Now();
return AddTraceEventWithThreadIdAndTimestamp(
- phase, category_group_enabled, name, id, thread_id, now, flags, bind_id,
- arg1_name, arg1_val, arg2_name, arg2_val);
+ phase, category_group_enabled, name, scope, id, thread_id, now, flags,
+ bind_id, arg1_name, arg1_val, arg2_name, arg2_val);
}
static inline void AddMetadataEvent(
diff --git a/base/trace_event/trace_event_impl.cc b/base/trace_event/trace_event_impl.cc
index 24d6568..2ac1962 100644
--- a/base/trace_event/trace_event_impl.cc
+++ b/base/trace_event/trace_event_impl.cc
@@ -41,6 +41,7 @@ void CopyTraceEventParameter(char** buffer,
TraceEvent::TraceEvent()
: duration_(TimeDelta::FromInternalValue(-1)),
+ scope_(trace_event_internal::kGlobalScope),
id_(0u),
category_group_enabled_(NULL),
name_(NULL),
@@ -59,6 +60,7 @@ void TraceEvent::CopyFrom(const TraceEvent& other) {
timestamp_ = other.timestamp_;
thread_timestamp_ = other.thread_timestamp_;
duration_ = other.duration_;
+ scope_ = other.scope_;
id_ = other.id_;
category_group_enabled_ = other.category_group_enabled_;
name_ = other.name_;
@@ -85,6 +87,7 @@ void TraceEvent::Initialize(
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
unsigned long long bind_id,
int num_args,
@@ -96,6 +99,7 @@ void TraceEvent::Initialize(
timestamp_ = timestamp;
thread_timestamp_ = thread_timestamp;
duration_ = TimeDelta::FromInternalValue(-1);
+ scope_ = scope;
id_ = id;
category_group_enabled_ = category_group_enabled;
name_ = name;
@@ -126,7 +130,7 @@ void TraceEvent::Initialize(
bool copy = !!(flags & TRACE_EVENT_FLAG_COPY);
size_t alloc_size = 0;
if (copy) {
- alloc_size += GetAllocLength(name);
+ alloc_size += GetAllocLength(name) + GetAllocLength(scope);
for (i = 0; i < num_args; ++i) {
alloc_size += GetAllocLength(arg_names_[i]);
if (arg_types_[i] == TRACE_VALUE_TYPE_STRING)
@@ -153,6 +157,7 @@ void TraceEvent::Initialize(
const char* end = ptr + alloc_size;
if (copy) {
CopyTraceEventParameter(&ptr, &name_, end);
+ CopyTraceEventParameter(&ptr, &scope_, end);
for (i = 0; i < num_args; ++i) {
CopyTraceEventParameter(&ptr, &arg_names_[i], end);
}
@@ -354,8 +359,11 @@ void TraceEvent::AppendAsJSON(
// If id_ is set, print it out as a hex string so we don't loose any
// bits (it might be a 64-bit pointer).
- if (flags_ & TRACE_EVENT_FLAG_HAS_ID)
+ if (flags_ & TRACE_EVENT_FLAG_HAS_ID) {
+ if (scope_ != trace_event_internal::kGlobalScope)
+ StringAppendF(out, ",\"scope\":\"%s\"", scope_);
StringAppendF(out, ",\"id\":\"0x%" PRIx64 "\"", static_cast<uint64_t>(id_));
+ }
if (flags_ & TRACE_EVENT_FLAG_BIND_TO_ENCLOSING)
StringAppendF(out, ",\"bp\":\"e\"");
diff --git a/base/trace_event/trace_event_impl.h b/base/trace_event/trace_event_impl.h
index 36461e2..d0ac463 100644
--- a/base/trace_event/trace_event_impl.h
+++ b/base/trace_event/trace_event_impl.h
@@ -104,6 +104,7 @@ class BASE_EXPORT TraceEvent {
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
unsigned long long bind_id,
int num_args,
@@ -135,6 +136,7 @@ class BASE_EXPORT TraceEvent {
int thread_id() const { return thread_id_; }
TimeDelta duration() const { return duration_; }
TimeDelta thread_duration() const { return thread_duration_; }
+ const char* scope() const { return scope_; }
unsigned long long id() const { return id_; }
unsigned int flags() const { return flags_; }
@@ -160,7 +162,8 @@ class BASE_EXPORT TraceEvent {
ThreadTicks thread_timestamp_;
TimeDelta duration_;
TimeDelta thread_duration_;
- // id_ can be used to store phase-specific data.
+ // scope_ and id_ can be used to store phase-specific data.
+ const char* scope_;
unsigned long long id_;
TraceValue arg_values_[kTraceMaxNumArgs];
const char* arg_names_[kTraceMaxNumArgs];
diff --git a/base/trace_event/trace_event_unittest.cc b/base/trace_event/trace_event_unittest.cc
index dc28c79..a0bd5ae9 100644
--- a/base/trace_event/trace_event_unittest.cc
+++ b/base/trace_event/trace_event_unittest.cc
@@ -501,6 +501,13 @@ void TraceWithAllMacroVariants(WaitableEvent* task_complete_event) {
0x2128506);
trackable.snapshot("world");
+ TRACE_EVENT_OBJECT_CREATED_WITH_ID(
+ "all", "tracked object 3", TRACE_ID_WITH_SCOPE("scope", 0x42));
+ TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(
+ "all", "tracked object 3", TRACE_ID_WITH_SCOPE("scope", 0x42), "hello");
+ TRACE_EVENT_OBJECT_DELETED_WITH_ID(
+ "all", "tracked object 3", TRACE_ID_WITH_SCOPE("scope", 0x42));
+
TRACE_EVENT1(kControlCharacters, kControlCharacters,
kControlCharacters, kControlCharacters);
@@ -806,6 +813,7 @@ void ValidateAllTraceMacrosCreatedData(const ListValue& trace_parsed) {
EXPECT_TRUE((item && item->GetString("ph", &phase)));
EXPECT_EQ("N", phase);
+ EXPECT_FALSE((item && item->HasKey("scope")));
EXPECT_TRUE((item && item->GetString("id", &id)));
EXPECT_EQ("0x42", id);
@@ -813,6 +821,7 @@ void ValidateAllTraceMacrosCreatedData(const ListValue& trace_parsed) {
EXPECT_TRUE(item);
EXPECT_TRUE(item && item->GetString("ph", &phase));
EXPECT_EQ("O", phase);
+ EXPECT_FALSE((item && item->HasKey("scope")));
EXPECT_TRUE(item && item->GetString("id", &id));
EXPECT_EQ("0x42", id);
EXPECT_TRUE(item && item->GetString("args.snapshot", &snapshot));
@@ -822,6 +831,7 @@ void ValidateAllTraceMacrosCreatedData(const ListValue& trace_parsed) {
EXPECT_TRUE(item);
EXPECT_TRUE(item && item->GetString("ph", &phase));
EXPECT_EQ("D", phase);
+ EXPECT_FALSE((item && item->HasKey("scope")));
EXPECT_TRUE(item && item->GetString("id", &id));
EXPECT_EQ("0x42", id);
}
@@ -854,6 +864,41 @@ void ValidateAllTraceMacrosCreatedData(const ListValue& trace_parsed) {
EXPECT_EQ("0x2128506", id);
}
+ EXPECT_FIND_("tracked object 3");
+ {
+ std::string phase;
+ std::string scope;
+ std::string id;
+ std::string snapshot;
+
+ EXPECT_TRUE((item && item->GetString("ph", &phase)));
+ EXPECT_EQ("N", phase);
+ EXPECT_TRUE((item && item->GetString("scope", &scope)));
+ EXPECT_EQ("scope", scope);
+ EXPECT_TRUE((item && item->GetString("id", &id)));
+ EXPECT_EQ("0x42", id);
+
+ item = FindTraceEntry(trace_parsed, "tracked object 3", item);
+ EXPECT_TRUE(item);
+ EXPECT_TRUE(item && item->GetString("ph", &phase));
+ EXPECT_EQ("O", phase);
+ EXPECT_TRUE((item && item->GetString("scope", &scope)));
+ EXPECT_EQ("scope", scope);
+ EXPECT_TRUE(item && item->GetString("id", &id));
+ EXPECT_EQ("0x42", id);
+ EXPECT_TRUE(item && item->GetString("args.snapshot", &snapshot));
+ EXPECT_EQ("hello", snapshot);
+
+ item = FindTraceEntry(trace_parsed, "tracked object 3", item);
+ EXPECT_TRUE(item);
+ EXPECT_TRUE(item && item->GetString("ph", &phase));
+ EXPECT_EQ("D", phase);
+ EXPECT_TRUE((item && item->GetString("scope", &scope)));
+ EXPECT_EQ("scope", scope);
+ EXPECT_TRUE(item && item->GetString("id", &id));
+ EXPECT_EQ("0x42", id);
+ }
+
EXPECT_FIND_(kControlCharacters);
EXPECT_SUB_FIND_(kControlCharacters);
@@ -1513,14 +1558,16 @@ TEST_F(TraceEventTestFixture, StaticStringVsString) {
// Test that string arguments are copied.
TraceEventHandle handle1 =
trace_event_internal::AddTraceEvent(
- TRACE_EVENT_PHASE_INSTANT, category_group_enabled, "name1", 0, 0,
- trace_event_internal::kNoId,
+ TRACE_EVENT_PHASE_INSTANT, category_group_enabled, "name1",
+ trace_event_internal::kGlobalScope, trace_event_internal::kNoId,
+ 0, trace_event_internal::kNoId,
"arg1", std::string("argval"), "arg2", std::string("argval"));
// Test that static TRACE_STR_COPY string arguments are copied.
TraceEventHandle handle2 =
trace_event_internal::AddTraceEvent(
- TRACE_EVENT_PHASE_INSTANT, category_group_enabled, "name2", 0, 0,
- trace_event_internal::kNoId,
+ TRACE_EVENT_PHASE_INSTANT, category_group_enabled, "name2",
+ trace_event_internal::kGlobalScope, trace_event_internal::kNoId,
+ 0, trace_event_internal::kNoId,
"arg1", TRACE_STR_COPY("argval"),
"arg2", TRACE_STR_COPY("argval"));
EXPECT_GT(tracer->GetStatus().event_count, 1u);
@@ -1542,16 +1589,18 @@ TEST_F(TraceEventTestFixture, StaticStringVsString) {
// Test that static literal string arguments are not copied.
TraceEventHandle handle1 =
trace_event_internal::AddTraceEvent(
- TRACE_EVENT_PHASE_INSTANT, category_group_enabled, "name1", 0, 0,
- trace_event_internal::kNoId,
+ TRACE_EVENT_PHASE_INSTANT, category_group_enabled, "name1",
+ trace_event_internal::kGlobalScope, trace_event_internal::kNoId,
+ 0, trace_event_internal::kNoId,
"arg1", "argval", "arg2", "argval");
// Test that static TRACE_STR_COPY NULL string arguments are not copied.
const char* str1 = NULL;
const char* str2 = NULL;
TraceEventHandle handle2 =
trace_event_internal::AddTraceEvent(
- TRACE_EVENT_PHASE_INSTANT, category_group_enabled, "name2", 0, 0,
- trace_event_internal::kNoId,
+ TRACE_EVENT_PHASE_INSTANT, category_group_enabled, "name2",
+ trace_event_internal::kGlobalScope, trace_event_internal::kNoId,
+ 0, trace_event_internal::kNoId,
"arg1", TRACE_STR_COPY(str1),
"arg2", TRACE_STR_COPY(str2));
EXPECT_GT(tracer->GetStatus().event_count, 1u);
@@ -2456,6 +2505,7 @@ class TraceEventCallbackTest : public TraceEventTestFixture {
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
int num_args,
const char* const arg_names[],
diff --git a/base/trace_event/trace_log.cc b/base/trace_event/trace_log.cc
index 5dc38bf..65aa23a 100644
--- a/base/trace_event/trace_log.cc
+++ b/base/trace_event/trace_log.cc
@@ -140,6 +140,7 @@ void InitializeMetadataEvent(TraceEvent* trace_event,
TRACE_EVENT_PHASE_METADATA,
&g_category_group_enabled[g_category_metadata],
metadata_name,
+ trace_event_internal::kGlobalScope, // scope
trace_event_internal::kNoId, // id
trace_event_internal::kNoId, // bind_id
num_args,
@@ -1053,6 +1054,7 @@ TraceEventHandle TraceLog::AddTraceEvent(
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
int num_args,
const char** arg_names,
@@ -1066,6 +1068,7 @@ TraceEventHandle TraceLog::AddTraceEvent(
phase,
category_group_enabled,
name,
+ scope,
id,
trace_event_internal::kNoId, // bind_id
thread_id,
@@ -1082,6 +1085,7 @@ TraceEventHandle TraceLog::AddTraceEventWithBindId(
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
unsigned long long bind_id,
int num_args,
@@ -1096,6 +1100,7 @@ TraceEventHandle TraceLog::AddTraceEventWithBindId(
phase,
category_group_enabled,
name,
+ scope,
id,
bind_id,
thread_id,
@@ -1112,6 +1117,7 @@ TraceEventHandle TraceLog::AddTraceEventWithProcessId(
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
int process_id,
int num_args,
@@ -1125,6 +1131,7 @@ TraceEventHandle TraceLog::AddTraceEventWithProcessId(
phase,
category_group_enabled,
name,
+ scope,
id,
trace_event_internal::kNoId, // bind_id
process_id,
@@ -1143,6 +1150,7 @@ TraceEventHandle TraceLog::AddTraceEventWithThreadIdAndTimestamp(
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
int thread_id,
const TimeTicks& timestamp,
@@ -1156,6 +1164,7 @@ TraceEventHandle TraceLog::AddTraceEventWithThreadIdAndTimestamp(
phase,
category_group_enabled,
name,
+ scope,
id,
trace_event_internal::kNoId, // bind_id
thread_id,
@@ -1172,6 +1181,7 @@ TraceEventHandle TraceLog::AddTraceEventWithThreadIdAndTimestamp(
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
unsigned long long bind_id,
int thread_id,
@@ -1278,6 +1288,7 @@ TraceEventHandle TraceLog::AddTraceEventWithThreadIdAndTimestamp(
phase,
category_group_enabled,
name,
+ scope,
id,
bind_id,
num_args,
@@ -1324,8 +1335,8 @@ TraceEventHandle TraceLog::AddTraceEventWithThreadIdAndTimestamp(
event_callback(
offset_event_timestamp,
phase == TRACE_EVENT_PHASE_COMPLETE ? TRACE_EVENT_PHASE_BEGIN : phase,
- category_group_enabled, name, id, num_args, arg_names, arg_types,
- arg_values, flags);
+ category_group_enabled, name, scope, id, num_args, arg_names,
+ arg_types, arg_values, flags);
}
}
@@ -1359,6 +1370,7 @@ void TraceLog::AddMetadataEvent(
0, // thread_id
TimeTicks(), ThreadTicks(), TRACE_EVENT_PHASE_METADATA,
&g_category_group_enabled[g_category_metadata], name,
+ trace_event_internal::kGlobalScope, // scope
trace_event_internal::kNoId, // id
trace_event_internal::kNoId, // bind_id
num_args, arg_names, arg_types, arg_values, convertable_values, flags);
@@ -1469,9 +1481,10 @@ void TraceLog::UpdateTraceEventDuration(
EventCallback event_callback = reinterpret_cast<EventCallback>(
subtle::NoBarrier_Load(&event_callback_));
if (event_callback) {
- event_callback(now, TRACE_EVENT_PHASE_END, category_group_enabled, name,
- trace_event_internal::kNoId, 0,
- nullptr, nullptr, nullptr, TRACE_EVENT_FLAG_NONE);
+ event_callback(
+ now, TRACE_EVENT_PHASE_END, category_group_enabled, name,
+ trace_event_internal::kGlobalScope, trace_event_internal::kNoId, 0,
+ nullptr, nullptr, nullptr, TRACE_EVENT_FLAG_NONE);
}
}
}
@@ -1729,6 +1742,7 @@ ScopedTraceBinaryEfficient::ScopedTraceBinaryEfficient(
TRACE_EVENT_PHASE_COMPLETE,
category_group_enabled_,
name,
+ trace_event_internal::kGlobalScope, // scope
trace_event_internal::kNoId, // id
static_cast<int>(base::PlatformThread::CurrentId()), // thread_id
base::TimeTicks::Now(),
diff --git a/base/trace_event/trace_log.h b/base/trace_event/trace_log.h
index a079f04..235b946 100644
--- a/base/trace_event/trace_log.h
+++ b/base/trace_event/trace_log.h
@@ -142,6 +142,7 @@ class BASE_EXPORT TraceLog : public MemoryDumpProvider {
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
int num_args,
const char* const arg_names[],
@@ -188,6 +189,7 @@ class BASE_EXPORT TraceLog : public MemoryDumpProvider {
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
int num_args,
const char** arg_names,
@@ -199,6 +201,7 @@ class BASE_EXPORT TraceLog : public MemoryDumpProvider {
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
unsigned long long bind_id,
int num_args,
@@ -211,6 +214,7 @@ class BASE_EXPORT TraceLog : public MemoryDumpProvider {
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
int process_id,
int num_args,
@@ -223,6 +227,7 @@ class BASE_EXPORT TraceLog : public MemoryDumpProvider {
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
int thread_id,
const TimeTicks& timestamp,
@@ -236,6 +241,7 @@ class BASE_EXPORT TraceLog : public MemoryDumpProvider {
char phase,
const unsigned char* category_group_enabled,
const char* name,
+ const char* scope,
unsigned long long id,
unsigned long long bind_id,
int thread_id,
diff --git a/base/trace_event/trace_sampling_thread.cc b/base/trace_event/trace_sampling_thread.cc
index ec4602c..a8d32d6 100644
--- a/base/trace_event/trace_sampling_thread.cc
+++ b/base/trace_event/trace_sampling_thread.cc
@@ -4,6 +4,7 @@
#include <stddef.h>
+#include "base/trace_event/trace_event.h"
#include "base/trace_event/trace_event_impl.h"
#include "base/trace_event/trace_log.h"
#include "base/trace_event/trace_sampling_thread.h"
@@ -54,8 +55,9 @@ void TraceSamplingThread::DefaultSamplingCallback(
ExtractCategoryAndName(combined, &category_group, &name);
TRACE_EVENT_API_ADD_TRACE_EVENT(
TRACE_EVENT_PHASE_SAMPLE,
- TraceLog::GetCategoryGroupEnabled(category_group), name, 0, 0, NULL, NULL,
- NULL, NULL, 0);
+ TraceLog::GetCategoryGroupEnabled(category_group), name,
+ trace_event_internal::kGlobalScope, trace_event_internal::kNoId, 0,
+ NULL, NULL, NULL, NULL, 0);
}
void TraceSamplingThread::GetSamples() {