EuvLoop.hpp
1 //
2 // Created by xiong on 2020/10/23.
3 //
4 
5 #ifndef EMX_EUVLOOP_HPP
6 #define EMX_EUVLOOP_HPP
7 
8 #include <functional>
9 #include "uv.h"
10 #include "core/EmxTypeDef.hpp"
11 
12 namespace Emx {
18  class EuvLoop {
19  public:
20 
22  using Callback = std::function<void()>;
23 
25  enum ModeE {
27  Dynamic
28  };
29 
31 
40  ErrCodeE Init(const char *name, Callback onQuit, ModeE mode = Dynamic);
41 
49  ErrCodeE Start(bool newThread = true);
50 
52  bool IsRunning() { return uv_loop_alive(m_loop); }
53 
54 
56  void Stop();
57 
59  void DeInit();
60 
65  void StopAndDeInit() {
66  Stop();
67  DeInit();
68  }
69 
74  const char *GetName() { return m_name.c_str(); }
75 
80  uv_loop_t *GetLoop() { return m_loop; }
81 
83  void PrintAllHandles() { uv_print_all_handles(m_loop, stderr); }
84 
86  void PrintActiveHandles() { uv_print_active_handles(m_loop, stderr); }
87 
95  bool isQuiting() { return m_quit; }
96 
97  private:
98  void Close();
99 
100  private:
101  std::string m_name;
102  Callback m_cb;
103  uv_async_t m_async;
104  uv_thread_t m_thread;
105  uv_loop_t *m_loop;
106  ModeE m_mode;
107  bool m_quit;
108  };
110 }
111 
112 
113 #endif //EMX_EUVLOOP_HPP
实现多路复用循环的主体,所有基于EuvLoop的事件都应绑定到一个EuvLoop上
Definition: EuvLoop.hpp:18
void PrintAllHandles()
打印绑定到loop中的所有句柄
Definition: EuvLoop.hpp:83
std::function< void()> Callback
当循环退出时触发的回调,在此回调中应关闭所有未关闭的绑定到此loop的描述符,否则循环将一直阻塞无法退出
Definition: EuvLoop.hpp:22
const char * GetName()
获取loop名字
Definition: EuvLoop.hpp:74
void PrintActiveHandles()
打印绑定到loop中的所有正在监听状态的句柄
Definition: EuvLoop.hpp:86
void StopAndDeInit()
一次性调用Stop和DeInit两个函数,当只有一个loop需要停止时调用此函数,当有多个loop都需要停止时, 可以先调用所有loop的Stop,然后再调用他们的DeInit,这样所有的loop结束的...
Definition: EuvLoop.hpp:65
bool isQuiting()
获取loop是否处于退出状态 当Stop函数被调用后,可能loop无法立刻捕获并执行此事件 如果此时待执行的其他事件较多,可能会引起loop无法及时退出 其他事件的回调可以使用此函数判断当loop处于退...
Definition: EuvLoop.hpp:95
void DeInit()
去初始化loop,此函数会阻塞至所有描述符关闭并退出loop
uv_loop_t * GetLoop()
获取libuv中的loop句柄
Definition: EuvLoop.hpp:80
ErrCodeE Start(bool newThread=true)
开始loop循环,执行此函数之后loop就真正的运行起来了
bool IsRunning()
loop当前是否处于运行状态
Definition: EuvLoop.hpp:52
ErrCodeE Init(const char *name, Callback onQuit, ModeE mode=Dynamic)
初始化一个loop
void Stop()
停止loop
ModeE
初始化模式
Definition: EuvLoop.hpp:25
@ Default
默认loop模式,此模式下会使用libuv为每个进程提供的一个静态loop作为EuvLoop,当一个进程只需要一个loop的时候可使用这个模式
Definition: EuvLoop.hpp:26
@ Dynamic
动态loop模式,此模式下会动态的malloc一个loop
Definition: EuvLoop.hpp:27
ErrCodeE
错误码定义
Definition: EmxTypeDef.hpp:29
Definition: EmxGpio.hpp:10