diff options
| author | Douglas Rumbaugh <dbr4@psu.edu> | 2024-01-24 11:18:25 -0500 |
|---|---|---|
| committer | Douglas Rumbaugh <dbr4@psu.edu> | 2024-01-24 11:18:25 -0500 |
| commit | f0a55f7996e9ea2c7824fd5ab136b7c1864bbcdd (patch) | |
| tree | 43e2757aaceab9727e78f0179b5871cdb56b33be /include/framework/DynamicExtension.h | |
| parent | da5dd66fd3ff184f8a8591ba1f7a8b58f6a7fa6e (diff) | |
| download | dynamic-extension-f0a55f7996e9ea2c7824fd5ab136b7c1864bbcdd.tar.gz | |
DynamicExtension: Fixed reconstruction trigger data race
Tweak the reconstruction trigger code to ensure that multiple
reconstructions won't be triggered at the same time.
Diffstat (limited to 'include/framework/DynamicExtension.h')
| -rw-r--r-- | include/framework/DynamicExtension.h | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/include/framework/DynamicExtension.h b/include/framework/DynamicExtension.h index 89ee30f..40f137c 100644 --- a/include/framework/DynamicExtension.h +++ b/include/framework/DynamicExtension.h @@ -451,7 +451,7 @@ private: ((DynamicExtension *) args->extension)->advance_epoch(new_head); } - ((DynamicExtension *) args->extension)->m_reconstruction_scheduled = false; + ((DynamicExtension *) args->extension)->m_reconstruction_scheduled.store(false); delete args; } @@ -537,9 +537,12 @@ private: } int internal_append(const R &rec, bool ts) { - if (!m_reconstruction_scheduled.load() && m_buffer->is_at_low_watermark()) { - m_reconstruction_scheduled.store(true); - schedule_reconstruction(); + if (m_buffer->is_at_low_watermark()) { + auto old = false; + + if (m_reconstruction_scheduled.compare_exchange_strong(old, true)) { + schedule_reconstruction(); + } } /* this will fail if the HWM is reached and return 0 */ |