diff --git a/include/bank.h b/include/bank.h index f2343c5..6ccf54a 100644 --- a/include/bank.h +++ b/include/bank.h @@ -1,7 +1,8 @@ #pragma once +#include //temporary #include -#include #include +#include #include "error_responses.hpp" #include "parallel-hashmap/parallel_hashmap/phmap.h" #include "user.h" @@ -18,6 +19,16 @@ private: std::mutex> users; +#if CONSERVATIVE_DISK_SAVE + std::atomic change_flag = false; //if true changes have been made + + void ChangesMade() noexcept; //called after making changes + void ChangesSaved() noexcept; //called after saving +#elif +#define ChangesMade() ; +#define ChangesSaved() ; +#endif + /** * @brief size_l should be grabbed if the operation MODIFIES the size (shared), this is so that when save claims unique * diff --git a/src/bank.cpp b/src/bank.cpp index 5015488..951fc2d 100644 --- a/src/bank.cpp +++ b/src/bank.cpp @@ -1,11 +1,27 @@ #include "bank.h" +#if CONSERVATIVE_DISK_SAVE +void Bank::ChangesMade() noexcept +{ + while (change_flag.exchange(true, std::memory_order_relaxed)) + ; + std::atomic_thread_fence(std::memory_order_acquire); +} + +void Bank::ChangesSaved() noexcept +{ + std::atomic_thread_fence(std::memory_order_release); + change_flag.store(false, std::memory_order_relaxed); +} +#endif + int_fast8_t Bank::AddUser(const std::string &name, const std::string &init_pass) noexcept { if (name.size() > max_name_size) { return ErrorResponse::NameTooLong; } + //replace with string find for (char c : name) { if (c == ' ')