From 1713386869670fd1364d5cf944107f216904200f Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Sun, 29 Oct 2023 16:50:01 -0700 Subject: [PATCH] [wpiutil] ProtobufMessageDatabase: Fix out-of-order Add() rebuild (#5845) --- .../cpp/protobuf/ProtobufMessageDatabase.cpp | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/wpiutil/src/main/native/cpp/protobuf/ProtobufMessageDatabase.cpp b/wpiutil/src/main/native/cpp/protobuf/ProtobufMessageDatabase.cpp index 7bf529fe52..144bd03893 100644 --- a/wpiutil/src/main/native/cpp/protobuf/ProtobufMessageDatabase.cpp +++ b/wpiutil/src/main/native/cpp/protobuf/ProtobufMessageDatabase.cpp @@ -15,6 +15,7 @@ using google::protobuf::Message; bool ProtobufMessageDatabase::Add(std::string_view filename, std::span data) { auto& file = m_files[filename]; + bool needsRebuild = false; if (file.complete) { file.complete = false; @@ -27,14 +28,8 @@ bool ProtobufMessageDatabase::Add(std::string_view filename, for (auto&& p : m_files) { p.second.inPool = false; } - for (auto&& p : m_files) { - if (p.second.complete && !p.second.inPool) { - Rebuild(p.second); - } - } - // clear messages and reset factory; Find() will recreate as needed - m_factory = std::make_unique(); + needsRebuild = true; } if (!file.proto) { @@ -54,6 +49,19 @@ bool ProtobufMessageDatabase::Add(std::string_view filename, return false; } + // rebuild if necessary; we do this after the parse due to dependencies + if (needsRebuild) { + for (auto&& p : m_files) { + if (p.second.complete && !p.second.inPool) { + Rebuild(p.second); + } + } + + // clear messages and reset factory; Find() will recreate as needed + m_factory = std::make_unique(); + } + + // build this one Build(filename, file); return true; } @@ -118,5 +126,6 @@ bool ProtobufMessageDatabase::Rebuild(ProtoFile& file) { return false; } file.inPool = true; + file.complete = true; return true; }