diff options
Diffstat (limited to 'include/cru')
-rw-r--r-- | include/cru/base/concurrent/ConcurrentQueue.h | 88 | ||||
-rw-r--r-- | include/cru/base/log/Logger.h | 15 | ||||
-rw-r--r-- | include/cru/base/platform/unix/EventLoop.h | 5 |
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_; |