diff options
author | Yuqian Yang <crupest@crupest.life> | 2025-09-07 21:46:34 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2025-09-07 21:46:34 +0800 |
commit | 8465655ceac8e1f78e4af2224ed8b8839ec4a35e (patch) | |
tree | 265499f3c4a46c06a48082e06210e6dbf416972e /include/cru/base/concurrent/ConcurrentQueue.h | |
parent | d36ed6c52f679ad0f9a0e89a4e1d09b763f063b8 (diff) | |
download | cru-8465655ceac8e1f78e4af2224ed8b8839ec4a35e.tar.gz cru-8465655ceac8e1f78e4af2224ed8b8839ec4a35e.tar.bz2 cru-8465655ceac8e1f78e4af2224ed8b8839ec4a35e.zip |
Fix logger stop.
Diffstat (limited to 'include/cru/base/concurrent/ConcurrentQueue.h')
-rw-r--r-- | include/cru/base/concurrent/ConcurrentQueue.h | 88 |
1 files changed, 0 insertions, 88 deletions
diff --git a/include/cru/base/concurrent/ConcurrentQueue.h b/include/cru/base/concurrent/ConcurrentQueue.h deleted file mode 100644 index e311d5f9..00000000 --- a/include/cru/base/concurrent/ConcurrentQueue.h +++ /dev/null @@ -1,88 +0,0 @@ -#pragma once -#include <condition_variable> -#include <mutex> -#include <optional> -#include <utility> - -namespace cru::concurrent { -namespace details { -template <typename T> -struct ConcurrentQueueNode { - ConcurrentQueueNode(T&& value, ConcurrentQueueNode* next = nullptr) - : value(std::move(value)), next(next) {} - - T value; - ConcurrentQueueNode* next; -}; -} // namespace details - -template <typename T> -class ConcurrentQueue { - public: - ConcurrentQueue() {} - - ConcurrentQueue(const ConcurrentQueue&) = delete; - ConcurrentQueue& operator=(const ConcurrentQueue&) = delete; - - ~ConcurrentQueue() { - if (head_) { - auto node = head_; - while (node) { - auto next = node->next; - delete node; - node = next; - } - } - } - - public: - void Push(T&& value) { - std::unique_lock<std::mutex> lock(mutex_); - if (head_ == nullptr) { - head_ = tail_ = new details::ConcurrentQueueNode<T>(std::move(value)); - condition_variable_.notify_one(); - } else { - tail_->next = new details::ConcurrentQueueNode<T>(std::move(value)); - tail_ = tail_->next; - } - } - - T Pull() { - std::unique_lock<std::mutex> lock(mutex_); - if (head_ == nullptr) { - condition_variable_.wait(lock); - } - assert(head_ != nullptr); - auto value = std::move(head_->value); - auto next = head_->next; - delete head_; - head_ = next; - if (next == nullptr) { - tail_ = nullptr; - } - return value; - } - - std::optional<T> Poll() { - std::unique_lock<std::mutex> lock(mutex_); - if (head_ == nullptr) { - return std::nullopt; - } - auto value = std::move(head_->value); - auto next = head_->next; - delete head_; - head_ = next; - if (next == nullptr) { - tail_ = nullptr; - } - return value; - } - - private: - details::ConcurrentQueueNode<T>* head_ = nullptr; - details::ConcurrentQueueNode<T>* tail_ = nullptr; - - std::mutex mutex_; - std::condition_variable condition_variable_; -}; -} // namespace cru::concurrent |