Add should_fetch to lockless_queue so we can conditionally fetch

For logging, we want to be able to only fetch the next message if it is
time to do so.  This adds a callback which is provided all the context
information at the right point to decide if we actually fetch or not.
Next step is to actually expose it through EventLoop.

Change-Id: Ic15eedc46116f8acfcb5a80ed551e89e9d6b7fa8
Signed-off-by: James Kuszmaul <james.kuszmaul@bluerivertech.com>
diff --git a/aos/events/event_loop.h b/aos/events/event_loop.h
index e53bc21..17e3e00 100644
--- a/aos/events/event_loop.h
+++ b/aos/events/event_loop.h
@@ -15,6 +15,7 @@
 #include "aos/configuration.h"
 #include "aos/configuration_generated.h"
 #include "aos/events/channel_preallocated_allocator.h"
+#include "aos/events/context.h"
 #include "aos/events/event_loop_event.h"
 #include "aos/events/event_loop_generated.h"
 #include "aos/events/timing_statistics.h"
@@ -34,64 +35,6 @@
 class EventLoop;
 class WatcherState;
 
-// Struct available on Watchers, Fetchers, Timers, and PhasedLoops with context
-// about the current message.
-struct Context {
-  // Time that the message was sent on this node, or the timer was triggered.
-  monotonic_clock::time_point monotonic_event_time;
-  // Realtime the message was sent on this node.  This is set to min_time for
-  // Timers and PhasedLoops.
-  realtime_clock::time_point realtime_event_time;
-
-  // The rest are only valid for Watchers and Fetchers.
-
-  // For a single-node configuration, these two are identical to *_event_time.
-  // In a multinode configuration, these are the times that the message was
-  // sent on the original node.
-  monotonic_clock::time_point monotonic_remote_time;
-  realtime_clock::time_point realtime_remote_time;
-
-  // Index in the queue.
-  uint32_t queue_index;
-  // Index into the remote queue.  Useful to determine if data was lost.  In a
-  // single-node configuration, this will match queue_index.
-  uint32_t remote_queue_index;
-
-  // Size of the data sent.
-  size_t size;
-  // Pointer to the data.
-  const void *data;
-
-  // Index of the message buffer. This will be in [0, NumberBuffers) on
-  // read_method=PIN channels, and -1 for other channels.
-  //
-  // This only tells you about the underlying storage for this message, not
-  // anything about its position in the queue. This is only useful for advanced
-  // zero-copy use cases, on read_method=PIN channels.
-  //
-  // This will uniquely identify a message on this channel at a point in time.
-  // For senders, this point in time is while the sender has the message. With
-  // read_method==PIN, this point in time includes while the caller has access
-  // to this context. For other read_methods, this point in time may be before
-  // the caller has access to this context, which makes this pretty useless.
-  int buffer_index;
-
-  // UUID of the remote node which sent this message, or this node in the case
-  // of events which are local to this node.
-  UUID source_boot_uuid = UUID::Zero();
-
-  // Efficiently copies the flatbuffer into a FlatbufferVector, allocating
-  // memory in the process.  It is vital that T matches the type of the
-  // underlying flatbuffer.
-  template <typename T>
-  FlatbufferVector<T> CopyFlatBuffer() const {
-    ResizeableBuffer buffer;
-    buffer.resize(size);
-    memcpy(buffer.data(), data, size);
-    return FlatbufferVector<T>(std::move(buffer));
-  }
-};
-
 // Raw version of fetcher. Contains a local variable that the fetcher will
 // update.  This is used for reflection and as an interface to implement typed
 // fetchers.