diff options
| author | Douglas Rumbaugh <dbr4@psu.edu> | 2023-11-06 12:37:06 -0500 |
|---|---|---|
| committer | Douglas Rumbaugh <dbr4@psu.edu> | 2023-11-06 12:37:06 -0500 |
| commit | ca1605a9924e27ccbacb33d04ccdb4326e7abe74 (patch) | |
| tree | b10219e29f7c34cc3bfe9c3063235bf3fe57fee6 /include/framework/DynamicExtension.h | |
| parent | fe136eda414d3f7897d4610faeda8dbb3b7bb400 (diff) | |
| download | dynamic-extension-ca1605a9924e27ccbacb33d04ccdb4326e7abe74.tar.gz | |
Epoch: Adjusted add empty buffer behavior
Add empty buffer now supports a CAS-like operation, where it will only
add a buffer if the currently active one is still the same as when the
decision to add a buffer was made. This is to support adding new buffers
on insert outside of the merge-lock, so that multiple concurrent threads
cannot add multiple new empty buffers.
Diffstat (limited to 'include/framework/DynamicExtension.h')
| -rw-r--r-- | include/framework/DynamicExtension.h | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/include/framework/DynamicExtension.h b/include/framework/DynamicExtension.h index 76722c0..955dbe5 100644 --- a/include/framework/DynamicExtension.h +++ b/include/framework/DynamicExtension.h @@ -301,14 +301,22 @@ private: * buffer while a new epoch is being created in the background. Returns a * pointer to the newly created buffer. */ - Buffer *add_empty_buffer(_Epoch *epoch) { - auto new_buffer = new Buffer(m_buffer_capacity, m_buffer_delete_capacity); + Buffer *add_empty_buffer(_Epoch *epoch, Buffer *current_buffer=nullptr) { + auto temp_buffer = new Buffer(m_buffer_capacity, m_buffer_delete_capacity); std::unique_lock<std::mutex> m_struct_lock; - epoch->add_buffer(new_buffer); + auto new_buffer = epoch->add_buffer(temp_buffer, current_buffer); + /* + * if epoch->add_buffer doesn't add the new buffer, this insert + * won't update the buffer set (duplicate insert) + */ m_buffers.insert(new_buffer); m_struct_lock.release(); + if (new_buffer != temp_buffer) { + delete temp_buffer; + } + return new_buffer; } |