acl  3.5.3.0
aio_handle.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include "../stdlib/string.hpp"
4 #include "../stdlib/noncopyable.hpp"
5 
6 struct ACL_AIO;
7 struct ACL_EVENT;
8 
9 namespace acl
10 {
11 
12 // 事件引擎类型
13 typedef enum
14 {
15  ENGINE_SELECT, // select 模式(支持所有平台)
16  ENGINE_POLL, // poll 模式(仅 UNIX 平台)
17  ENGINE_KERNEL, // kernel 模式(win32: iocp, Linux: epoll, FreeBsd: kqueue, Solaris: devpoll
18  ENGINE_WINMSG // win32 GUI 消息模式
20 
21 /**
22  * 非阻塞IO的事件引擎类,该类封装了系统的 select/poll/epoll/kqueue/devpoll/iocp,
23  */
24 
25 class aio_timer_callback;
26 class aio_delay_free;
27 class aio_timer_delay_free;
28 
30 {
31 public:
32  /**
33  * 构造函数,会自动创建IO事件引擎,并且在析构函数中会自动释放
34  * @param engine_type {aio_handle_type} 所采用的引擎类型
35  * ENGINE_SELECT: select 方式,支持 win32/unix 平台
36  * ENGINE_POLL: poll 方式,支持 unix 平台
37  * ENGINE_KERNEL: 自动根据各个系统平台所支持的高效内核引擎进行设置
38  * ENGINE_WINMSG: win32 界面消息方式,支持 win32 平台
39  * @param nMsg {unsigned int} 若 engine_type 为 ENGINE_WINMSG,当该值
40  * 大于 0 时,该异步句柄便与该消息绑定,否则与缺省消息绑定;
41  * 当 engine_type 为非 ENGINE_WINMSG 时,该值对其它异步句柄不起作用
42  *
43  */
45  unsigned int nMsg = 0);
46 
47  /**
48  * 构造函数,调用者将 ACL_AIO 句柄传进,而在类的析构函数中并不会
49  * 自动释放该 ACL_AIO 句柄
50  * @param handle {ACL_AIO*} ACL_AIO 句柄
51  */
52  aio_handle(ACL_AIO* handle);
53 
54  virtual ~aio_handle(void);
55 
56  /**
57  * 针对异步读流,设置是否是连续读,该配置项将会被所有的基于
58  * 该异步引擎句柄的异步读流所继承,一般 aio_handle 类对象在缺省
59  * 情况下是连续读的
60  * @param onoff {bool} 设置是否是连续读
61  */
62  void keep_read(bool onoff);
63 
64  /**
65  * 获得异步引擎句柄是否设置了持续读数据的功能
66  * @return {bool}
67  */
68  bool keep_read(void) const;
69 
70  /**
71  * 设置定时器
72  * @param callback {aio_timer_callback*} 定时器回调函数类对象
73  * @param delay {int64} 定时器时间间隔(微秒)
74  * @param id {unsigned int} 定时器某个任务的 ID 号
75  * @return {int64} 定时器生效时间(从1970.1.1以来的微秒数)
76  */
77 #if defined(_WIN32) || defined(_WIN64)
78  __int64 set_timer(aio_timer_callback* callback,
79  __int64 delay, unsigned int id = 0);
80 #else
81  long long int set_timer(aio_timer_callback* callback,
82  long long int delay, unsigned int id = 0);
83 #endif
84 
85  /**
86  * 删除定时器的所有定时任务事件
87  * @param callback {aio_timer_callback*} 定时器回调函数类对象
88  * @return {time_t} 定时器生效时间(从1970.1.1以来的微秒数)
89  */
90 #if defined(_WIN32) || defined(_WIN64)
91  __int64 del_timer(aio_timer_callback* callback);
92 #else
93  long long int del_timer(aio_timer_callback* callback);
94 #endif
95 
96  /**
97  * 删除定时器中某个指定 ID 号的定时任务
98  * @param callback {aio_timer_callback*} 定时器回调函数类对象
99  * @param id {unsigned int} 定时器某个任务的 ID 号
100  * @return {time_t} 定时器生效时间(从1970.1.1以来的微秒数)
101  */
102 #if defined(_WIN32) || defined(_WIN64)
103  __int64 del_timer(aio_timer_callback* callback, unsigned int id);
104 #else
105  long long del_timer(aio_timer_callback* callback, unsigned int id);
106 #endif
107 
108  /**
109  * 当定时器处于锁定状态时,用户因为无法释放该定时器而造成内存泄露,
110  * 通过此函数,可以将处于锁定状态的定时器当处于未锁定状态时被事件
111  * 引擎延期释放(调用 aio_delay_free::destroy()),从而可以避免
112  * 内存泄露问题
113  * @param callback {aio_delay_free*}
114  */
115  void delay_free(aio_delay_free* callback);
116 
117  /**
118  * 获得 ACL_AIO 句柄
119  * @return {ACL_AIO*}
120  */
121  ACL_AIO* get_handle(void) const;
122 
123  /**
124  * 获得异步引擎的类型
125  * @return {aio_handle_type}
126  */
127  aio_handle_type get_engine_type(void) const;
128 
129  /**
130  * 获得当前处于监控的异步流的数量
131  * @return {int}
132  */
133  int length(void) const;
134 
135  /**
136  * 检查所有异步流的状态,并触发准备的异步流的处理过程
137  * @return {bool} 是否应中止异步引擎
138  */
139  bool check(void);
140 
141  /**
142  * 获得本次事件循环被触发的事件次数
143  * @return {int}
144  */
145  int last_nready(void) const;
146 
147  /**
148  * 通知异步流引擎中止
149  */
150  void stop(void);
151 
152  /**
153  * 重置异步引擎的内部状态
154  */
155  void reset(void);
156 
157  /**
158  * 设置 DNS 服务器地址列表,格式:ip1:port1;ip2:port2...
159  * @param addrs {const char*} DNS 服务器地址列表,如:8.8.8.8:53;1.1.1.1:53
160  * @param timeout {int} DNS 查询超时时间(秒)
161  * 注:set_dns 和 dns_add 执行相同的功能
162  */
163  void set_dns(const char* addrs, int timeout);
164  void dns_add(const char* addrs, int timeout);
165 
166  /**
167  * 删除指定的 DNS 服务器地址列表,格式:ip1:port1;ip2:port2...
168  * @param addrs {const char*} DNS 服务器地址列表
169  */
170  void dns_del(const char* addrs);
171 
172  /**
173  * 清除掉所设置的所有 DNS 服务器列表
174  */
175  void dns_clear(void);
176 
177  /**
178  * DNS 服务器列表数量
179  * @return {size_t}
180  */
181  size_t dns_size(void) const;
182 
183  /**
184  * 判断 DNS 服务器列表是否为空
185  * @return {bool}
186  */
187  bool dns_empty(void) const;
188 
189  /**
190  * 获得 DNS 服务器地址列表
191  * @param out {std::vector<std::pair<acl::string, unsigned short> >&}
192  */
193  void dns_list(std::vector<std::pair<string, unsigned short> >& out);
194 
195 public:
196  /**
197  * 设置异步引擎循环的等待时间中的秒级部分
198  * @param n {int} 设置用 select/poll/epoll/kqueue/devpoll
199  * 时的秒级等待时间
200  */
201  void set_delay_sec(int n);
202 
203  /**
204  * 设置异步引擎循环的等待时间中的微秒级部分
205  * @param n {int} 设置用 select/poll/epoll/kqueue/devpoll
206  * 时的微秒级等待时间
207  */
208  void set_delay_usec(int n);
209 
210  /**
211  * 设置事件循环过程中定时检查所有描述字状态的时间间隔,
212  * 内部缺省值 100 ms
213  */
214  void set_check_inter(int n);
215 
216  /**
217  * 设置异步流的读缓存区大小
218  * @param n {int} 读缓冲区大小
219  */
220  void set_rbuf_size(int n);
221 
222 protected:
223  friend class aio_stream;
224 
225  /**
226  * 异步流个数加 1
227  */
228  void increase(void);
229 
230  /**
231  * 当异步流个数加 1 时的回调虚函数
232  */
233  virtual void on_increase(void) {}
234 
235  /**
236  * 异步流个数减 1
237  */
238  void decrease(void);
239 
240  /**
241  * 当异步流个数减 1 时的回调虚函数
242  */
243  virtual void on_decrease(void) {}
244 
245 private:
246  ACL_AIO* aio_;
247  bool inner_alloc_;
248  bool stop_;
249  int nstream_;
250  aio_handle_type engine_type_;
251  aio_timer_delay_free* delay_free_timer_;
252 
253  void destroy_timer(aio_timer_callback* callback);
254  static void on_timer_callback(int event_type, ACL_EVENT*,
255  aio_timer_callback *callback);
256 };
257 
258 } // namespace acl
virtual void on_decrease(void)
Definition: aio_handle.hpp:243
virtual void on_increase(void)
Definition: aio_handle.hpp:233
struct ACL_AIO ACL_AIO
Definition: acl_aio.h:31
aio_handle_type
Definition: aio_handle.hpp:13
struct ACL_EVENT ACL_EVENT
Definition: acl_events.h:43
#define ACL_CPP_API