From 8465655ceac8e1f78e4af2224ed8b8839ec4a35e Mon Sep 17 00:00:00 2001 From: Yuqian Yang Date: Sun, 7 Sep 2025 21:46:34 +0800 Subject: Fix logger stop. --- include/cru/base/concurrent/ConcurrentQueue.h | 88 --------------------------- include/cru/base/log/Logger.h | 15 +++-- include/cru/base/platform/unix/EventLoop.h | 5 ++ 3 files changed, 15 insertions(+), 93 deletions(-) delete mode 100644 include/cru/base/concurrent/ConcurrentQueue.h (limited to 'include') 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 -#include -#include -#include - -namespace cru::concurrent { -namespace details { -template -struct ConcurrentQueueNode { - ConcurrentQueueNode(T&& value, ConcurrentQueueNode* next = nullptr) - : value(std::move(value)), next(next) {} - - T value; - ConcurrentQueueNode* next; -}; -} // namespace details - -template -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 lock(mutex_); - if (head_ == nullptr) { - head_ = tail_ = new details::ConcurrentQueueNode(std::move(value)); - condition_variable_.notify_one(); - } else { - tail_->next = new details::ConcurrentQueueNode(std::move(value)); - tail_ = tail_->next; - } - } - - T Pull() { - std::unique_lock 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 Poll() { - std::unique_lock 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* head_ = nullptr; - details::ConcurrentQueueNode* tail_ = nullptr; - - std::mutex mutex_; - std::condition_variable condition_variable_; -}; -} // namespace cru::concurrent diff --git a/include/cru/base/log/Logger.h b/include/cru/base/log/Logger.h index 3ed119e2..1ef53654 100644 --- a/include/cru/base/log/Logger.h +++ b/include/cru/base/log/Logger.h @@ -1,9 +1,9 @@ #pragma once #include "../Base.h" -#include "../concurrent/ConcurrentQueue.h" - +#include #include // IWYU pragma: keep +#include #include #include #include @@ -55,12 +55,17 @@ class CRU_BASE_API Logger : public Object2 { } private: - concurrent::ConcurrentQueue log_queue_; + void LogThreadRun(); + + private: + std::mutex log_queue_mutex_; + std::condition_variable log_queue_condition_variable_; + std::list log_queue_; + bool log_stop_; + std::thread log_thread_; std::mutex target_list_mutex_; std::vector> target_list_; - - std::thread log_thread_; }; class CRU_BASE_API LoggerCppStream : public Object2 { diff --git a/include/cru/base/platform/unix/EventLoop.h b/include/cru/base/platform/unix/EventLoop.h index 784cb780..9def8c7b 100644 --- a/include/cru/base/platform/unix/EventLoop.h +++ b/include/cru/base/platform/unix/EventLoop.h @@ -45,14 +45,17 @@ class UnixTimerFile : public Object2 { }; class UnixEventLoop : public Object2 { + CRU_DEFINE_CLASS_LOG_TAG("cru::platform::unix::UnixEventLoop") public: UnixEventLoop(); + ~UnixEventLoop() override; int Run(); void RequestQuit(int exit_code = 0); int SetTimer(std::function action, std::chrono::milliseconds timeout, bool repeat); + void CancelTimer(int id); int SetImmediate(std::function action) { return this->SetTimer(std::move(action), std::chrono::milliseconds::zero(), @@ -91,6 +94,8 @@ class UnixEventLoop : public Object2 { bool CheckTimer(); bool ReadTimerPipe(); + void RemoveTimer(int id); + private: std::thread::id running_thread_; -- cgit v1.2.3