blob: 1e30802059da449937d58f9e1d61ad5be39e36a3 [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 PERF_SERIALIZER_H_
#define PERF_SERIALIZER_H_
#include <string>
#include <vector>
#include "base/basictypes.h"
#include "perf_parser.h"
#include "quipper_proto.h"
namespace quipper {
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);
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 perf_trace_event_type& event_type,
quipper::PerfDataProto_PerfEventType* event_type_proto) const;
bool DeserializePerfEventType(
const quipper::PerfDataProto_PerfEventType& event_type_proto,
perf_trace_event_type* event_type) const;
bool SerializeEvent(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 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 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(build_id_event* const& 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;
// Populates |parsed_events_| with pointers event_t and perf_sample structs in
// each corresponding |events_| struct.
void SetRawEvents(size_t num_events);
#define SERIALIZEVECTORFUNCTION(name, vec_type, proto_type, function) \
bool name(const std::vector<vec_type>& from, \
RepeatedPtrField<proto_type>* to) const { \
to->Reserve(from.size()); \
for (size_t i = 0; i < from.size(); i++) { \
proto_type* to_element = to->Add(); \
if (to_element == NULL) \
return false; \
if (!function(from.at(i), to->Mutable(i))) \
return false; \
} \
return true; \
}
#define DESERIALIZEVECTORFUNCTION(name, vec_type, proto_type, function) \
bool name(const RepeatedPtrField<proto_type>& from, \
std::vector<vec_type>* to) const { \
to->resize(from.size()); \
for (int i = 0; i < from.size(); i++) { \
if (!function(from.Get(i), &to->at(i))) \
return false; \
} \
return true; \
}
SERIALIZEVECTORFUNCTION(SerializePerfFileAttrs, PerfFileAttr,
quipper::PerfDataProto_PerfFileAttr,
SerializePerfFileAttr)
DESERIALIZEVECTORFUNCTION(DeserializePerfFileAttrs, PerfFileAttr,
quipper::PerfDataProto_PerfFileAttr,
DeserializePerfFileAttr)
SERIALIZEVECTORFUNCTION(SerializePerfEventTypes, perf_trace_event_type,
quipper::PerfDataProto_PerfEventType,
SerializePerfEventType)
DESERIALIZEVECTORFUNCTION(DeserializePerfEventTypes, perf_trace_event_type,
quipper::PerfDataProto_PerfEventType,
DeserializePerfEventType)
SERIALIZEVECTORFUNCTION(SerializeEvents, ParsedEvent,
quipper::PerfDataProto_PerfEvent,
SerializeEvent)
DESERIALIZEVECTORFUNCTION(DeserializeEvents, ParsedEvent,
quipper::PerfDataProto_PerfEvent,
DeserializeEvent)
SERIALIZEVECTORFUNCTION(SerializeBuildIDEvents, build_id_event*,
quipper::PerfDataProto_PerfBuildID,
SerializeBuildIDEvent)
DESERIALIZEVECTORFUNCTION(DeserializeBuildIDEvents, build_id_event*,
quipper::PerfDataProto_PerfBuildID,
DeserializeBuildIDEvent)
SERIALIZEVECTORFUNCTION(SerializeUint32Metadata, PerfUint32Metadata,
quipper::PerfDataProto_PerfUint32Metadata,
SerializeSingleUint32Metadata)
DESERIALIZEVECTORFUNCTION(DeserializeUint32Metadata, PerfUint32Metadata,
quipper::PerfDataProto_PerfUint32Metadata,
DeserializeSingleUint32Metadata)
SERIALIZEVECTORFUNCTION(SerializeUint64Metadata, PerfUint64Metadata,
quipper::PerfDataProto_PerfUint64Metadata,
SerializeSingleUint64Metadata)
DESERIALIZEVECTORFUNCTION(DeserializeUint64Metadata, PerfUint64Metadata,
quipper::PerfDataProto_PerfUint64Metadata,
DeserializeSingleUint64Metadata)
SERIALIZEVECTORFUNCTION(SerializeNUMATopologyMetadata,
PerfNodeTopologyMetadata,
quipper::PerfDataProto_PerfNodeTopologyMetadata,
SerializeNodeTopologyMetadata)
DESERIALIZEVECTORFUNCTION(DeserializeNUMATopologyMetadata,
PerfNodeTopologyMetadata,
quipper::PerfDataProto_PerfNodeTopologyMetadata,
DeserializeNodeTopologyMetadata)
DISALLOW_COPY_AND_ASSIGN(PerfSerializer);
};
} // namespace quipper
#endif // PERF_SERIALIZER_H_