summaryrefslogtreecommitdiff
path: root/src/thread
diff options
context:
space:
mode:
authorclaiff <claiff@mail.ru>2022-10-18 16:52:46 +0300
committerclaiff <claiff@mail.ru>2022-10-18 16:52:46 +0300
commit1ca701a3056725f7560d10929baf3660d52bc4be (patch)
treea1fb1fe43cb4066e7cc86e068898aee40eebb2f7 /src/thread
parent416a20b211539c8db06c26a2297de9109ef69f32 (diff)
downloadobmc-sila-smtp-1ca701a3056725f7560d10929baf3660d52bc4be.tar.xz
waiting smtp recipientsbugfix/queue_empty_recipients
Diffstat (limited to 'src/thread')
-rw-r--r--src/thread/queue.cpp21
-rw-r--r--src/thread/queue.hpp29
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;
+ };
+}