#pragma once #include #include #include #include #include #include #include #include "utils.hpp" class AsyncEventLoop { public: AsyncEventLoop(); ~AsyncEventLoop(); void wake(); DEFINE_GETTER(getUVLoop, loop) template void queueTask(F &&task) { { std::lock_guard lock(tasksQueueMutex); tasksQueue.push(std::forward(task)); } wake(); } protected: void runLoop(); void processTasks(); static void asyncHandleCallback(uv_async_t *handle); static void closeHandle(uv_handle_t *handle, void *arg = nullptr); private: uv_loop_t *loop; std::thread loopThread; uv_async_t asyncHandle; std::atomic isLoopRunning = false; std::queue> tasksQueue; std::mutex tasksQueueMutex; };