summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/platform/TraceEvent.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/platform/TraceEvent.h')
-rw-r--r--chromium/third_party/WebKit/Source/platform/TraceEvent.h128
1 files changed, 98 insertions, 30 deletions
diff --git a/chromium/third_party/WebKit/Source/platform/TraceEvent.h b/chromium/third_party/WebKit/Source/platform/TraceEvent.h
index 087fd0d16be..b7f902a5e08 100644
--- a/chromium/third_party/WebKit/Source/platform/TraceEvent.h
+++ b/chromium/third_party/WebKit/Source/platform/TraceEvent.h
@@ -166,6 +166,7 @@
#include "platform/EventTracer.h"
#include "wtf/DynamicAnnotations.h"
+#include "wtf/PassRefPtr.h"
#include "wtf/text/CString.h"
// By default, const char* argument values are assumed to have long-lived scope
@@ -176,12 +177,12 @@
// By default, uint64 ID argument values are not mangled with the Process ID in
// TRACE_EVENT_ASYNC macros. Use this macro to force Process ID mangling.
#define TRACE_ID_MANGLE(id) \
- TraceID::ForceMangle(id)
+ WebCore::TraceEvent::TraceID::ForceMangle(id)
// By default, pointers are mangled with the Process ID in TRACE_EVENT_ASYNC
// macros. Use this macro to prevent Process ID mangling.
#define TRACE_ID_DONT_MANGLE(id) \
- TraceID::DontMangle(id)
+ WebCore::TraceEvent::TraceID::DontMangle(id)
// Records a pair of begin and end events called "name" for the current
// scope, with 0, 1 or 2 associated arguments. If the category is not
@@ -504,7 +505,7 @@
#define TRACE_EVENT_CATEGORY_GROUP_ENABLED(categoryGroup, ret) \
do { \
INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(categoryGroup); \
- if (*INTERNALTRACEEVENTUID(categoryGroupEnabled)) { \
+ if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \
*ret = true; \
} else { \
*ret = false; \
@@ -541,6 +542,7 @@
// const char** arg_names,
// const unsigned char* arg_types,
// const unsigned long long* arg_values,
+// const RefPtr<ConvertableToTraceFormat>* convertableValues
// unsigned char flags)
#define TRACE_EVENT_API_ADD_TRACE_EVENT \
WebCore::EventTracer::addTraceEvent
@@ -580,7 +582,7 @@
#define INTERNAL_TRACE_EVENT_ADD(phase, category, name, flags, ...) \
do { \
INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \
- if (*INTERNALTRACEEVENTUID(categoryGroupEnabled)) { \
+ if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \
WebCore::TraceEvent::addTraceEvent( \
phase, INTERNALTRACEEVENTUID(categoryGroupEnabled), name, \
WebCore::TraceEvent::noEventId, flags, ##__VA_ARGS__); \
@@ -593,7 +595,7 @@
#define INTERNAL_TRACE_EVENT_ADD_SCOPED(category, name, ...) \
INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \
WebCore::TraceEvent::ScopedTracer INTERNALTRACEEVENTUID(scopedTracer); \
- if (*INTERNALTRACEEVENTUID(categoryGroupEnabled)) { \
+ if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \
WebCore::TraceEvent::TraceEventHandle h = \
WebCore::TraceEvent::addTraceEvent( \
TRACE_EVENT_PHASE_COMPLETE, \
@@ -610,7 +612,7 @@
...) \
do { \
INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \
- if (*INTERNALTRACEEVENTUID(categoryGroupEnabled)) { \
+ if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \
unsigned char traceEventFlags = flags | TRACE_EVENT_FLAG_HAS_ID; \
WebCore::TraceEvent::TraceID traceEventTraceID( \
id, &traceEventFlags); \
@@ -657,7 +659,14 @@
#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))
+#define TRACE_VALUE_TYPE_CONVERTABLE (static_cast<unsigned char>(8))
+// These values must be in sync with base::debug::TraceLog::CategoryGroupEnabledFlags.
+#define ENABLED_FOR_RECORDING (1 << 0)
+#define ENABLED_FOR_EVENT_CALLBACK (1 << 2)
+
+#define INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE() \
+ (*INTERNALTRACEEVENTUID(categoryGroupEnabled) & (ENABLED_FOR_RECORDING | ENABLED_FOR_EVENT_CALLBACK))
namespace WebCore {
@@ -729,7 +738,7 @@ union TraceValueUnion {
class TraceStringWithCopy {
public:
explicit TraceStringWithCopy(const char* str) : m_str(str) { }
- operator const char* () const { return m_str; }
+ const char* str() const { return m_str; }
private:
const char* m_str;
};
@@ -737,43 +746,35 @@ private:
// 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) { \
+#define INTERNAL_DECLARE_SET_TRACE_VALUE(actualType, argExpression, unionMember, valueTypeId) \
+ static inline void setTraceValue(actualType arg, unsigned char* type, unsigned long long* value) { \
TraceValueUnion typeValue; \
- typeValue.union_member = arg; \
- *type = value_type_id; \
+ typeValue.unionMember = argExpression; \
+ *type = valueTypeId; \
*value = typeValue.m_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, \
+#define INTERNAL_DECLARE_SET_TRACE_VALUE_INT(actualType, valueTypeId) \
+ static inline void setTraceValue(actualType arg, \
unsigned char* type, \
unsigned long long* value) { \
- *type = value_type_id; \
+ *type = valueTypeId; \
*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, 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, m_bool, TRACE_VALUE_TYPE_BOOL)
-INTERNAL_DECLARE_SET_TRACE_VALUE(double, m_double, TRACE_VALUE_TYPE_DOUBLE)
-INTERNAL_DECLARE_SET_TRACE_VALUE(const void*, m_pointer,
- TRACE_VALUE_TYPE_POINTER)
-INTERNAL_DECLARE_SET_TRACE_VALUE(const char*, m_string,
- TRACE_VALUE_TYPE_STRING)
-INTERNAL_DECLARE_SET_TRACE_VALUE(const TraceStringWithCopy&, m_string,
- TRACE_VALUE_TYPE_COPY_STRING)
+INTERNAL_DECLARE_SET_TRACE_VALUE(bool, arg, m_bool, TRACE_VALUE_TYPE_BOOL)
+INTERNAL_DECLARE_SET_TRACE_VALUE(double, arg, m_double, TRACE_VALUE_TYPE_DOUBLE)
+INTERNAL_DECLARE_SET_TRACE_VALUE(const void*, arg, m_pointer, TRACE_VALUE_TYPE_POINTER)
+INTERNAL_DECLARE_SET_TRACE_VALUE(const char*, arg, m_string, TRACE_VALUE_TYPE_STRING)
+INTERNAL_DECLARE_SET_TRACE_VALUE(const TraceStringWithCopy&, arg.str(), m_string, TRACE_VALUE_TYPE_COPY_STRING)
#undef INTERNAL_DECLARE_SET_TRACE_VALUE
#undef INTERNAL_DECLARE_SET_TRACE_VALUE_INT
@@ -787,6 +788,54 @@ static inline void setTraceValue(const WTF::CString& arg, unsigned char* type, u
*value = typeValue.m_uint;
}
+static inline void setTraceValue(ConvertableToTraceFormat*, unsigned char* type, unsigned long long*)
+{
+ *type = TRACE_VALUE_TYPE_CONVERTABLE;
+}
+
+template<typename T> static inline void setTraceValue(const PassRefPtr<T>& ptr, unsigned char* type, unsigned long long* value)
+{
+ setTraceValue(ptr.get(), type, value);
+}
+
+template<typename T> struct ConvertableToTraceFormatTraits {
+ static const bool isConvertable = false;
+ static void assignIfConvertable(ConvertableToTraceFormat*& left, const T&)
+ {
+ left = 0;
+ }
+};
+
+template<typename T> struct ConvertableToTraceFormatTraits<T*> {
+ static const bool isConvertable = WTF::IsSubclass<T, TraceEvent::ConvertableToTraceFormat>::value;
+ static void assignIfConvertable(ConvertableToTraceFormat*& left, ...)
+ {
+ left = 0;
+ }
+ static void assignIfConvertable(ConvertableToTraceFormat*& left, ConvertableToTraceFormat* const& right)
+ {
+ left = right;
+ }
+};
+
+template<typename T> struct ConvertableToTraceFormatTraits<PassRefPtr<T> > {
+ static const bool isConvertable = WTF::IsSubclass<T, TraceEvent::ConvertableToTraceFormat>::value;
+ static void assignIfConvertable(ConvertableToTraceFormat*& left, const PassRefPtr<T>& right)
+ {
+ ConvertableToTraceFormatTraits<T*>::assignIfConvertable(left, right.get());
+ }
+};
+
+template<typename T> bool isConvertableToTraceFormat(const T&)
+{
+ return ConvertableToTraceFormatTraits<T>::isConvertable;
+}
+
+template<typename T> void assignIfConvertableToTraceFormat(ConvertableToTraceFormat*& left, const T& right)
+{
+ ConvertableToTraceFormatTraits<T>::assignIfConvertable(left, right);
+}
+
// These addTraceEvent template functions are defined here instead of in the
// macro, because the arg values could be temporary string objects. In order to
// store pointers to the internal c_str and pass through to the tracing API, the
@@ -805,7 +854,7 @@ static inline TraceEventHandle addTraceEvent(
flags);
}
-template<class ARG1_TYPE>
+template<typename ARG1_TYPE>
static inline TraceEventHandle addTraceEvent(
char phase,
const unsigned char* categoryEnabled,
@@ -819,13 +868,22 @@ static inline TraceEventHandle addTraceEvent(
unsigned char argTypes[1];
unsigned long long argValues[1];
setTraceValue(arg1Val, &argTypes[0], &argValues[0]);
+ if (isConvertableToTraceFormat(arg1Val)) {
+ ConvertableToTraceFormat* convertableValues[1];
+ assignIfConvertableToTraceFormat(convertableValues[0], arg1Val);
+ return TRACE_EVENT_API_ADD_TRACE_EVENT(
+ phase, categoryEnabled, name, id,
+ numArgs, &arg1Name, argTypes, argValues,
+ convertableValues,
+ flags);
+ }
return TRACE_EVENT_API_ADD_TRACE_EVENT(
phase, categoryEnabled, name, id,
numArgs, &arg1Name, argTypes, argValues,
flags);
}
-template<class ARG1_TYPE, class ARG2_TYPE>
+template<typename ARG1_TYPE, typename ARG2_TYPE>
static inline TraceEventHandle addTraceEvent(
char phase,
const unsigned char* categoryEnabled,
@@ -843,6 +901,16 @@ static inline TraceEventHandle addTraceEvent(
unsigned long long argValues[2];
setTraceValue(arg1Val, &argTypes[0], &argValues[0]);
setTraceValue(arg2Val, &argTypes[1], &argValues[1]);
+ if (isConvertableToTraceFormat(arg1Val) || isConvertableToTraceFormat(arg2Val)) {
+ ConvertableToTraceFormat* convertableValues[2];
+ assignIfConvertableToTraceFormat(convertableValues[0], arg1Val);
+ assignIfConvertableToTraceFormat(convertableValues[1], arg2Val);
+ return TRACE_EVENT_API_ADD_TRACE_EVENT(
+ phase, categoryEnabled, name, id,
+ numArgs, argNames, argTypes, argValues,
+ convertableValues,
+ flags);
+ }
return TRACE_EVENT_API_ADD_TRACE_EVENT(
phase, categoryEnabled, name, id,
numArgs, argNames, argTypes, argValues,