aboutsummaryrefslogtreecommitdiff
path: root/src/AsyncEventLoop.hpp
blob: ebe2cad6dce8fe01fb538251a0d862d338b3c709 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#pragma once

#include <atomic>
#include <functional>
#include <mutex>
#include <queue>
#include <thread>
#include <uv.h>

#include "utils.hpp"

class AsyncEventLoop {
public:
  AsyncEventLoop();
  ~AsyncEventLoop();

  DEFINE_GETTER(getUVLoop, loop)

  template <typename F> void queueTask(F &&task) {
    {
      std::lock_guard<std::mutex> lock(tasksQueueMutex);
      tasksQueue.push(std::forward<F>(task));
    }
    uv_async_send(&asyncHandle);
  }

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<bool> isLoopRunning = false;
  std::queue<std::function<void()>> tasksQueue;
  std::mutex tasksQueueMutex;
};