0

Factor duplicated code to a single spot.

PerfettoProtoAppender can be shared between the two files that both
defined it.

Bug: 364987728
Change-Id: I62d0239082b7c146403fc4e7f254753a37925214
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6136374
Commit-Queue: Etienne Pierre-Doray <etiennep@chromium.org>
Auto-Submit: Peter Kasting <pkasting@chromium.org>
Commit-Queue: Peter Kasting <pkasting@chromium.org>
Reviewed-by: Etienne Pierre-Doray <etiennep@chromium.org>
Code-Coverage: findit-for-me@appspot.gserviceaccount.com <findit-for-me@appspot.gserviceaccount.com>
Cr-Commit-Position: refs/heads/main@{#1401420}
This commit is contained in:
Peter Kasting
2025-01-02 07:24:09 -08:00
committed by Chromium LUCI CQ
parent daf40c5b9e
commit c94122ccf2
8 changed files with 74 additions and 92 deletions

@ -2374,6 +2374,8 @@ component("base") {
"trace_event/memory_usage_estimator.cc",
"trace_event/memory_usage_estimator.h",
"trace_event/optional_trace_event.h",
"trace_event/perfetto_proto_appender.cc",
"trace_event/perfetto_proto_appender.h",
"trace_event/process_memory_dump.cc",
"trace_event/process_memory_dump.h",
"trace_event/trace_arguments.cc",

@ -0,0 +1,32 @@
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/trace_event/perfetto_proto_appender.h"
#include <stddef.h>
#include <stdint.h>
#include <vector>
#include "third_party/perfetto/include/perfetto/protozero/contiguous_memory_range.h"
#include "third_party/perfetto/protos/perfetto/trace/track_event/debug_annotation.pbzero.h"
namespace base::trace_event {
PerfettoProtoAppender::PerfettoProtoAppender(
perfetto::protos::pbzero::DebugAnnotation* proto)
: annotation_proto_(proto) {}
PerfettoProtoAppender::~PerfettoProtoAppender() = default;
void PerfettoProtoAppender::AddBuffer(uint8_t* begin, uint8_t* end) {
ranges_.push_back({.begin = begin, .end = end});
}
size_t PerfettoProtoAppender::Finalize(uint32_t field_id) {
return annotation_proto_->AppendScatteredBytes(field_id, ranges_.data(),
ranges_.size());
}
} // namespace base::trace_event

@ -0,0 +1,35 @@
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef BASE_TRACE_EVENT_PERFETTO_PROTO_APPENDER_H_
#define BASE_TRACE_EVENT_PERFETTO_PROTO_APPENDER_H_
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/trace_event/trace_arguments.h"
#include "third_party/perfetto/include/perfetto/protozero/contiguous_memory_range.h"
#include "third_party/perfetto/protos/perfetto/trace/track_event/debug_annotation.pbzero.h"
namespace base::trace_event {
class BASE_EXPORT PerfettoProtoAppender
: public ConvertableToTraceFormat::ProtoAppender {
public:
explicit PerfettoProtoAppender(
perfetto::protos::pbzero::DebugAnnotation* proto);
~PerfettoProtoAppender() override;
// ConvertableToTraceFormat::ProtoAppender:
void AddBuffer(uint8_t* begin, uint8_t* end) override;
size_t Finalize(uint32_t field_id) override;
private:
std::vector<protozero::ContiguousMemoryRange> ranges_;
raw_ptr<perfetto::protos::pbzero::DebugAnnotation> annotation_proto_;
};
} // namespace base::trace_event
#endif // BASE_TRACE_EVENT_PERFETTO_PROTO_APPENDER_H_

@ -26,6 +26,7 @@
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "base/trace_event/perfetto_proto_appender.h"
namespace base {
namespace trace_event {
@ -120,29 +121,6 @@ void AppendValueDebugString(const TraceArguments& args,
*out += ")";
}
class PerfettoProtoAppender : public ConvertableToTraceFormat::ProtoAppender {
public:
explicit PerfettoProtoAppender(
perfetto::protos::pbzero::DebugAnnotation* proto)
: annotation_proto_(proto) {}
~PerfettoProtoAppender() override = default;
void AddBuffer(uint8_t* begin, uint8_t* end) override {
ranges_.emplace_back();
ranges_.back().begin = begin;
ranges_.back().end = end;
}
size_t Finalize(uint32_t field_id) override {
return annotation_proto_->AppendScatteredBytes(field_id, ranges_.data(),
ranges_.size());
}
private:
std::vector<protozero::ContiguousMemoryRange> ranges_;
raw_ptr<perfetto::protos::pbzero::DebugAnnotation> annotation_proto_;
};
} // namespace
void StringStorage::Reset(size_t alloc_size) {

@ -39,6 +39,7 @@
#include "base/task/single_thread_task_runner.h"
#include "base/threading/platform_thread.h"
#include "base/time/time.h"
#include "base/trace_event/perfetto_proto_appender.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "third_party/perfetto/include/perfetto/ext/trace_processor/export_json.h" // nogncheck
@ -94,31 +95,6 @@ void InitializeMetadataEvent(TraceEvent* trace_event,
&args, TRACE_EVENT_FLAG_NONE);
}
class PerfettoProtoAppender
: public base::trace_event::ConvertableToTraceFormat::ProtoAppender {
public:
explicit PerfettoProtoAppender(
perfetto::protos::pbzero::DebugAnnotation* proto)
: annotation_proto_(proto) {}
~PerfettoProtoAppender() override = default;
// ProtoAppender implementation
void AddBuffer(uint8_t* begin, uint8_t* end) override {
ranges_.emplace_back();
ranges_.back().begin = begin;
ranges_.back().end = end;
}
size_t Finalize(uint32_t field_id) override {
return annotation_proto_->AppendScatteredBytes(field_id, ranges_.data(),
ranges_.size());
}
private:
std::vector<protozero::ContiguousMemoryRange> ranges_;
raw_ptr<perfetto::protos::pbzero::DebugAnnotation> annotation_proto_;
};
void AddConvertableToTraceFormat(
base::trace_event::ConvertableToTraceFormat* value,
perfetto::protos::pbzero::DebugAnnotation* annotation) {

@ -28,22 +28,6 @@ using TraceEvent = base::trace_event::TraceEvent;
namespace tracing {
PerfettoProtoAppender::PerfettoProtoAppender(DebugAnnotation* proto)
: annotation_proto_(proto) {}
PerfettoProtoAppender::~PerfettoProtoAppender() = default;
void PerfettoProtoAppender::AddBuffer(uint8_t* begin, uint8_t* end) {
ranges_.emplace_back();
ranges_.back().begin = begin;
ranges_.back().end = end;
}
size_t PerfettoProtoAppender::Finalize(uint32_t field_id) {
return annotation_proto_->AppendScatteredBytes(field_id, ranges_.data(),
ranges_.size());
}
namespace {
constexpr size_t kDefaultSliceSize = 128;

@ -6,36 +6,9 @@
#define SERVICES_TRACING_PUBLIC_CPP_PERFETTO_TRACED_VALUE_PROTO_WRITER_H_
#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "base/trace_event/trace_event_impl.h"
#include "third_party/perfetto/include/perfetto/protozero/contiguous_memory_range.h"
namespace perfetto {
namespace protos {
namespace pbzero {
class DebugAnnotation;
} // namespace pbzero
} // namespace protos
} // namespace perfetto
namespace tracing {
class COMPONENT_EXPORT(TRACING_CPP) PerfettoProtoAppender
: public base::trace_event::ConvertableToTraceFormat::ProtoAppender {
public:
explicit PerfettoProtoAppender(
perfetto::protos::pbzero::DebugAnnotation* proto);
~PerfettoProtoAppender() override;
// ProtoAppender implementation
void AddBuffer(uint8_t* begin, uint8_t* end) override;
size_t Finalize(uint32_t field_id) override;
private:
std::vector<protozero::ContiguousMemoryRange> ranges_;
raw_ptr<perfetto::protos::pbzero::DebugAnnotation> annotation_proto_;
};
void COMPONENT_EXPORT(TRACING_CPP) RegisterTracedValueProtoWriter();
} // namespace tracing

@ -13,6 +13,8 @@
#include <string>
#include "base/memory/raw_ptr.h"
#include "base/notreached.h"
#include "base/trace_event/perfetto_proto_appender.h"
#include "base/trace_event/traced_value.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/perfetto/include/perfetto/protozero/scattered_heap_buffer.h"
@ -107,7 +109,7 @@ bool IsValue(const NestedValue* proto_value, const char* value) {
NestedValue GetProtoFromTracedValue(TracedValue* traced_value) {
protozero::HeapBuffered<perfetto::protos::pbzero::DebugAnnotation> proto;
PerfettoProtoAppender proto_appender(proto.get());
base::trace_event::PerfettoProtoAppender proto_appender(proto.get());
EXPECT_TRUE(traced_value->AppendToProto(&proto_appender));
DebugAnnotation full_proto;