diff options
author | Oliver Reiche <oliver.reiche@huawei.com> | 2024-02-14 15:33:42 +0100 |
---|---|---|
committer | Oliver Reiche <oliver.reiche@huawei.com> | 2024-02-15 13:11:20 +0100 |
commit | bda3dabe37fdde648f90ce5aa4b20d7336570cf0 (patch) | |
tree | 5d09d61520d1050b3e916937d9dab5ae8c48709b /src/utils/cpp/atomic.hpp | |
parent | 178cae8fcb4c6cca2ec71dc3a0d2eec75ecbbc8c (diff) | |
download | justbuild-bda3dabe37fdde648f90ce5aa4b20d7336570cf0.tar.gz |
atomic: Fix potential race
... as any unguarded access to non-const members of the same
shared_ptr instance require the use of `atomic_load` and
`atomic_store`.
Diffstat (limited to 'src/utils/cpp/atomic.hpp')
-rw-r--r-- | src/utils/cpp/atomic.hpp | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/utils/cpp/atomic.hpp b/src/utils/cpp/atomic.hpp index fbba8b92..bc2a7865 100644 --- a/src/utils/cpp/atomic.hpp +++ b/src/utils/cpp/atomic.hpp @@ -106,16 +106,18 @@ class atomic_shared_ptr { auto operator=(atomic_shared_ptr&& other) -> atomic_shared_ptr& = delete; auto operator=(ptr_t desired) -> ptr_t { // NOLINT std::shared_lock lock(mutex_); - value_ = desired; + std::atomic_store(&value_, desired); return desired; } - operator ptr_t() const { value_; } // NOLINT + operator ptr_t() const { return std::atomic_load(&value_); } // NOLINT void store(ptr_t desired) { std::shared_lock lock(mutex_); - value_ = std::move(desired); + std::atomic_store(&value_, std::move(desired)); + } + [[nodiscard]] auto load() const -> ptr_t { + return std::atomic_load(&value_); } - [[nodiscard]] auto load() const -> ptr_t { return value_; } void notify_one() { cv_.notify_one(); } void notify_all() { cv_.notify_all(); } |