blob: 3d3e02abdbab81c6cbe4bed1357d7b8667d54ec1 [file] [log] [blame]
// Copyright (c) 2012 The Chromium OS 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 CHROMIUMOS_WIDE_PROFILING_PERF_SERIALIZER_H_
#define CHROMIUMOS_WIDE_PROFILING_PERF_SERIALIZER_H_
#include <string>
#include <vector>
#include "base/macros.h"
#include "chromiumos-wide-profiling/perf_parser.h"
#include "chromiumos-wide-profiling/quipper_proto.h"
namespace quipper {
class PerfSerializer;
// Functor to serialize a vector of perf structs to a Proto repeated field,
// using a method serializes one such item.
// Overriding RefT allows serializing a vector of pointers to struct with
// a serialize member fuction that takes const T* (instead of T*const&).
template <typename Proto, typename T, typename RefT = const T&>
struct VectorSerializer {
bool operator()(const std::vector<T>& from,
RepeatedPtrField<Proto>* to) const {
to->Reserve(from.size());
for (size_t i = 0; i != from.size(); ++i) {
Proto* to_element = to->Add();
if (to_element == NULL) {
return false;
}
if (!(p->*serialize)(from[i], to_element)) {
return false;
}
}
return true;
}
const PerfSerializer* p;
bool (PerfSerializer::*serialize)(RefT, Proto*) const;
};
// Functor to deserialize a Proto repeated field to a vector of perf structs,
// using a method that deserializes one Proto.
template <typename Proto, typename T>
struct VectorDeserializer {
bool operator()(const RepeatedPtrField<Proto>& from,
std::vector<T>* to) const {
to->resize(from.size());
for (int i = 0; i != from.size(); ++i) {
if (!(p->*deserialize)(from.Get(i), &(*to)[i])) {
return false;
}
}
return true;
}
const PerfSerializer* p;
bool (PerfSerializer::*deserialize)(const Proto&, T*) const;
};
class PerfSerializer : public PerfParser {
public:
PerfSerializer();
~PerfSerializer();
// Converts raw perf file to protobuf.
bool SerializeFromFile(const string& filename,
quipper::PerfDataProto* perf_data_proto);
// Converts data inside PerfSerializer to protobuf.
bool Serialize(quipper::PerfDataProto* perf_data_proto);
// Converts perf data protobuf to perf data file.
bool DeserializeToFile(const quipper::PerfDataProto& perf_data_proto,
const string& filename);
// Reads in contents of protobuf to store locally. Does not write to any
// output files.
bool Deserialize(const quipper::PerfDataProto& perf_data_proto);
void set_serialize_sorted_events(bool sorted) {
serialize_sorted_events_ = sorted;
}
private:
bool SerializePerfFileAttr(
const PerfFileAttr& perf_file_attr,
quipper::PerfDataProto_PerfFileAttr* perf_file_attr_proto) const;
bool DeserializePerfFileAttr(
const quipper::PerfDataProto_PerfFileAttr& perf_file_attr_proto,
PerfFileAttr* perf_file_attr) const;
bool SerializePerfEventAttr(
const perf_event_attr& perf_event_attr,
quipper::PerfDataProto_PerfEventAttr* perf_event_attr_proto) const;
bool DeserializePerfEventAttr(
const quipper::PerfDataProto_PerfEventAttr& perf_event_attr_proto,
perf_event_attr* perf_event_attr) const;
bool SerializePerfEventType(
const PerfFileAttr& event_attr,
quipper::PerfDataProto_PerfEventType* event_type_proto) const;
bool DeserializePerfEventType(
const quipper::PerfDataProto_PerfEventType& event_type_proto,
PerfFileAttr* event_attr) const;
bool SerializeEvent(const ParsedEvent& event,
quipper::PerfDataProto_PerfEvent* event_proto) const;
bool SerializeEventPointer(
const ParsedEvent* event,
quipper::PerfDataProto_PerfEvent* event_proto) const;
bool DeserializeEvent(
const quipper::PerfDataProto_PerfEvent& event_proto,
ParsedEvent* event) const;
bool SerializeEventHeader(
const perf_event_header& header,
quipper::PerfDataProto_EventHeader* header_proto) const;
bool DeserializeEventHeader(
const quipper::PerfDataProto_EventHeader& header_proto,
perf_event_header* header) const;
bool SerializeRecordSample(const event_t& event,
quipper::PerfDataProto_SampleEvent* sample) const;
bool DeserializeRecordSample(
const quipper::PerfDataProto_SampleEvent& sample,
event_t* event) const;
bool SerializeMMapSample(const event_t& event,
quipper::PerfDataProto_MMapEvent* sample) const;
bool DeserializeMMapSample(
const quipper::PerfDataProto_MMapEvent& sample,
event_t* event) const;
bool SerializeMMap2Sample(const event_t& event,
quipper::PerfDataProto_MMapEvent* sample) const;
bool DeserializeMMap2Sample(
const quipper::PerfDataProto_MMapEvent& sample,
event_t* event) const;
bool SerializeCommSample(
const event_t& event,
quipper::PerfDataProto_CommEvent* sample) const;
bool DeserializeCommSample(
const quipper::PerfDataProto_CommEvent& sample,
event_t* event) const;
bool SerializeForkSample(const event_t& event,
quipper::PerfDataProto_ForkEvent* sample) const;
bool DeserializeForkSample(
const quipper::PerfDataProto_ForkEvent& sample,
event_t* event) const;
bool SerializeLostSample(const event_t& event,
quipper::PerfDataProto_LostEvent* sample) const;
bool DeserializeLostSample(
const quipper::PerfDataProto_LostEvent& sample,
event_t* event) const;
bool SerializeThrottleSample(const event_t& event,
quipper::PerfDataProto_ThrottleEvent* sample) const;
bool DeserializeThrottleSample(
const quipper::PerfDataProto_ThrottleEvent& sample,
event_t* event) const;
bool SerializeReadSample(const event_t& event,
quipper::PerfDataProto_ReadEvent* sample) const;
bool DeserializeReadSample(
const quipper::PerfDataProto_ReadEvent& sample,
event_t* event) const;
bool SerializeSampleInfo(
const event_t& event,
quipper::PerfDataProto_SampleInfo* sample_info) const;
bool DeserializeSampleInfo(
const quipper::PerfDataProto_SampleInfo& info,
event_t* event) const;
bool SerializeTracingMetadata(const std::vector<char>& from,
PerfDataProto* to) const;
bool DeserializeTracingMetadata(const PerfDataProto& from,
std::vector<char>* to) const;
bool SerializeBuildIDs(
const std::vector<build_id_event*>& from,
RepeatedPtrField<PerfDataProto_PerfBuildID>* to)
const;
bool DeserializeBuildIDs(
const RepeatedPtrField<PerfDataProto_PerfBuildID>& from,
std::vector<build_id_event*>* to) const;
bool SerializeMetadata(PerfDataProto* to) const;
bool DeserializeMetadata(const PerfDataProto& from);
bool SerializeBuildIDEvent(const build_id_event* from,
PerfDataProto_PerfBuildID* to) const;
bool DeserializeBuildIDEvent(const PerfDataProto_PerfBuildID& from,
build_id_event** to) const;
bool SerializeSingleUint32Metadata(
const PerfUint32Metadata& metadata,
PerfDataProto_PerfUint32Metadata* proto_metadata) const;
bool DeserializeSingleUint32Metadata(
const PerfDataProto_PerfUint32Metadata& proto_metadata,
PerfUint32Metadata* metadata) const;
bool SerializeSingleUint64Metadata(
const PerfUint64Metadata& metadata,
PerfDataProto_PerfUint64Metadata* proto_metadata) const;
bool DeserializeSingleUint64Metadata(
const PerfDataProto_PerfUint64Metadata& proto_metadata,
PerfUint64Metadata* metadata) const;
bool SerializeCPUTopologyMetadata(
const PerfCPUTopologyMetadata& metadata,
PerfDataProto_PerfCPUTopologyMetadata* proto_metadata) const;
bool DeserializeCPUTopologyMetadata(
const PerfDataProto_PerfCPUTopologyMetadata& proto_metadata,
PerfCPUTopologyMetadata* metadata) const;
bool SerializeNodeTopologyMetadata(
const PerfNodeTopologyMetadata& metadata,
PerfDataProto_PerfNodeTopologyMetadata* proto_metadata) const;
bool DeserializeNodeTopologyMetadata(
const PerfDataProto_PerfNodeTopologyMetadata& proto_metadata,
PerfNodeTopologyMetadata* metadata) const;
const VectorSerializer<PerfDataProto_PerfFileAttr, PerfFileAttr>
SerializePerfFileAttrs = {this, &PerfSerializer::SerializePerfFileAttr};
const VectorDeserializer<PerfDataProto_PerfFileAttr, PerfFileAttr>
DeserializePerfFileAttrs = {
this, &PerfSerializer::DeserializePerfFileAttr};
const VectorSerializer<PerfDataProto_PerfEventType, PerfFileAttr>
SerializePerfEventTypes = {this, &PerfSerializer::SerializePerfEventType};
const VectorDeserializer<PerfDataProto_PerfEventType, PerfFileAttr>
DeserializePerfEventTypes = {
this, &PerfSerializer::DeserializePerfEventType};
const VectorSerializer<PerfDataProto_PerfEvent, ParsedEvent>
SerializeEvents = {this, &PerfSerializer::SerializeEvent};
const VectorSerializer<PerfDataProto_PerfEvent,
ParsedEvent*, const ParsedEvent*>
SerializeEventPointers = {this, &PerfSerializer::SerializeEventPointer};
const VectorDeserializer<PerfDataProto_PerfEvent, ParsedEvent>
DeserializeEvents = {this, &PerfSerializer::DeserializeEvent};
const VectorSerializer<PerfDataProto_PerfBuildID,
build_id_event*, const build_id_event*>
SerializeBuildIDEvents = {this, &PerfSerializer::SerializeBuildIDEvent};
const VectorDeserializer<PerfDataProto_PerfBuildID, build_id_event*>
DeserializeBuildIDEvents = {
this, &PerfSerializer::DeserializeBuildIDEvent};
const VectorSerializer<PerfDataProto_PerfUint32Metadata, PerfUint32Metadata>
SerializeUint32Metadata = {
this, &PerfSerializer::SerializeSingleUint32Metadata};
const VectorDeserializer<PerfDataProto_PerfUint32Metadata, PerfUint32Metadata>
DeserializeUint32Metadata = {
this, &PerfSerializer::DeserializeSingleUint32Metadata};
const VectorSerializer<PerfDataProto_PerfUint64Metadata, PerfUint64Metadata>
SerializeUint64Metadata = {
this, &PerfSerializer::SerializeSingleUint64Metadata};
const VectorDeserializer<PerfDataProto_PerfUint64Metadata, PerfUint64Metadata>
DeserializeUint64Metadata = {
this, &PerfSerializer::DeserializeSingleUint64Metadata};
const VectorSerializer<PerfDataProto_PerfNodeTopologyMetadata,
PerfNodeTopologyMetadata>
SerializeNUMATopologyMetadata = {
this, &PerfSerializer::SerializeNodeTopologyMetadata};
const VectorDeserializer<PerfDataProto_PerfNodeTopologyMetadata,
PerfNodeTopologyMetadata>
DeserializeNUMATopologyMetadata = {
this, &PerfSerializer::DeserializeNodeTopologyMetadata};
// Set this flag to serialize perf events in chronological order, rather than
// the order in which they appear in the raw data.
bool serialize_sorted_events_;
DISALLOW_COPY_AND_ASSIGN(PerfSerializer);
};
} // namespace quipper
#endif // CHROMIUMOS_WIDE_PROFILING_PERF_SERIALIZER_H_