blob: 0674a61433875505fe560fb3fa6f7ec20ea231db [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef SRC_PROFILING_COMMON_INTERNING_OUTPUT_H_
#define SRC_PROFILING_COMMON_INTERNING_OUTPUT_H_
#include <map>
#include <set>
#include <stdint.h>
#include "perfetto/ext/tracing/core/trace_writer.h"
#include "src/profiling/common/callstack_trie.h"
#include "src/profiling/common/interner.h"
#include "protos/perfetto/trace/interned_data/interned_data.pbzero.h"
namespace perfetto {
namespace profiling {
class InterningOutputTracker {
public:
// Writes out a full packet containing the "empty" (zero) internings.
static void WriteFixedInterningsPacket(TraceWriter* trace_writer,
uint32_t sequence_flags);
void WriteMap(const Interned<Mapping> map, protos::pbzero::InternedData* out);
void WriteFrame(Interned<Frame> frame, protos::pbzero::InternedData* out);
void WriteBuildIDString(const Interned<std::string>& str,
protos::pbzero::InternedData* out);
void WriteMappingPathString(const Interned<std::string>& str,
protos::pbzero::InternedData* out);
void WriteFunctionNameString(const Interned<std::string>& str,
protos::pbzero::InternedData* out);
// Writes out the callstack represented by the given node.
void WriteCallstack(GlobalCallstackTrie::Node* node,
GlobalCallstackTrie* trie,
protos::pbzero::InternedData* out);
bool IsCallstackNew(uint64_t callstack_id) {
return dumped_callstacks_.find(callstack_id) == dumped_callstacks_.end();
}
void ClearHistory();
// TODO(rsavitski): move elsewhere, used in heapprofd for orthogonal
// reasons. Shouldn't be cleared together with the rest of the incremental
// state.
uint64_t* HeapprofdNextIndexMutable() { return &next_index_; }
private:
// Map value is a bitfield distinguishing the distinct string fields
// the string can be emitted as, e.g. kDumpedBuildID.
std::map<InternID, int> dumped_strings_;
std::set<InternID> dumped_frames_;
std::set<InternID> dumped_mappings_;
std::set<uint64_t> dumped_callstacks_; // uses callstack trie's node ids
uint64_t next_index_ = 0;
};
} // namespace profiling
} // namespace perfetto
#endif // SRC_PROFILING_COMMON_INTERNING_OUTPUT_H_