Commit 4810f41a authored by alph's avatar alph Committed by Commit bot

[tracing] Support ConvertableToTraceFormat argument type.

Drive-by: Use perfect forwarding for AddTraceEvent arguments.

BUG=406277

Committed: https://crrev.com/dcac49af485fe5d4c0027f153901435dbb29c232
Review-Url: https://codereview.chromium.org/2367603002
Cr-Original-Commit-Position: refs/heads/master@{#39742}
Cr-Commit-Position: refs/heads/master@{#39789}
parent dfb90f7c
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
#include <memory> #include <memory>
#include <vector> #include <vector>
#include "include/v8-platform.h"
namespace v8 { namespace v8 {
namespace platform { namespace platform {
namespace tracing { namespace tracing {
...@@ -28,19 +30,22 @@ class TraceObject { ...@@ -28,19 +30,22 @@ class TraceObject {
TraceObject() {} TraceObject() {}
~TraceObject(); ~TraceObject();
void Initialize(char phase, const uint8_t* category_enabled_flag, void Initialize(
const char* name, const char* scope, uint64_t id, char phase, const uint8_t* category_enabled_flag, const char* name,
uint64_t bind_id, int num_args, const char** arg_names, const char* scope, uint64_t id, uint64_t bind_id, int num_args,
const uint8_t* arg_types, const uint64_t* arg_values, const char** arg_names, const uint8_t* arg_types,
unsigned int flags); const uint64_t* arg_values,
std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
unsigned int flags);
void UpdateDuration(); void UpdateDuration();
void InitializeForTesting(char phase, const uint8_t* category_enabled_flag, void InitializeForTesting(
const char* name, const char* scope, uint64_t id, char phase, const uint8_t* category_enabled_flag, const char* name,
uint64_t bind_id, int num_args, const char* scope, uint64_t id, uint64_t bind_id, int num_args,
const char** arg_names, const uint8_t* arg_types, const char** arg_names, const uint8_t* arg_types,
const uint64_t* arg_values, unsigned int flags, const uint64_t* arg_values,
int pid, int tid, int64_t ts, int64_t tts, std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
uint64_t duration, uint64_t cpu_duration); unsigned int flags, int pid, int tid, int64_t ts, int64_t tts,
uint64_t duration, uint64_t cpu_duration);
int pid() const { return pid_; } int pid() const { return pid_; }
int tid() const { return tid_; } int tid() const { return tid_; }
...@@ -56,6 +61,9 @@ class TraceObject { ...@@ -56,6 +61,9 @@ class TraceObject {
const char** arg_names() { return arg_names_; } const char** arg_names() { return arg_names_; }
uint8_t* arg_types() { return arg_types_; } uint8_t* arg_types() { return arg_types_; }
ArgValue* arg_values() { return arg_values_; } ArgValue* arg_values() { return arg_values_; }
std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables() {
return arg_convertables_;
}
unsigned int flags() const { return flags_; } unsigned int flags() const { return flags_; }
int64_t ts() { return ts_; } int64_t ts() { return ts_; }
int64_t tts() { return tts_; } int64_t tts() { return tts_; }
...@@ -71,10 +79,12 @@ class TraceObject { ...@@ -71,10 +79,12 @@ class TraceObject {
const uint8_t* category_enabled_flag_; const uint8_t* category_enabled_flag_;
uint64_t id_; uint64_t id_;
uint64_t bind_id_; uint64_t bind_id_;
int num_args_; int num_args_ = 0;
const char* arg_names_[kTraceMaxNumArgs]; const char* arg_names_[kTraceMaxNumArgs];
uint8_t arg_types_[kTraceMaxNumArgs]; uint8_t arg_types_[kTraceMaxNumArgs];
ArgValue arg_values_[kTraceMaxNumArgs]; ArgValue arg_values_[kTraceMaxNumArgs];
std::unique_ptr<v8::ConvertableToTraceFormat>
arg_convertables_[kTraceMaxNumArgs];
char* parameter_copy_storage_ = nullptr; char* parameter_copy_storage_ = nullptr;
unsigned int flags_; unsigned int flags_;
int64_t ts_; int64_t ts_;
...@@ -221,11 +231,13 @@ class TracingController { ...@@ -221,11 +231,13 @@ class TracingController {
void Initialize(TraceBuffer* trace_buffer); void Initialize(TraceBuffer* trace_buffer);
const uint8_t* GetCategoryGroupEnabled(const char* category_group); const uint8_t* GetCategoryGroupEnabled(const char* category_group);
static const char* GetCategoryGroupName(const uint8_t* category_enabled_flag); static const char* GetCategoryGroupName(const uint8_t* category_enabled_flag);
uint64_t AddTraceEvent(char phase, const uint8_t* category_enabled_flag, uint64_t AddTraceEvent(
const char* name, const char* scope, uint64_t id, char phase, const uint8_t* category_enabled_flag, const char* name,
uint64_t bind_id, int32_t num_args, const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
const char** arg_names, const uint8_t* arg_types, const char** arg_names, const uint8_t* arg_types,
const uint64_t* arg_values, unsigned int flags); const uint64_t* arg_values,
std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
unsigned int flags);
void UpdateTraceEventDuration(const uint8_t* category_enabled_flag, void UpdateTraceEventDuration(const uint8_t* category_enabled_flag,
const char* name, uint64_t handle); const char* name, uint64_t handle);
......
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
#include <memory>
#include <string>
namespace v8 { namespace v8 {
...@@ -17,24 +19,38 @@ class Isolate; ...@@ -17,24 +19,38 @@ class Isolate;
*/ */
class Task { class Task {
public: public:
virtual ~Task() {} virtual ~Task() = default;
virtual void Run() = 0; virtual void Run() = 0;
}; };
/** /**
* An IdleTask represents a unit of work to be performed in idle time. * An IdleTask represents a unit of work to be performed in idle time.
* The Run method is invoked with an argument that specifies the deadline in * The Run method is invoked with an argument that specifies the deadline in
* seconds returned by MonotonicallyIncreasingTime(). * seconds returned by MonotonicallyIncreasingTime().
* The idle task is expected to complete by this deadline. * The idle task is expected to complete by this deadline.
*/ */
class IdleTask { class IdleTask {
public: public:
virtual ~IdleTask() {} virtual ~IdleTask() = default;
virtual void Run(double deadline_in_seconds) = 0; virtual void Run(double deadline_in_seconds) = 0;
}; };
/**
* The interface represents complex arguments to trace events.
*/
class ConvertableToTraceFormat {
public:
virtual ~ConvertableToTraceFormat() = default;
/**
* Append the class info to the provided |out| string. The appended
* data must be a valid JSON object. Strings must be properly quoted, and
* escaped. There is no processing applied to the content after it is
* appended.
*/
virtual void AppendAsTraceFormat(std::string* out) const = 0;
};
/** /**
* V8 Platform abstraction layer. * V8 Platform abstraction layer.
...@@ -54,7 +70,7 @@ class Platform { ...@@ -54,7 +70,7 @@ class Platform {
kLongRunningTask kLongRunningTask
}; };
virtual ~Platform() {} virtual ~Platform() = default;
/** /**
* Gets the number of threads that are used to execute background tasks. Is * Gets the number of threads that are used to execute background tasks. Is
...@@ -158,6 +174,25 @@ class Platform { ...@@ -158,6 +174,25 @@ class Platform {
return 0; return 0;
} }
/**
* Adds a trace event to the platform tracing system. This function call is
* usually the result of a TRACE_* macro from trace_event_common.h when
* tracing and the category of the particular trace are enabled. It is not
* advisable to call this function on its own; it is really only meant to be
* used by the trace macros. The returned handle can be used by
* UpdateTraceEventDuration to update the duration of COMPLETE events.
*/
virtual uint64_t AddTraceEvent(
char phase, const uint8_t* category_enabled_flag, const char* name,
const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
const char** arg_names, const uint8_t* arg_types,
const uint64_t* arg_values,
std::unique_ptr<ConvertableToTraceFormat>* arg_convertables,
unsigned int flags) {
return AddTraceEvent(phase, category_enabled_flag, name, scope, id, bind_id,
num_args, arg_names, arg_types, arg_values, flags);
}
/** /**
* Sets the duration field of a COMPLETE trace event. It must be called with * Sets the duration field of a COMPLETE trace event. It must be called with
* the handle returned from AddTraceEvent(). * the handle returned from AddTraceEvent().
......
...@@ -178,16 +178,17 @@ double DefaultPlatform::MonotonicallyIncreasingTime() { ...@@ -178,16 +178,17 @@ double DefaultPlatform::MonotonicallyIncreasingTime() {
static_cast<double>(base::Time::kMicrosecondsPerSecond); static_cast<double>(base::Time::kMicrosecondsPerSecond);
} }
uint64_t DefaultPlatform::AddTraceEvent( uint64_t DefaultPlatform::AddTraceEvent(
char phase, const uint8_t* category_enabled_flag, const char* name, char phase, const uint8_t* category_enabled_flag, const char* name,
const char* scope, uint64_t id, uint64_t bind_id, int num_args, const char* scope, uint64_t id, uint64_t bind_id, int num_args,
const char** arg_names, const uint8_t* arg_types, const char** arg_names, const uint8_t* arg_types,
const uint64_t* arg_values, unsigned int flags) { const uint64_t* arg_values,
std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
unsigned int flags) {
if (tracing_controller_) { if (tracing_controller_) {
return tracing_controller_->AddTraceEvent( return tracing_controller_->AddTraceEvent(
phase, category_enabled_flag, name, scope, id, bind_id, num_args, phase, category_enabled_flag, name, scope, id, bind_id, num_args,
arg_names, arg_types, arg_values, flags); arg_names, arg_types, arg_values, arg_convertables, flags);
} }
return 0; return 0;
......
...@@ -51,12 +51,13 @@ class DefaultPlatform : public Platform { ...@@ -51,12 +51,13 @@ class DefaultPlatform : public Platform {
const uint8_t* GetCategoryGroupEnabled(const char* name) override; const uint8_t* GetCategoryGroupEnabled(const char* name) override;
const char* GetCategoryGroupName( const char* GetCategoryGroupName(
const uint8_t* category_enabled_flag) override; const uint8_t* category_enabled_flag) override;
uint64_t AddTraceEvent(char phase, const uint8_t* category_enabled_flag, uint64_t AddTraceEvent(
const char* name, const char* scope, uint64_t id, char phase, const uint8_t* category_enabled_flag, const char* name,
uint64_t bind_id, int32_t num_args, const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
const char** arg_names, const uint8_t* arg_types, const char** arg_names, const uint8_t* arg_types,
const uint64_t* arg_values, const uint64_t* arg_values,
unsigned int flags) override; std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
unsigned int flags) override;
void UpdateTraceEventDuration(const uint8_t* category_enabled_flag, void UpdateTraceEventDuration(const uint8_t* category_enabled_flag,
const char* name, uint64_t handle) override; const char* name, uint64_t handle) override;
void SetTracingController(tracing::TracingController* tracing_controller); void SetTracingController(tracing::TracingController* tracing_controller);
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "include/libplatform/v8-tracing.h" #include "include/libplatform/v8-tracing.h"
#include "base/trace_event/common/trace_event_common.h" #include "base/trace_event/common/trace_event_common.h"
#include "include/v8-platform.h"
#include "src/base/platform/platform.h" #include "src/base/platform/platform.h"
#include "src/base/platform/time.h" #include "src/base/platform/time.h"
...@@ -30,11 +31,13 @@ V8_INLINE static void CopyTraceObjectParameter(char** buffer, ...@@ -30,11 +31,13 @@ V8_INLINE static void CopyTraceObjectParameter(char** buffer,
} }
} }
void TraceObject::Initialize(char phase, const uint8_t* category_enabled_flag, void TraceObject::Initialize(
const char* name, const char* scope, uint64_t id, char phase, const uint8_t* category_enabled_flag, const char* name,
uint64_t bind_id, int num_args, const char* scope, uint64_t id, uint64_t bind_id, int num_args,
const char** arg_names, const uint8_t* arg_types, const char** arg_names, const uint8_t* arg_types,
const uint64_t* arg_values, unsigned int flags) { const uint64_t* arg_values,
std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
unsigned int flags) {
pid_ = base::OS::GetCurrentProcessId(); pid_ = base::OS::GetCurrentProcessId();
tid_ = base::OS::GetCurrentThreadId(); tid_ = base::OS::GetCurrentThreadId();
phase_ = phase; phase_ = phase;
...@@ -55,6 +58,8 @@ void TraceObject::Initialize(char phase, const uint8_t* category_enabled_flag, ...@@ -55,6 +58,8 @@ void TraceObject::Initialize(char phase, const uint8_t* category_enabled_flag,
arg_names_[i] = arg_names[i]; arg_names_[i] = arg_names[i];
arg_values_[i].as_uint = arg_values[i]; arg_values_[i].as_uint = arg_values[i];
arg_types_[i] = arg_types[i]; arg_types_[i] = arg_types[i];
if (arg_types[i] == TRACE_VALUE_TYPE_CONVERTABLE)
arg_convertables_[i] = std::move(arg_convertables[i]);
} }
bool copy = !!(flags & TRACE_EVENT_FLAG_COPY); bool copy = !!(flags & TRACE_EVENT_FLAG_COPY);
...@@ -107,8 +112,10 @@ void TraceObject::InitializeForTesting( ...@@ -107,8 +112,10 @@ void TraceObject::InitializeForTesting(
char phase, const uint8_t* category_enabled_flag, const char* name, char phase, const uint8_t* category_enabled_flag, const char* name,
const char* scope, uint64_t id, uint64_t bind_id, int num_args, const char* scope, uint64_t id, uint64_t bind_id, int num_args,
const char** arg_names, const uint8_t* arg_types, const char** arg_names, const uint8_t* arg_types,
const uint64_t* arg_values, unsigned int flags, int pid, int tid, const uint64_t* arg_values,
int64_t ts, int64_t tts, uint64_t duration, uint64_t cpu_duration) { std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
unsigned int flags, int pid, int tid, int64_t ts, int64_t tts,
uint64_t duration, uint64_t cpu_duration) {
pid_ = pid; pid_ = pid;
tid_ = tid; tid_ = tid;
phase_ = phase; phase_ = phase;
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <cmath> #include <cmath>
#include "base/trace_event/common/trace_event_common.h" #include "base/trace_event/common/trace_event_common.h"
#include "include/v8-platform.h"
#include "src/base/platform/platform.h" #include "src/base/platform/platform.h"
namespace v8 { namespace v8 {
...@@ -112,6 +113,12 @@ void JSONTraceWriter::AppendArgValue(uint8_t type, ...@@ -112,6 +113,12 @@ void JSONTraceWriter::AppendArgValue(uint8_t type,
} }
} }
void JSONTraceWriter::AppendArgValue(ConvertableToTraceFormat* value) {
std::string arg_stringified;
value->AppendAsTraceFormat(&arg_stringified);
stream_ << arg_stringified;
}
JSONTraceWriter::JSONTraceWriter(std::ostream& stream) : stream_(stream) { JSONTraceWriter::JSONTraceWriter(std::ostream& stream) : stream_(stream) {
stream_ << "{\"traceEvents\":["; stream_ << "{\"traceEvents\":[";
} }
...@@ -143,10 +150,16 @@ void JSONTraceWriter::AppendTraceEvent(TraceObject* trace_event) { ...@@ -143,10 +150,16 @@ void JSONTraceWriter::AppendTraceEvent(TraceObject* trace_event) {
const char** arg_names = trace_event->arg_names(); const char** arg_names = trace_event->arg_names();
const uint8_t* arg_types = trace_event->arg_types(); const uint8_t* arg_types = trace_event->arg_types();
TraceObject::ArgValue* arg_values = trace_event->arg_values(); TraceObject::ArgValue* arg_values = trace_event->arg_values();
std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables =
trace_event->arg_convertables();
for (int i = 0; i < trace_event->num_args(); ++i) { for (int i = 0; i < trace_event->num_args(); ++i) {
if (i > 0) stream_ << ","; if (i > 0) stream_ << ",";
stream_ << "\"" << arg_names[i] << "\":"; stream_ << "\"" << arg_names[i] << "\":";
AppendArgValue(arg_types[i], arg_values[i]); if (arg_types[i] == TRACE_VALUE_TYPE_CONVERTABLE) {
AppendArgValue(arg_convertables[i].get());
} else {
AppendArgValue(arg_types[i], arg_values[i]);
}
} }
stream_ << "}}"; stream_ << "}}";
// TODO(fmeawad): Add support for Flow Events. // TODO(fmeawad): Add support for Flow Events.
......
...@@ -20,6 +20,7 @@ class JSONTraceWriter : public TraceWriter { ...@@ -20,6 +20,7 @@ class JSONTraceWriter : public TraceWriter {
private: private:
void AppendArgValue(uint8_t type, TraceObject::ArgValue value); void AppendArgValue(uint8_t type, TraceObject::ArgValue value);
void AppendArgValue(v8::ConvertableToTraceFormat*);
std::ostream& stream_; std::ostream& stream_;
bool append_comma_ = false; bool append_comma_ = false;
......
...@@ -46,13 +46,15 @@ uint64_t TracingController::AddTraceEvent( ...@@ -46,13 +46,15 @@ uint64_t TracingController::AddTraceEvent(
char phase, const uint8_t* category_enabled_flag, const char* name, char phase, const uint8_t* category_enabled_flag, const char* name,
const char* scope, uint64_t id, uint64_t bind_id, int num_args, const char* scope, uint64_t id, uint64_t bind_id, int num_args,
const char** arg_names, const uint8_t* arg_types, const char** arg_names, const uint8_t* arg_types,
const uint64_t* arg_values, unsigned int flags) { const uint64_t* arg_values,
std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
unsigned int flags) {
uint64_t handle; uint64_t handle;
TraceObject* trace_object = trace_buffer_->AddTraceEvent(&handle); TraceObject* trace_object = trace_buffer_->AddTraceEvent(&handle);
if (trace_object) { if (trace_object) {
trace_object->Initialize(phase, category_enabled_flag, name, scope, id, trace_object->Initialize(phase, category_enabled_flag, name, scope, id,
bind_id, num_args, arg_names, arg_types, bind_id, num_args, arg_names, arg_types,
arg_values, flags); arg_values, arg_convertables, flags);
} }
return handle; return handle;
} }
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#define SRC_TRACING_TRACE_EVENT_H_ #define SRC_TRACING_TRACE_EVENT_H_
#include <stddef.h> #include <stddef.h>
#include <memory>
#include "base/trace_event/common/trace_event_common.h" #include "base/trace_event/common/trace_event_common.h"
#include "include/v8-platform.h" #include "include/v8-platform.h"
...@@ -120,8 +121,7 @@ enum CategoryGroupEnabledFlags { ...@@ -120,8 +121,7 @@ enum CategoryGroupEnabledFlags {
// const uint8_t* arg_types, // const uint8_t* arg_types,
// const uint64_t* arg_values, // const uint64_t* arg_values,
// unsigned int flags) // unsigned int flags)
#define TRACE_EVENT_API_ADD_TRACE_EVENT \ #define TRACE_EVENT_API_ADD_TRACE_EVENT v8::internal::tracing::AddTraceEventImpl
v8::internal::tracing::TraceEventHelper::GetCurrentPlatform()->AddTraceEvent
// Set the duration field of a COMPLETE trace event. // Set the duration field of a COMPLETE trace event.
// void TRACE_EVENT_API_UPDATE_TRACE_EVENT_DURATION( // void TRACE_EVENT_API_UPDATE_TRACE_EVENT_DURATION(
...@@ -454,6 +454,28 @@ class TraceStringWithCopy { ...@@ -454,6 +454,28 @@ class TraceStringWithCopy {
const char* str_; const char* str_;
}; };
static V8_INLINE uint64_t AddTraceEventImpl(
char phase, const uint8_t* category_group_enabled, const char* name,
const char* scope, uint64_t id, uint64_t bind_id, int32_t num_args,
const char** arg_names, const uint8_t* arg_types,
const uint64_t* arg_values, unsigned int flags) {
std::unique_ptr<ConvertableToTraceFormat> arg_convertables[2];
if (num_args > 0 && arg_types[0] == TRACE_VALUE_TYPE_CONVERTABLE) {
arg_convertables[0].reset(reinterpret_cast<ConvertableToTraceFormat*>(
static_cast<intptr_t>(arg_values[0])));
}
if (num_args > 1 && arg_types[1] == TRACE_VALUE_TYPE_CONVERTABLE) {
arg_convertables[1].reset(reinterpret_cast<ConvertableToTraceFormat*>(
static_cast<intptr_t>(arg_values[1])));
}
DCHECK(num_args <= 2);
v8::Platform* platform =
v8::internal::tracing::TraceEventHelper::GetCurrentPlatform();
return platform->AddTraceEvent(phase, category_group_enabled, name, scope, id,
bind_id, num_args, arg_names, arg_types,
arg_values, arg_convertables, flags);
}
// Define SetTraceValue for each allowed type. It stores the type and // Define SetTraceValue for each allowed type. It stores the type and
// value in the return arguments. This allows this API to avoid declaring any // value in the return arguments. This allows this API to avoid declaring any
// structures so that it is portable to third_party libraries. // structures so that it is portable to third_party libraries.
...@@ -494,6 +516,19 @@ INTERNAL_DECLARE_SET_TRACE_VALUE(const TraceStringWithCopy&, as_string, ...@@ -494,6 +516,19 @@ INTERNAL_DECLARE_SET_TRACE_VALUE(const TraceStringWithCopy&, as_string,
#undef INTERNAL_DECLARE_SET_TRACE_VALUE #undef INTERNAL_DECLARE_SET_TRACE_VALUE
#undef INTERNAL_DECLARE_SET_TRACE_VALUE_INT #undef INTERNAL_DECLARE_SET_TRACE_VALUE_INT
static V8_INLINE void SetTraceValue(ConvertableToTraceFormat* convertable_value,
unsigned char* type, uint64_t* value) {
*type = TRACE_VALUE_TYPE_CONVERTABLE;
*value = static_cast<uint64_t>(reinterpret_cast<intptr_t>(convertable_value));
}
template <typename T>
static V8_INLINE typename std::enable_if<
std::is_convertible<T*, ConvertableToTraceFormat*>::value>::type
SetTraceValue(std::unique_ptr<T> ptr, unsigned char* type, uint64_t* value) {
SetTraceValue(ptr.release(), type, value);
}
// These AddTraceEvent template // These AddTraceEvent template
// function is defined here instead of in the macro, because the arg_values // function is defined here instead of in the macro, because the arg_values
// could be temporary objects, such as std::string. In order to store // could be temporary objects, such as std::string. In order to store
...@@ -506,36 +541,38 @@ static V8_INLINE uint64_t AddTraceEvent(char phase, ...@@ -506,36 +541,38 @@ static V8_INLINE uint64_t AddTraceEvent(char phase,
uint64_t id, uint64_t bind_id, uint64_t id, uint64_t bind_id,
unsigned int flags) { unsigned int flags) {
return TRACE_EVENT_API_ADD_TRACE_EVENT(phase, category_group_enabled, name, return TRACE_EVENT_API_ADD_TRACE_EVENT(phase, category_group_enabled, name,
scope, id, bind_id, kZeroNumArgs, NULL, scope, id, bind_id, kZeroNumArgs,
NULL, NULL, flags); nullptr, nullptr, nullptr, flags);
} }
template <class ARG1_TYPE> template <class ARG1_TYPE>
static V8_INLINE uint64_t AddTraceEvent( static V8_INLINE uint64_t AddTraceEvent(
char phase, const uint8_t* category_group_enabled, const char* name, char phase, const uint8_t* category_group_enabled, const char* name,
const char* scope, uint64_t id, uint64_t bind_id, unsigned int flags, const char* scope, uint64_t id, uint64_t bind_id, unsigned int flags,
const char* arg1_name, const ARG1_TYPE& arg1_val) { const char* arg1_name, ARG1_TYPE&& arg1_val) {
const int num_args = 1; const int num_args = 1;
uint8_t arg_types[1]; uint8_t arg_type;
uint64_t arg_values[1]; uint64_t arg_value;
SetTraceValue(arg1_val, &arg_types[0], &arg_values[0]); SetTraceValue(std::forward<ARG1_TYPE>(arg1_val), &arg_type, &arg_value);
return TRACE_EVENT_API_ADD_TRACE_EVENT( return TRACE_EVENT_API_ADD_TRACE_EVENT(
phase, category_group_enabled, name, scope, id, bind_id, num_args, phase, category_group_enabled, name, scope, id, bind_id, num_args,
&arg1_name, arg_types, arg_values, flags); &arg1_name, &arg_type, &arg_value, flags);
} }
template <class ARG1_TYPE, class ARG2_TYPE> template <class ARG1_TYPE, class ARG2_TYPE>
static V8_INLINE uint64_t AddTraceEvent( static V8_INLINE uint64_t AddTraceEvent(
char phase, const uint8_t* category_group_enabled, const char* name, char phase, const uint8_t* category_group_enabled, const char* name,
const char* scope, uint64_t id, uint64_t bind_id, unsigned int flags, const char* scope, uint64_t id, uint64_t bind_id, unsigned int flags,
const char* arg1_name, const ARG1_TYPE& arg1_val, const char* arg2_name, const char* arg1_name, ARG1_TYPE&& arg1_val, const char* arg2_name,
const ARG2_TYPE& arg2_val) { ARG2_TYPE&& arg2_val) {
const int num_args = 2; const int num_args = 2;
const char* arg_names[2] = {arg1_name, arg2_name}; const char* arg_names[2] = {arg1_name, arg2_name};
unsigned char arg_types[2]; unsigned char arg_types[2];
uint64_t arg_values[2]; uint64_t arg_values[2];
SetTraceValue(arg1_val, &arg_types[0], &arg_values[0]); SetTraceValue(std::forward<ARG1_TYPE>(arg1_val), &arg_types[0],
SetTraceValue(arg2_val, &arg_types[1], &arg_values[1]); &arg_values[0]);
SetTraceValue(std::forward<ARG2_TYPE>(arg2_val), &arg_types[1],
&arg_values[1]);
return TRACE_EVENT_API_ADD_TRACE_EVENT( return TRACE_EVENT_API_ADD_TRACE_EVENT(
phase, category_group_enabled, name, scope, id, bind_id, num_args, phase, category_group_enabled, name, scope, id, bind_id, num_args,
arg_names, arg_types, arg_values, flags); arg_names, arg_types, arg_values, flags);
......
...@@ -35,7 +35,8 @@ TEST(TestTraceObject) { ...@@ -35,7 +35,8 @@ TEST(TestTraceObject) {
TraceObject trace_object; TraceObject trace_object;
uint8_t category_enabled_flag = 41; uint8_t category_enabled_flag = 41;
trace_object.Initialize('X', &category_enabled_flag, "Test.Trace", trace_object.Initialize('X', &category_enabled_flag, "Test.Trace",
"Test.Scope", 42, 123, 0, NULL, NULL, NULL, 0); "Test.Scope", 42, 123, 0, nullptr, nullptr, nullptr,
nullptr, 0);
CHECK_EQ('X', trace_object.phase()); CHECK_EQ('X', trace_object.phase());
CHECK_EQ(category_enabled_flag, *trace_object.category_enabled_flag()); CHECK_EQ(category_enabled_flag, *trace_object.category_enabled_flag());
CHECK_EQ(std::string("Test.Trace"), std::string(trace_object.name())); CHECK_EQ(std::string("Test.Trace"), std::string(trace_object.name()));
...@@ -44,6 +45,19 @@ TEST(TestTraceObject) { ...@@ -44,6 +45,19 @@ TEST(TestTraceObject) {
CHECK_EQ(0, trace_object.cpu_duration()); CHECK_EQ(0, trace_object.cpu_duration());
} }
class ConvertableToTraceFormatMock : public v8::ConvertableToTraceFormat {
public:
explicit ConvertableToTraceFormatMock(int value) : value_(value) {}
void AppendAsTraceFormat(std::string* out) const override {
*out += "[" + std::to_string(value_) + "," + std::to_string(value_) + "]";
}
private:
int value_;
DISALLOW_COPY_AND_ASSIGN(ConvertableToTraceFormatMock);
};
class MockTraceWriter : public TraceWriter { class MockTraceWriter : public TraceWriter {
public: public:
void AppendTraceEvent(TraceObject* trace_event) override { void AppendTraceEvent(TraceObject* trace_event) override {
...@@ -75,7 +89,8 @@ TEST(TestTraceBufferRingBuffer) { ...@@ -75,7 +89,8 @@ TEST(TestTraceBufferRingBuffer) {
TraceObject* trace_object = ring_buffer->AddTraceEvent(&handles[i]); TraceObject* trace_object = ring_buffer->AddTraceEvent(&handles[i]);
CHECK_NOT_NULL(trace_object); CHECK_NOT_NULL(trace_object);
trace_object->Initialize('X', &category_enabled_flag, names[i].c_str(), trace_object->Initialize('X', &category_enabled_flag, names[i].c_str(),
"Test.Scope", 42, 123, 0, NULL, NULL, NULL, 0); "Test.Scope", 42, 123, 0, nullptr, nullptr,
nullptr, nullptr, 0);
trace_object = ring_buffer->GetEventByHandle(handles[i]); trace_object = ring_buffer->GetEventByHandle(handles[i]);
CHECK_NOT_NULL(trace_object); CHECK_NOT_NULL(trace_object);
CHECK_EQ('X', trace_object->phase()); CHECK_EQ('X', trace_object->phase());
...@@ -128,13 +143,13 @@ TEST(TestJSONTraceWriter) { ...@@ -128,13 +143,13 @@ TEST(TestJSONTraceWriter) {
TraceObject trace_object; TraceObject trace_object;
trace_object.InitializeForTesting( trace_object.InitializeForTesting(
'X', tracing_controller.GetCategoryGroupEnabled("v8-cat"), "Test0", 'X', tracing_controller.GetCategoryGroupEnabled("v8-cat"), "Test0",
v8::internal::tracing::kGlobalScope, 42, 123, 0, NULL, NULL, NULL, v8::internal::tracing::kGlobalScope, 42, 123, 0, nullptr, nullptr,
TRACE_EVENT_FLAG_HAS_ID, 11, 22, 100, 50, 33, 44); nullptr, nullptr, TRACE_EVENT_FLAG_HAS_ID, 11, 22, 100, 50, 33, 44);
writer->AppendTraceEvent(&trace_object); writer->AppendTraceEvent(&trace_object);
trace_object.InitializeForTesting( trace_object.InitializeForTesting(
'Y', tracing_controller.GetCategoryGroupEnabled("v8-cat"), "Test1", 'Y', tracing_controller.GetCategoryGroupEnabled("v8-cat"), "Test1",
v8::internal::tracing::kGlobalScope, 43, 456, 0, NULL, NULL, NULL, 0, v8::internal::tracing::kGlobalScope, 43, 456, 0, nullptr, nullptr,
55, 66, 110, 55, 77, 88); nullptr, nullptr, 0, 55, 66, 110, 55, 77, 88);
writer->AppendTraceEvent(&trace_object); writer->AppendTraceEvent(&trace_object);
tracing_controller.StopTracing(); tracing_controller.StopTracing();
} }
...@@ -264,6 +279,14 @@ TEST(TestTracingControllerMultipleArgsAndCopy) { ...@@ -264,6 +279,14 @@ TEST(TestTracingControllerMultipleArgsAndCopy) {
mm = "CHANGED"; mm = "CHANGED";
mmm = "CHANGED"; mmm = "CHANGED";
TRACE_EVENT_INSTANT1("v8", "v8.Test", TRACE_EVENT_SCOPE_THREAD, "a1",
new ConvertableToTraceFormatMock(42));
std::unique_ptr<ConvertableToTraceFormatMock> trace_event_arg(
new ConvertableToTraceFormatMock(42));
TRACE_EVENT_INSTANT2("v8", "v8.Test", TRACE_EVENT_SCOPE_THREAD, "a1",
std::move(trace_event_arg), "a2",
new ConvertableToTraceFormatMock(123));
tracing_controller.StopTracing(); tracing_controller.StopTracing();
} }
...@@ -274,7 +297,7 @@ TEST(TestTracingControllerMultipleArgsAndCopy) { ...@@ -274,7 +297,7 @@ TEST(TestTracingControllerMultipleArgsAndCopy) {
GetJSONStrings(all_names, trace_str, "\"name\"", "\"", "\""); GetJSONStrings(all_names, trace_str, "\"name\"", "\"", "\"");
GetJSONStrings(all_cats, trace_str, "\"cat\"", "\"", "\""); GetJSONStrings(all_cats, trace_str, "\"cat\"", "\"", "\"");
CHECK_EQ(all_args.size(), 22); CHECK_EQ(all_args.size(), 24);
CHECK_EQ(all_args[0], "\"aa\":11"); CHECK_EQ(all_args[0], "\"aa\":11");
CHECK_EQ(all_args[1], "\"bb\":22"); CHECK_EQ(all_args[1], "\"bb\":22");
CHECK_EQ(all_args[2], "\"cc\":33"); CHECK_EQ(all_args[2], "\"cc\":33");
...@@ -303,6 +326,8 @@ TEST(TestTracingControllerMultipleArgsAndCopy) { ...@@ -303,6 +326,8 @@ TEST(TestTracingControllerMultipleArgsAndCopy) {
CHECK_EQ(all_names[20], "INIT"); CHECK_EQ(all_names[20], "INIT");
CHECK_EQ(all_names[21], "INIT"); CHECK_EQ(all_names[21], "INIT");
CHECK_EQ(all_args[21], "\"mm1\":\"INIT\",\"mm2\":\"\\\"INIT\\\"\""); CHECK_EQ(all_args[21], "\"mm1\":\"INIT\",\"mm2\":\"\\\"INIT\\\"\"");
CHECK_EQ(all_args[22], "\"a1\":[42,42]");
CHECK_EQ(all_args[23], "\"a1\":[42,42],\"a2\":[123,123]");
i::V8::SetPlatformForTesting(old_platform); i::V8::SetPlatformForTesting(old_platform);
} }
......
...@@ -71,11 +71,13 @@ class MockTracingPlatform : public v8::Platform { ...@@ -71,11 +71,13 @@ class MockTracingPlatform : public v8::Platform {
void PerformDelayedTask() {} void PerformDelayedTask() {}
uint64_t AddTraceEvent(char phase, const uint8_t* category_enabled_flag, uint64_t AddTraceEvent(
const char* name, const char* scope, uint64_t id, char phase, const uint8_t* category_enabled_flag, const char* name,
uint64_t bind_id, int num_args, const char** arg_names, const char* scope, uint64_t id, uint64_t bind_id, int num_args,
const uint8_t* arg_types, const uint64_t* arg_values, const char** arg_names, const uint8_t* arg_types,
unsigned int flags) override { const uint64_t* arg_values,
std::unique_ptr<v8::ConvertableToTraceFormat>* arg_convertables,
unsigned int flags) override {
MockTraceObject* to = new MockTraceObject(phase, std::string(name), id, MockTraceObject* to = new MockTraceObject(phase, std::string(name), id,
bind_id, num_args, flags); bind_id, num_args, flags);
trace_object_list_.Add(to); trace_object_list_.Add(to);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment