diff options
Diffstat (limited to 'src/thread')
-rw-r--r-- | src/thread/queue.cpp | 21 | ||||
-rw-r--r-- | src/thread/queue.hpp | 29 |
2 files changed, 50 insertions, 0 deletions
diff --git a/src/thread/queue.cpp b/src/thread/queue.cpp new file mode 100644 index 0000000..d2ed7d2 --- /dev/null +++ b/src/thread/queue.cpp @@ -0,0 +1,21 @@ +#include "queue.hpp" + +namespace smtp::thread +{ + void Queue::Push( Message const &message) + { + std::lock_guard<std::mutex> lock{mMutex}; + mMessageQueue.push( message ); + mCondition.notify_one(); + } + + std::shared_ptr<Message> Queue::WaitAndPop() + { + std::unique_lock<std::mutex> lock{mMutex}; + mCondition.wait(lock, [this](){return !mMessageQueue.empty();}); + auto result = std::make_shared<Message>(mMessageQueue.front()); + mMessageQueue.pop(); + return result; + } + +} diff --git a/src/thread/queue.hpp b/src/thread/queue.hpp new file mode 100644 index 0000000..9ed3a76 --- /dev/null +++ b/src/thread/queue.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include <string> +#include <mutex> +#include <queue> +#include <condition_variable> + +namespace smtp::thread +{ + struct Message + { + std::string subject; + std::string text; + }; + + class Queue + { + public: + Queue() = default; + ~Queue() = default; + + void Push( Message const& message ); + std::shared_ptr<Message> WaitAndPop(); + private: + mutable std::mutex mMutex; + std::queue<Message> mMessageQueue; + std::condition_variable mCondition; + }; +} |