tp: defer including prelude into NotifyEof is called
Ensures we can create tables in the prelude.
Change-Id: I9f5027e1cfd8599c7c8a499696807eeb0b4833a4
diff --git a/Android.bp b/Android.bp
index 6f2d315..f724ada 100644
--- a/Android.bp
+++ b/Android.bp
@@ -13618,12 +13618,12 @@
"src/trace_processor/perfetto_sql/stdlib/linux/perf/spe.sql",
"src/trace_processor/perfetto_sql/stdlib/linux/threads.sql",
"src/trace_processor/perfetto_sql/stdlib/pkvm/hypervisor.sql",
- "src/trace_processor/perfetto_sql/stdlib/prelude/casts.sql",
- "src/trace_processor/perfetto_sql/stdlib/prelude/slices.sql",
- "src/trace_processor/perfetto_sql/stdlib/prelude/tables.sql",
- "src/trace_processor/perfetto_sql/stdlib/prelude/tables_views.sql",
- "src/trace_processor/perfetto_sql/stdlib/prelude/trace_bounds.sql",
- "src/trace_processor/perfetto_sql/stdlib/prelude/views.sql",
+ "src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/casts.sql",
+ "src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/slices.sql",
+ "src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/tables_views.sql",
+ "src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/views.sql",
+ "src/trace_processor/perfetto_sql/stdlib/prelude/before_eof/tables.sql",
+ "src/trace_processor/perfetto_sql/stdlib/prelude/before_eof/trace_bounds.sql",
"src/trace_processor/perfetto_sql/stdlib/sched/runnable.sql",
"src/trace_processor/perfetto_sql/stdlib/sched/states.sql",
"src/trace_processor/perfetto_sql/stdlib/sched/thread_executing_span.sql",
diff --git a/BUILD b/BUILD
index ef31a26..efe83c8 100644
--- a/BUILD
+++ b/BUILD
@@ -2973,17 +2973,29 @@
],
)
+# GN target: //src/trace_processor/perfetto_sql/stdlib/prelude/after_eof:after_eof
+perfetto_filegroup(
+ name = "src_trace_processor_perfetto_sql_stdlib_prelude_after_eof_after_eof",
+ srcs = [
+ "src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/casts.sql",
+ "src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/slices.sql",
+ "src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/tables_views.sql",
+ "src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/views.sql",
+ ],
+)
+
+# GN target: //src/trace_processor/perfetto_sql/stdlib/prelude/before_eof:before_eof
+perfetto_filegroup(
+ name = "src_trace_processor_perfetto_sql_stdlib_prelude_before_eof_before_eof",
+ srcs = [
+ "src/trace_processor/perfetto_sql/stdlib/prelude/before_eof/tables.sql",
+ "src/trace_processor/perfetto_sql/stdlib/prelude/before_eof/trace_bounds.sql",
+ ],
+)
+
# GN target: //src/trace_processor/perfetto_sql/stdlib/prelude:prelude
perfetto_filegroup(
name = "src_trace_processor_perfetto_sql_stdlib_prelude_prelude",
- srcs = [
- "src/trace_processor/perfetto_sql/stdlib/prelude/casts.sql",
- "src/trace_processor/perfetto_sql/stdlib/prelude/slices.sql",
- "src/trace_processor/perfetto_sql/stdlib/prelude/tables.sql",
- "src/trace_processor/perfetto_sql/stdlib/prelude/tables_views.sql",
- "src/trace_processor/perfetto_sql/stdlib/prelude/trace_bounds.sql",
- "src/trace_processor/perfetto_sql/stdlib/prelude/views.sql",
- ],
)
# GN target: //src/trace_processor/perfetto_sql/stdlib/sched:sched
@@ -3117,6 +3129,8 @@
":src_trace_processor_perfetto_sql_stdlib_linux_memory_memory",
":src_trace_processor_perfetto_sql_stdlib_linux_perf_perf",
":src_trace_processor_perfetto_sql_stdlib_pkvm_pkvm",
+ ":src_trace_processor_perfetto_sql_stdlib_prelude_after_eof_after_eof",
+ ":src_trace_processor_perfetto_sql_stdlib_prelude_before_eof_before_eof",
":src_trace_processor_perfetto_sql_stdlib_prelude_prelude",
":src_trace_processor_perfetto_sql_stdlib_sched_sched",
":src_trace_processor_perfetto_sql_stdlib_slices_slices",
diff --git a/src/trace_processor/perfetto_sql/stdlib/prelude/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/prelude/BUILD.gn
index 446a002..32aba6f 100644
--- a/src/trace_processor/perfetto_sql/stdlib/prelude/BUILD.gn
+++ b/src/trace_processor/perfetto_sql/stdlib/prelude/BUILD.gn
@@ -1,4 +1,4 @@
-# Copyright (C) 2023 The Android Open Source Project
+# Copyright (C) 2024 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.
@@ -15,12 +15,9 @@
import("../../../../../gn/perfetto_sql.gni")
perfetto_sql_source_set("prelude") {
- sources = [
- "casts.sql",
- "slices.sql",
- "tables.sql",
- "tables_views.sql",
- "trace_bounds.sql",
- "views.sql",
+ sources = []
+ deps = [
+ "after_eof",
+ "before_eof",
]
}
diff --git a/src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/BUILD.gn
new file mode 100644
index 0000000..c564a57
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/BUILD.gn
@@ -0,0 +1,24 @@
+# Copyright (C) 2023 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.
+
+import("../../../../../../gn/perfetto_sql.gni")
+
+perfetto_sql_source_set("after_eof") {
+ sources = [
+ "casts.sql",
+ "slices.sql",
+ "tables_views.sql",
+ "views.sql",
+ ]
+}
diff --git a/src/trace_processor/perfetto_sql/stdlib/prelude/casts.sql b/src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/casts.sql
similarity index 100%
rename from src/trace_processor/perfetto_sql/stdlib/prelude/casts.sql
rename to src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/casts.sql
diff --git a/src/trace_processor/perfetto_sql/stdlib/prelude/slices.sql b/src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/slices.sql
similarity index 95%
rename from src/trace_processor/perfetto_sql/stdlib/prelude/slices.sql
rename to src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/slices.sql
index 48f7132..f68f872 100644
--- a/src/trace_processor/perfetto_sql/stdlib/prelude/slices.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/slices.sql
@@ -13,7 +13,7 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
-INCLUDE PERFETTO MODULE prelude.views;
+INCLUDE PERFETTO MODULE prelude.after_eof.views;
-- Given two slice ids, returns whether the first is an ancestor of the second.
CREATE PERFETTO FUNCTION slice_is_ancestor(
diff --git a/src/trace_processor/perfetto_sql/stdlib/prelude/tables_views.sql b/src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/tables_views.sql
similarity index 99%
rename from src/trace_processor/perfetto_sql/stdlib/prelude/tables_views.sql
rename to src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/tables_views.sql
index 9ab309c..acd9cdb 100644
--- a/src/trace_processor/perfetto_sql/stdlib/prelude/tables_views.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/tables_views.sql
@@ -13,7 +13,7 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
-INCLUDE PERFETTO MODULE prelude.views;
+INCLUDE PERFETTO MODULE prelude.after_eof.views;
-- Tracks are a fundamental concept in trace processor and represent a
-- "timeline" for events of the same type and with the same context. See
diff --git a/src/trace_processor/perfetto_sql/stdlib/prelude/views.sql b/src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/views.sql
similarity index 99%
rename from src/trace_processor/perfetto_sql/stdlib/prelude/views.sql
rename to src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/views.sql
index fa1eece..8f3a90f 100644
--- a/src/trace_processor/perfetto_sql/stdlib/prelude/views.sql
+++ b/src/trace_processor/perfetto_sql/stdlib/prelude/after_eof/views.sql
@@ -13,7 +13,7 @@
-- See the License for the specific language governing permissions and
-- limitations under the License.
-INCLUDE PERFETTO MODULE prelude.casts;
+INCLUDE PERFETTO MODULE prelude.after_eof.casts;
-- Alias of the `counter` table.
CREATE PERFETTO VIEW counters(
@@ -146,7 +146,7 @@
-- Alias of `slice.thread_instruction_delta`.
thread_instruction_delta LONG,
-- Alias of `slice.cat`.
- cat LONG,
+ cat STRING,
-- Alias of `slice.slice_id`.
slice_id LONG
) AS
diff --git a/src/trace_processor/perfetto_sql/stdlib/prelude/before_eof/BUILD.gn b/src/trace_processor/perfetto_sql/stdlib/prelude/before_eof/BUILD.gn
new file mode 100644
index 0000000..ebe56f9
--- /dev/null
+++ b/src/trace_processor/perfetto_sql/stdlib/prelude/before_eof/BUILD.gn
@@ -0,0 +1,22 @@
+# Copyright (C) 2023 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.
+
+import("../../../../../../gn/perfetto_sql.gni")
+
+perfetto_sql_source_set("before_eof") {
+ sources = [
+ "tables.sql",
+ "trace_bounds.sql",
+ ]
+}
diff --git a/src/trace_processor/perfetto_sql/stdlib/prelude/tables.sql b/src/trace_processor/perfetto_sql/stdlib/prelude/before_eof/tables.sql
similarity index 100%
rename from src/trace_processor/perfetto_sql/stdlib/prelude/tables.sql
rename to src/trace_processor/perfetto_sql/stdlib/prelude/before_eof/tables.sql
diff --git a/src/trace_processor/perfetto_sql/stdlib/prelude/trace_bounds.sql b/src/trace_processor/perfetto_sql/stdlib/prelude/before_eof/trace_bounds.sql
similarity index 100%
rename from src/trace_processor/perfetto_sql/stdlib/prelude/trace_bounds.sql
rename to src/trace_processor/perfetto_sql/stdlib/prelude/before_eof/trace_bounds.sql
diff --git a/src/trace_processor/tables/track_tables.py b/src/trace_processor/tables/track_tables.py
index 41e412a..5d88aaa 100644
--- a/src/trace_processor/tables/track_tables.py
+++ b/src/trace_processor/tables/track_tables.py
@@ -198,6 +198,7 @@
doc='Tracks containing gpu_work_period events.',
group='Tracks',
columns={
+ 'uid': 'The uid associated with this track.',
'gpu_id': 'The identifier for the GPU.',
}))
diff --git a/src/trace_processor/trace_database_integrationtest.cc b/src/trace_processor/trace_database_integrationtest.cc
index d2d53f3..8397d8d 100644
--- a/src/trace_processor/trace_database_integrationtest.cc
+++ b/src/trace_processor/trace_database_integrationtest.cc
@@ -124,8 +124,9 @@
if (!status.ok())
return status;
}
- return processor_->NotifyEndOfFile();
+ return NotifyEndOfFile();
}
+ base::Status NotifyEndOfFile() { return processor_->NotifyEndOfFile(); }
Iterator Query(const std::string& query) {
return processor_->ExecuteQuery(query);
@@ -289,6 +290,8 @@
}
TEST_F(TraceProcessorIntegrationTest, ComputeMetricsFormattedExtension) {
+ ASSERT_OK(NotifyEndOfFile());
+
std::string metric_output;
base::Status status = Processor()->ComputeMetricText(
std::vector<std::string>{"test_chrome_metric"},
@@ -302,11 +305,12 @@
}
TEST_F(TraceProcessorIntegrationTest, ComputeMetricsFormattedNoExtension) {
+ ASSERT_OK(NotifyEndOfFile());
+
std::string metric_output;
- base::Status status = Processor()->ComputeMetricText(
+ ASSERT_OK(Processor()->ComputeMetricText(
std::vector<std::string>{"trace_metadata"},
- TraceProcessor::MetricResultFormat::kProtoText, &metric_output);
- ASSERT_TRUE(status.ok());
+ TraceProcessor::MetricResultFormat::kProtoText, &metric_output));
// Check that metric result starts with trace_metadata field. Since this is
// not an extension field, the field name is not fully qualified.
ASSERT_TRUE(metric_output.rfind("trace_metadata {") == 0);
@@ -410,13 +414,13 @@
}
TEST_F(TraceProcessorIntegrationTest, RestoreInitialTablesInvariant) {
- ASSERT_OK(Processor()->NotifyEndOfFile());
+ ASSERT_OK(NotifyEndOfFile());
uint64_t first_restore = RestoreInitialTables();
ASSERT_EQ(RestoreInitialTables(), first_restore);
}
TEST_F(TraceProcessorIntegrationTest, RestoreInitialTablesPerfettoSql) {
- ASSERT_OK(Processor()->NotifyEndOfFile());
+ ASSERT_OK(NotifyEndOfFile());
RestoreInitialTables();
for (int repeat = 0; repeat < 3; repeat++) {
@@ -465,7 +469,7 @@
}
TEST_F(TraceProcessorIntegrationTest, RestoreInitialTablesStandardSqlite) {
- ASSERT_OK(Processor()->NotifyEndOfFile());
+ ASSERT_OK(NotifyEndOfFile());
RestoreInitialTables();
for (int repeat = 0; repeat < 3; repeat++) {
@@ -491,7 +495,7 @@
}
TEST_F(TraceProcessorIntegrationTest, RestoreInitialTablesModules) {
- ASSERT_OK(Processor()->NotifyEndOfFile());
+ ASSERT_OK(NotifyEndOfFile());
RestoreInitialTables();
for (int repeat = 0; repeat < 3; repeat++) {
@@ -511,7 +515,7 @@
}
TEST_F(TraceProcessorIntegrationTest, RestoreInitialTablesSpanJoin) {
- ASSERT_OK(Processor()->NotifyEndOfFile());
+ ASSERT_OK(NotifyEndOfFile());
RestoreInitialTables();
for (int repeat = 0; repeat < 3; repeat++) {
@@ -550,7 +554,7 @@
}
TEST_F(TraceProcessorIntegrationTest, RestoreInitialTablesWithClause) {
- ASSERT_OK(Processor()->NotifyEndOfFile());
+ ASSERT_OK(NotifyEndOfFile());
RestoreInitialTables();
for (int repeat = 0; repeat < 3; repeat++) {
@@ -567,7 +571,7 @@
}
TEST_F(TraceProcessorIntegrationTest, RestoreInitialTablesIndex) {
- ASSERT_OK(Processor()->NotifyEndOfFile());
+ ASSERT_OK(NotifyEndOfFile());
RestoreInitialTables();
for (int repeat = 0; repeat < 3; repeat++) {
@@ -605,7 +609,7 @@
}
TEST_F(TraceProcessorIntegrationTest, RestoreInitialTablesDependents) {
- ASSERT_OK(Processor()->NotifyEndOfFile());
+ ASSERT_OK(NotifyEndOfFile());
{
auto it = Query("create perfetto table foo as select 1 as x");
ASSERT_FALSE(it.Next());
@@ -625,7 +629,7 @@
}
TEST_F(TraceProcessorIntegrationTest, RestoreDependentFunction) {
- ASSERT_OK(Processor()->NotifyEndOfFile());
+ ASSERT_OK(NotifyEndOfFile());
{
auto it =
Query("create perfetto function foo0() returns INT as select 1 as x");
@@ -645,7 +649,7 @@
}
TEST_F(TraceProcessorIntegrationTest, RestoreDependentTableFunction) {
- ASSERT_OK(Processor()->NotifyEndOfFile());
+ ASSERT_OK(NotifyEndOfFile());
{
auto it = Query(
"create perfetto function foo0() returns TABLE(x INT) "
@@ -735,6 +739,7 @@
}
TEST_F(TraceProcessorIntegrationTest, ErrorMessageExecuteQuery) {
+ ASSERT_OK(NotifyEndOfFile());
auto it = Query("select t from slice");
ASSERT_FALSE(it.Next());
ASSERT_FALSE(it.Status().ok());
@@ -748,6 +753,7 @@
}
TEST_F(TraceProcessorIntegrationTest, ErrorMessageMetricFile) {
+ ASSERT_OK(NotifyEndOfFile());
ASSERT_TRUE(
Processor()->RegisterMetric("foo/bar.sql", "select t from slice").ok());
@@ -767,6 +773,7 @@
}
TEST_F(TraceProcessorIntegrationTest, ErrorMessageModule) {
+ ASSERT_OK(NotifyEndOfFile());
SqlPackage module;
module.name = "foo";
module.modules.push_back(std::make_pair("foo.bar", "select t from slice"));
@@ -819,7 +826,7 @@
->Parse(TraceBlobView(
TraceBlob::CopyFrom(kBadData, sizeof(kBadData))))
.ok());
- Processor()->NotifyEndOfFile();
+ NotifyEndOfFile();
}
TEST_F(TraceProcessorIntegrationTest, NoNotifyEndOfFileCalled) {
diff --git a/src/trace_processor/trace_processor_impl.cc b/src/trace_processor/trace_processor_impl.cc
index c3c7fcb..e74df47 100644
--- a/src/trace_processor/trace_processor_impl.cc
+++ b/src/trace_processor/trace_processor_impl.cc
@@ -485,8 +485,7 @@
RegisterAdditionalModules(&context_);
InitPerfettoSqlEngine();
- sqlite_objects_post_constructor_initialization_ =
- engine_->SqliteRegisteredObjectCount();
+ sqlite_objects_post_prelude_ = engine_->SqliteRegisteredObjectCount();
bool skip_all_sql = std::find(config_.skip_builtin_metric_paths.begin(),
config_.skip_builtin_metric_paths.end(),
@@ -552,6 +551,9 @@
GetTraceTimestampBoundsNs(*context_.storage));
TraceProcessorStorageImpl::DestroyContext();
+
+ IncludeAfterEofPrelude();
+ sqlite_objects_post_prelude_ = engine_->SqliteRegisteredObjectCount();
return base::OkStatus();
}
@@ -559,15 +561,13 @@
// We should always have at least as many objects now as we did in the
// constructor.
uint64_t registered_count_before = engine_->SqliteRegisteredObjectCount();
- PERFETTO_CHECK(registered_count_before >=
- sqlite_objects_post_constructor_initialization_);
+ PERFETTO_CHECK(registered_count_before >= sqlite_objects_post_prelude_);
InitPerfettoSqlEngine();
// The registered count should now be the same as it was in the constructor.
uint64_t registered_count_after = engine_->SqliteRegisteredObjectCount();
- PERFETTO_CHECK(registered_count_after ==
- sqlite_objects_post_constructor_initialization_);
+ PERFETTO_CHECK(registered_count_after == sqlite_objects_post_prelude_);
return static_cast<size_t>(registered_count_before - registered_count_after);
}
@@ -1082,13 +1082,9 @@
}
// Import prelude package.
- {
- auto result = engine_->Execute(SqlSource::FromTraceProcessorImplementation(
- "INCLUDE PERFETTO MODULE prelude.*"));
- if (!result.status().ok()) {
- PERFETTO_FATAL("Failed to import prelude: %s",
- result.status().c_message());
- }
+ IncludeBeforeEofPrelude();
+ if (notify_eof_called_) {
+ IncludeAfterEofPrelude();
}
for (const auto& metric : sql_metrics_) {
@@ -1106,6 +1102,22 @@
}
}
+void TraceProcessorImpl::IncludeBeforeEofPrelude() {
+ auto result = engine_->Execute(SqlSource::FromTraceProcessorImplementation(
+ "INCLUDE PERFETTO MODULE prelude.before_eof.*"));
+ if (!result.status().ok()) {
+ PERFETTO_FATAL("Failed to import prelude: %s", result.status().c_message());
+ }
+}
+
+void TraceProcessorImpl::IncludeAfterEofPrelude() {
+ auto result = engine_->Execute(SqlSource::FromTraceProcessorImplementation(
+ "INCLUDE PERFETTO MODULE prelude.after_eof.*"));
+ if (!result.status().ok()) {
+ PERFETTO_FATAL("Failed to import prelude: %s", result.status().c_message());
+ }
+}
+
namespace {
class StringInterner {
diff --git a/src/trace_processor/trace_processor_impl.h b/src/trace_processor/trace_processor_impl.h
index 8f95290..3c86da0 100644
--- a/src/trace_processor/trace_processor_impl.h
+++ b/src/trace_processor/trace_processor_impl.h
@@ -119,6 +119,8 @@
bool IsRootMetricField(const std::string& metric_name);
void InitPerfettoSqlEngine();
+ void IncludeBeforeEofPrelude();
+ void IncludeAfterEofPrelude();
const Config config_;
std::unique_ptr<PerfettoSqlEngine> engine_;
@@ -138,8 +140,8 @@
// to prevent single-flow compiler optimizations in ExecuteQuery().
std::atomic<bool> query_interrupted_{false};
- // Track the number of objects registered with SQLite after the constructor.
- uint64_t sqlite_objects_post_constructor_initialization_ = 0;
+ // Track the number of objects registered with SQLite post prelude.
+ uint64_t sqlite_objects_post_prelude_ = 0;
std::string current_trace_name_;
uint64_t bytes_parsed_ = 0;
diff --git a/src/traceconv/trace_to_pprof_integrationtest.cc b/src/traceconv/trace_to_pprof_integrationtest.cc
index b852854..bff3e26 100644
--- a/src/traceconv/trace_to_pprof_integrationtest.cc
+++ b/src/traceconv/trace_to_pprof_integrationtest.cc
@@ -14,9 +14,14 @@
* limitations under the License.
*/
+#include <unistd.h>
#include "test/gtest_and_gmock.h"
#include <fstream>
+#include <ostream>
+#include <sstream>
+#include <string>
+#include <vector>
#include "perfetto/base/logging.h"
#include "perfetto/ext/base/file_utils.h"
@@ -30,7 +35,7 @@
using testing::Contains;
-pprof::PprofProfileReader convert_trace_to_pprof(
+pprof::PprofProfileReader ConvertTraceToPprof(
const std::string& input_file_name) {
const std::string trace_file = base::GetTestDataPath(input_file_name);
std::ifstream file_istream;
@@ -84,8 +89,7 @@
};
TEST_F(TraceToPprofTest, SummaryValues) {
- const auto pprof =
- convert_trace_to_pprof("test/data/heap_graph/heap_graph.pb");
+ const auto pprof = ConvertTraceToPprof("test/data/heap_graph/heap_graph.pb");
EXPECT_EQ(pprof.get_samples_value_sum("Foo", "Total allocation count"), 1);
EXPECT_EQ(pprof.get_samples_value_sum("Foo", "Total allocation size"), 32);
@@ -100,7 +104,7 @@
TEST_F(TraceToPprofTest, TreeLocationFunctionNames) {
const auto pprof =
- convert_trace_to_pprof("test/data/heap_graph/heap_graph_branching.pb");
+ ConvertTraceToPprof("test/data/heap_graph/heap_graph_branching.pb");
EXPECT_THAT(get_samples_function_names(pprof, "LeftChild0"),
Contains(std::vector<std::string>{"LeftChild0",
@@ -118,7 +122,7 @@
TEST_F(TraceToPprofTest, HugeSizes) {
const auto pprof =
- convert_trace_to_pprof("test/data/heap_graph/heap_graph_huge_size.pb");
+ ConvertTraceToPprof("test/data/heap_graph/heap_graph_huge_size.pb");
EXPECT_EQ(pprof.get_samples_value_sum("dev.perfetto.BigStuff",
"Total allocation size"),
3000000000);
@@ -138,7 +142,7 @@
TEST_F(TraceToPprofRealTraceTest, AllocationCountForClass) {
const auto pprof =
- convert_trace_to_pprof("test/data/system-server-heap-graph-new.pftrace");
+ ConvertTraceToPprof("test/data/system-server-heap-graph-new.pftrace");
EXPECT_EQ(pprof.get_samples_value_sum(
"android.content.pm.parsing.component.ParsedActivity",
diff --git a/src/traceconv/trace_to_profile.cc b/src/traceconv/trace_to_profile.cc
index b7676be..96b97fd 100644
--- a/src/traceconv/trace_to_profile.cc
+++ b/src/traceconv/trace_to_profile.cc
@@ -110,12 +110,11 @@
tp->Flush();
MaybeSymbolize(tp.get());
MaybeDeobfuscate(tp.get());
-
- TraceToPprof(tp.get(), &profiles, conversion_mode, conversion_flags, pid,
- timestamps);
if (auto status = tp->NotifyEndOfFile(); !status.ok()) {
return -1;
}
+ TraceToPprof(tp.get(), &profiles, conversion_mode, conversion_flags, pid,
+ timestamps);
if (profiles.empty()) {
return 0;
}