Copy flatbuffers efficiently and respecting DAGs.

Deduce the memory region needed to be copied by traversing the DAG, and
then copy it.  This has no mallocs (yay!), and works with DAGs.

There are some cases where we actually want to copy things recursively.
Do that when asked.

Change-Id: Ia0ffde26d569fa92ee2bbb49706c17d9d657d125
diff --git a/aos/events/logging/logger.cc b/aos/events/logging/logger.cc
index 3ecbf42..c38cf03 100644
--- a/aos/events/logging/logger.cc
+++ b/aos/events/logging/logger.cc
@@ -444,8 +444,9 @@
   flatbuffers::Offset<Node> logger_node_offset;
 
   if (configuration::MultiNode(configuration_)) {
-    node_offset = CopyFlatBuffer(node, &fbb);
-    logger_node_offset = CopyFlatBuffer(event_loop_->node(), &fbb);
+    // TODO(austin): Reuse the node we just copied in above.
+    node_offset = RecursiveCopyFlatBuffer(node, &fbb);
+    logger_node_offset = RecursiveCopyFlatBuffer(event_loop_->node(), &fbb);
   }
 
   aos::logger::LogFileHeader::Builder log_file_header_builder(fbb);
@@ -489,7 +490,12 @@
   log_file_header_builder.add_parts_index(0);
 
   fbb.FinishSizePrefixed(log_file_header_builder.Finish());
-  return fbb.Release();
+  aos::SizePrefixedFlatbufferDetachedBuffer<LogFileHeader> result(
+      fbb.Release());
+
+  CHECK(result.Verify()) << ": Built a corrupted header.";
+
+  return result;
 }
 
 void Logger::ResetStatisics() {