Add factory for SpanReader

Change-Id: Id3f382ed7c1ad4ca42ed674d1e8e98a2045ac8fc
Signed-off-by: James Kuszmaul <james.kuszmaul@bluerivertech.com>
diff --git a/aos/events/logging/logfile_utils.cc b/aos/events/logging/logfile_utils.cc
index 3c8c50d..fbec1b5 100644
--- a/aos/events/logging/logfile_utils.cc
+++ b/aos/events/logging/logfile_utils.cc
@@ -66,6 +66,8 @@
             "corrupt message found by MessageReader be silently ignored, "
             "providing access to all uncorrupted messages in a logfile.");
 
+DECLARE_bool(quiet_sorting);
+
 namespace aos::logger {
 namespace {
 namespace chrono = std::chrono;
@@ -1281,6 +1283,23 @@
   return true;
 }
 
+LogReadersPool::LogReadersPool(const LogSource *log_source, size_t pool_size)
+    : log_source_(log_source), pool_size_(pool_size) {}
+
+SpanReader *LogReadersPool::BorrowReader(std::string_view id) {
+  if (part_readers_.size() > pool_size_) {
+    // Don't leave arbitrary numbers of readers open, because they each take
+    // resources, so close a big batch at once periodically.
+    part_readers_.clear();
+  }
+  if (log_source_ == nullptr) {
+    part_readers_.emplace_back(id, FLAGS_quiet_sorting);
+  } else {
+    part_readers_.emplace_back(id, log_source_->GetDecoder(id));
+  }
+  return &part_readers_.back();
+}
+
 std::optional<SizePrefixedFlatbufferVector<LogFileHeader>> ReadHeader(
     SpanReader *span_reader) {
   absl::Span<const uint8_t> config_data = span_reader->ReadMessage();