diff options
| author | Douglas Rumbaugh <dbr4@psu.edu> | 2024-01-11 11:31:33 -0500 |
|---|---|---|
| committer | Douglas Rumbaugh <dbr4@psu.edu> | 2024-01-11 11:31:33 -0500 |
| commit | 5db0f96e9f3d2505b5f751abc133cbf7e13b5129 (patch) | |
| tree | 0a66f0d6d54231e9e6d6742538e7fb99c067455b /include/framework/structure/BufferView.h | |
| parent | eb19677340be6f0befe9da2199e5832af51eea0d (diff) | |
| download | dynamic-extension-5db0f96e9f3d2505b5f751abc133cbf7e13b5129.tar.gz | |
Fixed some potential buffer-related concurrency bugs
Diffstat (limited to 'include/framework/structure/BufferView.h')
| -rw-r--r-- | include/framework/structure/BufferView.h | 45 |
1 files changed, 31 insertions, 14 deletions
diff --git a/include/framework/structure/BufferView.h b/include/framework/structure/BufferView.h index 7e8af45..00b6101 100644 --- a/include/framework/structure/BufferView.h +++ b/include/framework/structure/BufferView.h @@ -18,31 +18,43 @@ namespace de { -typedef std::function<void(void*, size_t)> ReleaseFunction; +typedef std::_Bind<void (*(void*, long unsigned int))(void*, long unsigned int)> ReleaseFunction; template <RecordInterface R> class BufferView { public: BufferView() = default; - BufferView(const Wrapped<R> *buffer, size_t head, size_t tail, psudb::BloomFilter<R> *filter, - void *parent_buffer, ReleaseFunction release) - : m_buffer(buffer) + BufferView(const Wrapped<R> *buffer, size_t cap, size_t head, size_t tail, size_t tombstone_cnt, psudb::BloomFilter<R> *filter, + ReleaseFunction release) + : m_data(buffer) , m_release(release) - , m_parent_buffer(parent_buffer) , m_head(head) , m_tail(tail) + , m_cap(cap) + , m_approx_ts_cnt(tombstone_cnt) , m_tombstone_filter(filter) {} ~BufferView() { - m_release(m_parent_buffer, m_head); + m_release(); } bool check_tombstone(const R& rec) { if (m_tombstone_filter && !m_tombstone_filter->lookup(rec)) return false; for (size_t i=0; i<get_record_count(); i++) { - if (m_buffer[to_idx(i)].rec == rec && m_buffer[to_idx(i)].is_tombstone()) { + if (m_data[to_idx(i)].rec == rec && m_data[to_idx(i)].is_tombstone()) { + return true; + } + } + + return false; + } + + bool delete_record(const R& rec) { + for (size_t i=0; i<get_record_count(); i++) { + if (m_data[to_idx(i)].rec == rec) { + m_data[to_idx(i)].set_delete(); return true; } } @@ -54,30 +66,35 @@ public: return m_tail - m_head; } + /* + * NOTE: This function returns an upper bound on the number + * of tombstones within the view. There may be less than + * this, due to synchronization issues during view creation. + */ size_t get_tombstone_count() { - // FIXME: tombstone count - return 0; + return m_approx_ts_cnt; } Wrapped<R> *get(size_t i) { assert(i < get_record_count()); - return m_buffer + to_idx(i); + return m_data + to_idx(i); } void copy_to_buffer(psudb::byte *buffer) { - memcpy(buffer, (std::byte*) (m_buffer + m_head), get_record_count() * sizeof(Wrapped<R>)); + memcpy(buffer, (std::byte*) (m_data + m_head), get_record_count() * sizeof(Wrapped<R>)); } private: - const Wrapped<R>* m_buffer; - void *m_parent_buffer; + const Wrapped<R>* m_data; ReleaseFunction m_release; size_t m_head; size_t m_tail; + size_t m_cap; + size_t m_approx_ts_cnt; psudb::BloomFilter<R> *m_tombstone_filter; size_t to_idx(size_t i) { - return (m_head + i) % m_buffer->get_capacity(); + return (m_head + i) % m_cap; } }; |