This commit is contained in:
Scott E. Graves 2024-12-20 13:42:50 -06:00
parent 7a6a7421cd
commit c8f4af7455
2 changed files with 21 additions and 16 deletions

View File

@ -28,8 +28,7 @@ public:
atomic() : mtx_(std::make_shared<std::mutex>()) {} atomic() : mtx_(std::make_shared<std::mutex>()) {}
atomic(const atomic &at_data) atomic(const atomic &at_data)
: data_(static_cast<data_t>(at_data)), : data_(at_data.load()), mtx_(std::make_shared<std::mutex>()) {}
mtx_(std::make_shared<std::mutex>()) {}
atomic(data_t data) atomic(data_t data)
: data_(std::move(data)), mtx_(std::make_shared<std::mutex>()) {} : data_(std::move(data)), mtx_(std::make_shared<std::mutex>()) {}
@ -43,25 +42,34 @@ private:
std::shared_ptr<std::mutex> mtx_; std::shared_ptr<std::mutex> mtx_;
public: public:
[[nodiscard]] auto load() const -> data_t {
mutex_lock lock(*mtx_);
return data_;
}
auto store(data_t data) -> data_t {
mutex_lock lock(*mtx_);
data_ = std::move(data);
return data_;
}
auto operator=(const atomic &at_data) -> atomic & { auto operator=(const atomic &at_data) -> atomic & {
if (&at_data == this) { if (&at_data == this) {
return *this; return *this;
} }
mutex_lock lock(*mtx_); store(at_data.load());
static_cast<data_t>(at_data) == data_;
return *this; return *this;
} }
auto operator=(atomic &&) -> atomic & = default; auto operator=(atomic &&) -> atomic & = default;
auto operator=(const data_t &data) -> atomic & { auto operator=(data_t data) -> atomic & {
if (&data == &data_) { if (&data == &data_) {
return *this; return *this;
} }
mutex_lock lock(*mtx_); store(std::move(data));
data_ = data;
return *this; return *this;
} }
@ -71,7 +79,7 @@ public:
} }
mutex_lock lock(*mtx_); mutex_lock lock(*mtx_);
return static_cast<data_t>(at_data) == data_; return at_data.load() == data_;
} }
[[nodiscard]] auto operator==(const data_t &data) const -> bool { [[nodiscard]] auto operator==(const data_t &data) const -> bool {
@ -89,7 +97,7 @@ public:
} }
mutex_lock lock(*mtx_); mutex_lock lock(*mtx_);
return static_cast<data_t>(at_data) != data_; return at_data.load() != data_;
} }
[[nodiscard]] auto operator!=(const data_t &data) const -> bool { [[nodiscard]] auto operator!=(const data_t &data) const -> bool {
@ -101,10 +109,7 @@ public:
return data != data_; return data != data_;
} }
[[nodiscard]] operator data_t() const { [[nodiscard]] operator data_t() const { return load(); }
mutex_lock lock(*mtx_);
return data_;
}
}; };
inline constexpr const auto max_time{ inline constexpr const auto max_time{
@ -558,11 +563,11 @@ template <> struct adl_serializer<repertory::sia_config> {
template <typename data_t> struct adl_serializer<repertory::atomic<data_t>> { template <typename data_t> struct adl_serializer<repertory::atomic<data_t>> {
static void to_json(json &data, const repertory::atomic<data_t> &value) { static void to_json(json &data, const repertory::atomic<data_t> &value) {
data = static_cast<data_t>(value); data = value.load();
} }
static void from_json(const json &data, repertory::atomic<data_t> &value) { static void from_json(const json &data, repertory::atomic<data_t> &value) {
value = data.get<data_t>(); value.store(data.get<data_t>());
} }
}; };

View File

@ -1065,7 +1065,7 @@ void app_config::set_sia_config(sia_config cfg) { set_value(sia_config_, cfg); }
template <typename dest, typename source> template <typename dest, typename source>
auto app_config::set_value(dest &dst, const source &src) -> bool { auto app_config::set_value(dest &dst, const source &src) -> bool {
if (dst == src) { if (dst.load() == src) {
return false; return false;
} }