Add PeekMessage/ConsumeMessage to SpanReader
We have log files with duplicate headers on the front of them.
Considering they have useful data, add a flag which enables support for
detecting and recovering.
Change-Id: I30a85c7023b71dfa8ecce63fb8288565d5a01737
Signed-off-by: Austin Schuh <austin.schuh@bluerivertech.com>
diff --git a/aos/events/logging/logfile_utils.cc b/aos/events/logging/logfile_utils.cc
index f008ac6..f32b337 100644
--- a/aos/events/logging/logfile_utils.cc
+++ b/aos/events/logging/logfile_utils.cc
@@ -325,7 +325,7 @@
}
}
-absl::Span<const uint8_t> SpanReader::ReadMessage() {
+absl::Span<const uint8_t> SpanReader::PeekMessage() {
// Make sure we have enough for the size.
if (data_.size() - consumed_data_ < sizeof(flatbuffers::uoffset_t)) {
if (!ReadBlock()) {
@@ -355,11 +355,23 @@
// And return it, consuming the data.
const uint8_t *data_ptr = data_.data() + consumed_data_;
- consumed_data_ += data_size;
-
return absl::Span<const uint8_t>(data_ptr, data_size);
}
+void SpanReader::ConsumeMessage() {
+ consumed_data_ +=
+ flatbuffers::GetPrefixedSize(data_.data() + consumed_data_) +
+ sizeof(flatbuffers::uoffset_t);
+}
+
+absl::Span<const uint8_t> SpanReader::ReadMessage() {
+ absl::Span<const uint8_t> result = PeekMessage();
+ if (result != absl::Span<const uint8_t>()) {
+ ConsumeMessage();
+ }
+ return result;
+}
+
bool SpanReader::ReadBlock() {
// This is the amount of data we grab at a time. Doing larger chunks minimizes
// syscalls and helps decompressors batch things more efficiently.