aboutsummaryrefslogtreecommitdiff
path: root/include/cru
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-09-07 21:46:34 +0800
committerYuqian Yang <crupest@crupest.life>2025-09-07 21:46:34 +0800
commit8465655ceac8e1f78e4af2224ed8b8839ec4a35e (patch)
tree265499f3c4a46c06a48082e06210e6dbf416972e /include/cru
parentd36ed6c52f679ad0f9a0e89a4e1d09b763f063b8 (diff)
downloadcru-8465655ceac8e1f78e4af2224ed8b8839ec4a35e.tar.gz
cru-8465655ceac8e1f78e4af2224ed8b8839ec4a35e.tar.bz2
cru-8465655ceac8e1f78e4af2224ed8b8839ec4a35e.zip
Fix logger stop.
Diffstat (limited to 'include/cru')
-rw-r--r--include/cru/base/concurrent/ConcurrentQueue.h88
-rw-r--r--include/cru/base/log/Logger.h15
-rw-r--r--include/cru/base/platform/unix/EventLoop.h5
3 files changed, 15 insertions, 93 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
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 <condition_variable>
#include <format> // IWYU pragma: keep
+#include <list>
#include <memory>
#include <mutex>
#include <thread>
@@ -55,12 +55,17 @@ class CRU_BASE_API Logger : public Object2 {
}
private:
- concurrent::ConcurrentQueue<LogInfo> log_queue_;
+ void LogThreadRun();
+
+ private:
+ std::mutex log_queue_mutex_;
+ std::condition_variable log_queue_condition_variable_;
+ std::list<LogInfo> log_queue_;
+ bool log_stop_;
+ std::thread log_thread_;
std::mutex target_list_mutex_;
std::vector<std::unique_ptr<ILogTarget>> 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<void()> action, std::chrono::milliseconds timeout,
bool repeat);
+ void CancelTimer(int id);
int SetImmediate(std::function<void()> 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_;