diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 52def3d1..4ca2051f 100755 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -9,6 +9,7 @@ target_sources( ${CMAKE_CURRENT_SOURCE_DIR}/Helpers/Paths.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Helpers/EpollInstance.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Helpers/EventFdNotifier.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Helpers/ConditionVariableNotifier.cpp ${CMAKE_CURRENT_SOURCE_DIR}/VersionNumber.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Generated/resources.cpp diff --git a/src/Helpers/ConditionVariableNotifier.cpp b/src/Helpers/ConditionVariableNotifier.cpp new file mode 100644 index 00000000..505dbd02 --- /dev/null +++ b/src/Helpers/ConditionVariableNotifier.cpp @@ -0,0 +1,19 @@ +#include "ConditionVariableNotifier.hpp" + +namespace Bloom +{ + void ConditionVariableNotifier::notify() { + auto lock = std::unique_lock(this->mutex); + this->notified = true; + this->conditionalVariable.notify_all(); + } + + void ConditionVariableNotifier::waitForNotification() { + auto lock = std::unique_lock(this->mutex); + this->conditionalVariable.wait(lock, [this] { + return this->notified; + }); + + this->notified = false; + } +} diff --git a/src/Helpers/ConditionVariableNotifier.hpp b/src/Helpers/ConditionVariableNotifier.hpp new file mode 100644 index 00000000..f86fc688 --- /dev/null +++ b/src/Helpers/ConditionVariableNotifier.hpp @@ -0,0 +1,44 @@ +#pragma once + +#include +#include + +#include "NotifierInterface.hpp" + +namespace Bloom +{ + /** + * The ConditionVariableNotifier class is an implementation of the NotifierInterface, using an + * std::condition_variable. + */ + class ConditionVariableNotifier: public NotifierInterface + { + public: + ConditionVariableNotifier() = default; + ~ConditionVariableNotifier() override = default; + + /* + * ConditionVariableNotifier objects should not be copied. + */ + ConditionVariableNotifier(ConditionVariableNotifier& other) = delete; + ConditionVariableNotifier& operator = (ConditionVariableNotifier& other) = delete; + + /* + * TODO: Implement this. + */ + ConditionVariableNotifier(ConditionVariableNotifier&& other) noexcept = delete; + ConditionVariableNotifier& operator = (ConditionVariableNotifier&& other) = delete; + + void notify() override; + + /** + * Blocks until the contained std::conditional_variable is notified. + */ + void waitForNotification(); + + private: + std::mutex mutex; + std::condition_variable conditionalVariable; + bool notified = false; + }; +}