Convert actions to event loops

The logic gets significantly simpler due to Watchers.  But we also get
to port all the users over as well.

Change-Id: Ib4e75951e65f7431acc6c1548b7f1d20da3da295
diff --git a/aos/logging/implementations.cc b/aos/logging/implementations.cc
index 78b6724..f37f0ca 100644
--- a/aos/logging/implementations.cc
+++ b/aos/logging/implementations.cc
@@ -101,12 +101,14 @@
 
 }  // namespace
 
-void FillInMessageStructure(log_level level,
+void FillInMessageStructure(bool add_to_type_cache, log_level level,
                             const ::std::string &message_string, size_t size,
                             const MessageType *type,
                             const ::std::function<size_t(char *)> &serialize,
                             LogMessage *message) {
-  type_cache::AddShm(type->id);
+  if (add_to_type_cache) {
+    type_cache::AddShm(type->id);
+  }
   message->structure.type_id = type->id;
 
   FillInMessageBase(level, message);
@@ -280,8 +282,8 @@
     log_level level, const ::std::string &message_string, size_t size,
     const MessageType *type, const ::std::function<size_t(char *)> &serialize) {
   LogMessage message;
-  internal::FillInMessageStructure(level, message_string, size, type, serialize,
-                                   &message);
+  internal::FillInMessageStructure(fill_type_cache(), level, message_string,
+                                   size, type, serialize, &message);
   HandleMessage(message);
 }
 
@@ -403,8 +405,8 @@
                  size_t size, const MessageType *type,
                  const ::std::function<size_t(char *)> &serialize) override {
     LogMessage *message = GetMessageOrDie();
-    internal::FillInMessageStructure(level, message_string, size, type,
-                                     serialize, message);
+    internal::FillInMessageStructure(fill_type_cache(), level, message_string,
+                                     size, type, serialize, message);
     Write(message);
   }