New ConditionVariableNotifier (implementation of NotifierInterface, using an std::condition_variable)

This commit is contained in:
Nav
2022-04-15 22:13:50 +01:00
parent 3b0b39fe83
commit bd6a5d5051
3 changed files with 64 additions and 0 deletions

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -0,0 +1,44 @@
#pragma once
#include <mutex>
#include <condition_variable>
#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;
};
}