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.