summaryrefslogtreecommitdiffstats
path: root/include/framework/structure/BufferView.h
diff options
context:
space:
mode:
authorDouglas Rumbaugh <dbr4@psu.edu>2023-10-23 17:43:22 -0400
committerDouglas Rumbaugh <dbr4@psu.edu>2023-10-23 17:43:22 -0400
commit3afacb7702e6d8fa67749a2a41dc776d315e02a9 (patch)
tree8ea0e864d6098dd939e738a09033da7ed7877f4b /include/framework/structure/BufferView.h
parentb72103cb11347f0dd108bd2321f29b0d6ab05106 (diff)
downloaddynamic-extension-3afacb7702e6d8fa67749a2a41dc776d315e02a9.tar.gz
Began moving to an explicit epoch-based system
I started moving over to an explicit Epoch based system, which has necessitated a ton of changes throughout the code base. This will ultimately allow for a much cleaner set of abstractions for managing concurrency.
Diffstat (limited to 'include/framework/structure/BufferView.h')
-rw-r--r--include/framework/structure/BufferView.h124
1 files changed, 124 insertions, 0 deletions
diff --git a/include/framework/structure/BufferView.h b/include/framework/structure/BufferView.h
new file mode 100644
index 0000000..1efc1ac
--- /dev/null
+++ b/include/framework/structure/BufferView.h
@@ -0,0 +1,124 @@
+/*
+ * include/framework/structure/BufferView.h
+ *
+ * Copyright (C) 2023 Douglas Rumbaugh <drumbaugh@psu.edu>
+ *
+ * All rights reserved. Published under the Modified BSD License.
+ *
+ */
+#pragma once
+
+#include <cstdlib>
+#include <atomic>
+#include <condition_variable>
+#include <cassert>
+#include <numeric>
+#include <algorithm>
+#include <type_traits>
+
+#include "psu-util/alignment.h"
+#include "util/bf_config.h"
+#include "psu-ds/BloomFilter.h"
+#include "psu-ds/Alias.h"
+#include "psu-util/timer.h"
+#include "framework/interface/Record.h"
+#include "framework/structure/MutableBuffer.h"
+#include "framework/interface/Query.h"
+
+namespace de {
+
+template <RecordInterface R, QueryInterface Q>
+class BufferView {
+ typedef MutableBuffer<R> Buffer;
+public:
+ BufferView() = default;
+
+ BufferView(std::vector<Buffer*> buffers)
+ : m_buffers(buffers)
+ , m_cutoff(buffers[buffers->size()-1]->get_record_count())
+ {}
+
+ ~BufferView() = default;
+
+ bool delete_record(const R& rec) {
+ auto res = false;
+ for (auto buf : m_buffers) {
+ res = buf->delete_record(rec);
+ if (res) return true;
+ }
+ return false;
+ }
+
+ bool check_tombstone(const R& rec) {
+ auto res = false;
+ for (auto buf : m_buffers) {
+ res = buf->check_tombstone(rec);
+ if (res) return true;
+ }
+ return false;
+ }
+
+ size_t get_record_count() {
+ size_t reccnt = 0;
+ for (auto buf : m_buffers) {
+ reccnt += buf->get_record_count();
+ }
+ return reccnt;
+ }
+
+ size_t get_capacity() {
+ return m_buffers[0]->get_capacity();
+ }
+
+ bool is_full() {
+ return m_buffers[m_buffers.size() - 1]->is_full();
+ }
+
+ size_t get_tombstone_count() {
+ size_t tscnt = 0;
+ for (auto buf : m_buffers) {
+ tscnt += buf->get_tombstone_count();
+ }
+ return tscnt;
+ }
+
+ size_t get_memory_usage() {
+ size_t mem = 0;
+ for (auto buf : m_buffers) {
+ mem += buf->get_memory_usage();
+ }
+ return mem;
+ }
+
+ size_t get_aux_memory_usage() {
+ size_t mem = 0;
+ for (auto buf : m_buffers) {
+ mem += buf->get_aux_memory_usage();
+ }
+ return mem;
+ }
+
+ size_t get_tombstone_capacity() {
+ return m_buffers[0]->get_tombstone_capacity();
+ }
+
+ std::vector<void *> get_buffer_states(void *parms) {
+ std::vector<void *> states;
+
+ for (auto buf : m_buffers) {
+ states.push_back(Q::get_buffer_query_state(buf, parms));
+ }
+
+ return states;
+ }
+
+ std::vector<Buffer *> &get_buffers() {
+ return m_buffers;
+ }
+
+private:
+ std::vector<Buffer *> m_buffers;
+ size_t m_cutoff;
+};
+
+}