170 lines
6.2 KiB
C
170 lines
6.2 KiB
C
|
// Copyright 2014 The Chromium Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style license that can be
|
||
|
// found in the LICENSE file.
|
||
|
|
||
|
#ifndef BASE_TRACE_EVENT_TRACED_VALUE_H_
|
||
|
#define BASE_TRACE_EVENT_TRACED_VALUE_H_
|
||
|
|
||
|
#include <stddef.h>
|
||
|
|
||
|
#include <memory>
|
||
|
#include <string>
|
||
|
#include <vector>
|
||
|
|
||
|
#include "base/macros.h"
|
||
|
#include "base/pickle.h"
|
||
|
#include "base/strings/string_piece.h"
|
||
|
#include "base/trace_event/trace_event_impl.h"
|
||
|
|
||
|
namespace base {
|
||
|
|
||
|
class Value;
|
||
|
|
||
|
namespace trace_event {
|
||
|
|
||
|
class BASE_EXPORT TracedValue : public ConvertableToTraceFormat {
|
||
|
public:
|
||
|
// TODO(oysteine): |capacity| is not used in any production code. Consider
|
||
|
// removing it.
|
||
|
explicit TracedValue(size_t capacity = 0);
|
||
|
~TracedValue() override;
|
||
|
|
||
|
void EndDictionary();
|
||
|
void EndArray();
|
||
|
|
||
|
// These methods assume that |name| is a long lived "quoted" string.
|
||
|
void SetInteger(const char* name, int value);
|
||
|
void SetDouble(const char* name, double value);
|
||
|
void SetBoolean(const char* name, bool value);
|
||
|
void SetString(const char* name, base::StringPiece value);
|
||
|
void SetValue(const char* name, TracedValue* value);
|
||
|
void BeginDictionary(const char* name);
|
||
|
void BeginArray(const char* name);
|
||
|
|
||
|
// These, instead, can be safely passed a temporary string.
|
||
|
void SetIntegerWithCopiedName(base::StringPiece name, int value);
|
||
|
void SetDoubleWithCopiedName(base::StringPiece name, double value);
|
||
|
void SetBooleanWithCopiedName(base::StringPiece name, bool value);
|
||
|
void SetStringWithCopiedName(base::StringPiece name, base::StringPiece value);
|
||
|
void SetValueWithCopiedName(base::StringPiece name, TracedValue* value);
|
||
|
void BeginDictionaryWithCopiedName(base::StringPiece name);
|
||
|
void BeginArrayWithCopiedName(base::StringPiece name);
|
||
|
|
||
|
void AppendInteger(int);
|
||
|
void AppendDouble(double);
|
||
|
void AppendBoolean(bool);
|
||
|
void AppendString(base::StringPiece);
|
||
|
void BeginArray();
|
||
|
void BeginDictionary();
|
||
|
|
||
|
// ConvertableToTraceFormat implementation.
|
||
|
void AppendAsTraceFormat(std::string* out) const override;
|
||
|
bool AppendToProto(ProtoAppender* appender) override;
|
||
|
|
||
|
void EstimateTraceMemoryOverhead(TraceEventMemoryOverhead* overhead) override;
|
||
|
|
||
|
// A custom serialization class can be supplied by implementing the
|
||
|
// Writer interface and supplying a factory class to SetWriterFactoryCallback.
|
||
|
// Primarily used by Perfetto to write TracedValues directly into its proto
|
||
|
// format, which lets us do a direct memcpy() in AppendToProto() rather than
|
||
|
// a JSON serialization step in AppendAsTraceFormat.
|
||
|
class BASE_EXPORT Writer {
|
||
|
public:
|
||
|
virtual ~Writer() = default;
|
||
|
|
||
|
virtual void BeginArray() = 0;
|
||
|
virtual void BeginDictionary() = 0;
|
||
|
virtual void EndDictionary() = 0;
|
||
|
virtual void EndArray() = 0;
|
||
|
|
||
|
// These methods assume that |name| is a long lived "quoted" string.
|
||
|
virtual void SetInteger(const char* name, int value) = 0;
|
||
|
virtual void SetDouble(const char* name, double value) = 0;
|
||
|
virtual void SetBoolean(const char* name, bool value) = 0;
|
||
|
virtual void SetString(const char* name, base::StringPiece value) = 0;
|
||
|
virtual void SetValue(const char* name, Writer* value) = 0;
|
||
|
virtual void BeginDictionary(const char* name) = 0;
|
||
|
virtual void BeginArray(const char* name) = 0;
|
||
|
|
||
|
// These, instead, can be safely passed a temporary string.
|
||
|
virtual void SetIntegerWithCopiedName(base::StringPiece name,
|
||
|
int value) = 0;
|
||
|
virtual void SetDoubleWithCopiedName(base::StringPiece name,
|
||
|
double value) = 0;
|
||
|
virtual void SetBooleanWithCopiedName(base::StringPiece name,
|
||
|
bool value) = 0;
|
||
|
virtual void SetStringWithCopiedName(base::StringPiece name,
|
||
|
base::StringPiece value) = 0;
|
||
|
virtual void SetValueWithCopiedName(base::StringPiece name,
|
||
|
Writer* value) = 0;
|
||
|
virtual void BeginDictionaryWithCopiedName(base::StringPiece name) = 0;
|
||
|
virtual void BeginArrayWithCopiedName(base::StringPiece name) = 0;
|
||
|
|
||
|
virtual void AppendInteger(int) = 0;
|
||
|
virtual void AppendDouble(double) = 0;
|
||
|
virtual void AppendBoolean(bool) = 0;
|
||
|
virtual void AppendString(base::StringPiece) = 0;
|
||
|
|
||
|
virtual void AppendAsTraceFormat(std::string* out) const = 0;
|
||
|
|
||
|
virtual bool AppendToProto(ProtoAppender* appender);
|
||
|
|
||
|
virtual void EstimateTraceMemoryOverhead(
|
||
|
TraceEventMemoryOverhead* overhead) = 0;
|
||
|
|
||
|
virtual bool IsPickleWriter() const = 0;
|
||
|
virtual bool IsProtoWriter() const = 0;
|
||
|
};
|
||
|
|
||
|
typedef std::unique_ptr<Writer> (*WriterFactoryCallback)(size_t capacity);
|
||
|
static void SetWriterFactoryCallback(WriterFactoryCallback callback);
|
||
|
|
||
|
protected:
|
||
|
TracedValue(size_t capacity, bool forced_json);
|
||
|
|
||
|
std::unique_ptr<base::Value> ToBaseValue() const;
|
||
|
|
||
|
private:
|
||
|
std::unique_ptr<Writer> writer_;
|
||
|
|
||
|
#ifndef NDEBUG
|
||
|
// In debug builds checks the pairings of {Start,End}{Dictionary,Array}
|
||
|
std::vector<bool> nesting_stack_;
|
||
|
#endif
|
||
|
|
||
|
DISALLOW_COPY_AND_ASSIGN(TracedValue);
|
||
|
};
|
||
|
|
||
|
// TracedValue that is convertable to JSON format. This has lower performance
|
||
|
// than the default TracedValue in production code, and should be used only for
|
||
|
// testing and debugging. Should be avoided in tracing. It's for
|
||
|
// testing/debugging code calling value dumping function designed for tracing,
|
||
|
// like the following:
|
||
|
//
|
||
|
// TracedValueJSON value;
|
||
|
// AsValueInto(&value); // which is designed for tracing.
|
||
|
// return value.ToJSON();
|
||
|
//
|
||
|
// If the code is merely for testing/debugging, base::Value should be used
|
||
|
// instead.
|
||
|
class BASE_EXPORT TracedValueJSON : public TracedValue {
|
||
|
public:
|
||
|
explicit TracedValueJSON(size_t capacity = 0)
|
||
|
: TracedValue(capacity, /*forced_josn*/ true) {}
|
||
|
|
||
|
using TracedValue::ToBaseValue;
|
||
|
|
||
|
// Converts the value into a JSON string without formatting. Suitable for
|
||
|
// printing a simple value or printing a value in a single line context.
|
||
|
std::string ToJSON() const;
|
||
|
|
||
|
// Converts the value into a formatted JSON string, with indentation, spaces
|
||
|
// and new lines for better human readability of complex values.
|
||
|
std::string ToFormattedJSON() const;
|
||
|
};
|
||
|
|
||
|
} // namespace trace_event
|
||
|
} // namespace base
|
||
|
|
||
|
#endif // BASE_TRACE_EVENT_TRACED_VALUE_H_
|