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/scheduling/Epoch.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/scheduling/Epoch.h')
| -rw-r--r-- | include/framework/scheduling/Epoch.h | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/include/framework/scheduling/Epoch.h b/include/framework/scheduling/Epoch.h index f4aefe9..58fe6cd 100644 --- a/include/framework/scheduling/Epoch.h +++ b/include/framework/scheduling/Epoch.h @@ -54,11 +54,25 @@ public: } } - void add_buffer(Buffer *buf) { + Buffer *add_buffer(Buffer *buf, Buffer *cur_buf=nullptr) { assert(buf); + /* + * if a current buffer is specified, only add the + * new buffer if the active buffer is the current, + * otherwise just return the active buffer (poor man's + * CAS). + */ + if (cur_buf) { + auto active_buf = get_active_buffer(); + if (active_buf != cur_buf) { + return active_buf; + } + } + buf->take_reference(); m_buffers.push_back(buf); + return buf; } void start_job() { |