acl  3.5.3.0
acl_events.h
浏览该文件的文档.
1 #ifndef ACL_EVENTS_H_INCLUDED
2 #define ACL_EVENTS_H_INCLUDED
3 
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7 
8 #include "../stdlib/acl_define.h"
9 #include <time.h>
10 #include "../stdlib/acl_vstream.h"
11 #include "acl_timer.h"
12 
13 /*+++++++++++++++++++++++++++ 全局宏定义 +++++++++++++++++++++++++++++++++++*/
14  /* Event codes. */
15 #define ACL_EVENT_READ (1 << 0) /**< read event */
16 #define ACL_EVENT_ACCEPT (1 << 1) /**< accept one connection */
17 #define ACL_EVENT_WRITE (1 << 2) /**< write event */
18 #define ACL_EVENT_CONNECT (1 << 3) /**< client has connected the server*/
19 #define ACL_EVENT_XCPT (1 << 4) /**< exception */
20 #define ACL_EVENT_TIME (1 << 5) /**< timer event */
21 #define ACL_EVENT_RW_TIMEOUT (1 << 6) /**< read/write timeout event */
22 #define ACL_EVENT_TIMEOUT ACL_EVENT_RW_TIMEOUT
23 
24 #define ACL_EVENT_FD_IDLE 0
25 #define ACL_EVENT_FD_BUSY 1
26 
27 #define ACL_EVENT_ERROR ACL_EVENT_XCPT
28 
29 #define ACL_EVENT_SELECT 0
30 #define ACL_EVENT_POLL 1
31 #define ACL_EVENT_KERNEL 2
32 #define ACL_EVENT_WMSG 3
33 
34  /*
35  * Dummies.
36  */
37 #define ACL_EVENT_NULL_TYPE 0
38 #define ACL_EVENT_NULL_CONTEXT ((char *) 0)
39 
40 
41 /* in acl_events.c */
42 
43 typedef struct ACL_EVENT ACL_EVENT;
45 
46 /*
47  * External interface.
48  */
49 #if 0
50 typedef void (*ACL_EVENT_NOTIFY_FN) (int event_type, void *context);
51 typedef ACL_EVENT_NOTIFY_FN ACL_EVENT_NOTIFY_RDWR;
52 typedef ACL_EVENT_NOTIFY_FN ACL_EVENT_NOTIFY_TIME;
53 #else
54 typedef void (*ACL_EVENT_NOTIFY_RDWR)(int event_type, ACL_EVENT *event,
55  ACL_VSTREAM *stream, void *context);
56 typedef void (*ACL_EVENT_NOTIFY_TIME)(int event_type, ACL_EVENT *event,
57  void *context);
58 #endif
59 
60 /*----------------------------------------------------------------------------*/
61 
62 /**
63  * 创建一个事件循环对象的总入口,此函数会根据用户参数的不同自动调用下面的事件对象创建函数
64  * @param event_mode {int} 事件处理方式,目前仅支持: ACL_EVENT_SELECT, ACL_EVENT_KERNEL,
65  * ACL_EVENT_POLL, ACL_EVENT_WMSG
66  * @param use_thr {int} 是否采用线程事件方式,非0表示按线程事件方式
67  * @param delay_sec {int} 事件循环等待时的最长秒数,当 event_mode 为 ACL_EVENT_WMSG
68  * 时,且该值大于 0 时,则该值被当作消息值对待传给 acl_event_new_wmsg,用来与异
69  * 步消息句柄绑定
70  * @param delay_usec {int} 事件循环等待时的最长微秒数(仅 select 方式有用)
71  * @return {ACL_EVENT*} 事件对象指针,如果为空表示出错
72  */
73 ACL_API ACL_EVENT *acl_event_new(int event_mode, int use_thr,
74  int delay_sec, int delay_usec);
75 
76 /**
77  * 创建一个新的事件对象, 该事件不支持多线程
78  * @param delay_sec {int} 在调用 select() 函数时休息的秒数
79  * @param delay_usec {int} 在调用 select() 函数时休息的微秒数
80  * @return {ACL_EVENT*} 事件对象指针,如果为空表示出错
81  */
82 ACL_API ACL_EVENT *acl_event_new_select(int delay_sec, int delay_usec);
83 
84 /**
85  * 创建一个新的事件对象, 该事件支持线程模式
86  * @param delay_sec {int} 在调用 select() 函数时休息的秒数
87  * @param delay_usec {int} 在调用 select() 函数时休息的微秒数
88  * @return {ACL_EVENT*} 事件对象指针,如果为空表示出错
89  */
90 ACL_API ACL_EVENT *acl_event_new_select_thr(int delay_sec, int delay_usec);
91 
92 /**
93  * 创建一个支持 poll 的事件对象,不支持多线程
94  * @param delay_sec {int} 在调用 poll() 函数时休息的秒数
95  * @param delay_usec {int} 在调用 poll() 函数时休息的微秒数
96  * @return {ACL_EVENT*} 事件对象指针,如果为空表示出错
97  */
98 ACL_API ACL_EVENT *acl_event_new_poll(int delay_sec, int delay_usec);
99 
100 /**
101  * 创建一个支持 poll 的事件对象,支持多线程
102  * @param delay_sec {int} 在调用 poll() 函数时休息的秒数
103  * @param delay_usec {int} 在调用 poll() 函数时休息的微秒数
104  * @return {ACL_EVENT*} 事件对象指针,如果为空表示出错
105  */
106 ACL_API ACL_EVENT *acl_event_new_poll_thr(int delay_sec, int delay_usec);
107 
108 /**
109  * 创建一个新的事件对象, 该事件采用效率高的 epoll/devpoll/kqueue 方式,且不支持多线程
110  * @param delay_sec {int} 在调用事件循环函数时休息的秒数
111  * @param delay_usec {int} 在调用事件循环函数时休息的微秒数(忽略不计)
112  * @return {ACL_EVENT*} 事件对象指针,如果为空表示出错
113  */
114 ACL_API ACL_EVENT *acl_event_new_kernel(int delay_sec, int delay_usec);
115 
116 /**
117  * 创建一个新的事件对象, 该事件采用效率高的 epoll/devpoll/kqueue 方式,且采用线程方式
118  * @param delay_sec {int} 在调用事件循环函数时休息的秒数
119  * @param delay_usec {int} 在调用事件循环函数时休息的微秒数(忽略不计)
120  * @return {ACL_EVENT*} 事件对象指针,如果为空表示出错
121  */
122 ACL_API ACL_EVENT *acl_event_new_kernel_thr(int delay_sec, int delay_usec);
123 
124 /**
125  * 创建一个能与 Windows 界面消息绑在一起的事件引擎对象
126  * @param nMsg {unsigned int} 如果该值大于 0 则将该异步句柄与该消息值绑定,
127  * 否则将该异步句柄与缺省的消息值绑定
128  * @return {ACL_EVENT*} 事件对象指针,如果为空表示出错
129  */
130 ACL_API ACL_EVENT *acl_event_new_wmsg(unsigned int nMsg);
131 
132 #if defined (_WIN32) || defined(_WIN64)
133 ACL_API HWND acl_event_wmsg_hwnd(ACL_EVENT *eventp);
134 #endif
135 
136 /**
137  * 为了防止在多线程模式下 select 等事件循环的时间等待,可以添加此项以中断等待,
138  * 加快事件循环过程
139  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
140  */
141 ACL_API void acl_event_add_dog(ACL_EVENT *eventp);
142 
143 /**
144  * 设置事件触发的前置和后置处理过程
145  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
146  * @param fire_begin {void (*)(ACL_EVENT*, void*)} 当事件被统一触发前的回调过程
147  * @param fire_end {void (*)(ACL_EVENT*, void*)} 当事件被统一触发后的回调过程
148  * @param ctx {void*} fire_begin / fire_end 的第二个参数
149  */
150 ACL_API void acl_event_set_fire_hook(ACL_EVENT *eventp,
151  void (*fire_begin)(ACL_EVENT*, void*),
152  void (*fire_end)(ACL_EVENT*, void*),
153  void* ctx);
154 
155 /**
156  * 设置事件循环过程中定时检查所有描述字状态的时间间隔,内部缺省值为 100 ms
157  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
158  * @param n {int} 定时查检时间间隔 (毫秒级)
159  */
160 ACL_API void acl_event_set_check_inter(ACL_EVENT *eventp, int n);
161 
162 /**
163  * 释放事件结构
164  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
165  */
166 ACL_API void acl_event_free(ACL_EVENT *eventp);
167 
168 /**
169  * 返回事件的时间截
170  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
171  * @return {acl_int64} 当前事件的时间截(微秒级别)
172  */
173 ACL_API acl_int64 acl_event_time(ACL_EVENT *eventp);
174 
175 /**
176  * 将事件中的所有任务执行完毕
177  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
178  */
179 ACL_API void acl_event_drain(ACL_EVENT *eventp);
180 
181 /**
182  * 设置数据流可读时(指有数据待读或描述符出错或描述符关闭)的回调函数
183  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
184  * @param stream {ACL_VSTREAM*} 数据流指针, 不能为空, 且其中的描述符必须是有效的
185  * @param read_timeout {int} 读超时时间(秒)
186  * @param callback {ACL_EVENT_NOTIFY_RDWR} 数据流可读时的回调函数
187  * @param context {void*} 回调函数 callback 所需要的参数
188  */
189 ACL_API void acl_event_enable_read(ACL_EVENT *eventp, ACL_VSTREAM *stream,
190  int read_timeout, ACL_EVENT_NOTIFY_RDWR callback, void *context);
191 
192 /**
193  * 设置数据流可写时(指有空间可以写或描述符出错或描述符关闭)的回调函数
194  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
195  * @param stream {ACL_VSTREAM*} 数据流指针, 不能为空, 且其中的描述符必须是有效的
196  * @param write_timeout {int} 写超时时间(秒)
197  * @param callback {ACL_EVENT_NOTIFY_RDWR} 数据流可写时的回调函数
198  * @param context {void*} 回调函数 callback 所需要的参数
199  */
200 ACL_API void acl_event_enable_write(ACL_EVENT *eventp, ACL_VSTREAM *stream,
201  int write_timeout, ACL_EVENT_NOTIFY_RDWR callback, void *context);
202 
203 /**
204  * 设置监听套接口(指有新连接到达/被系统中断/出错时)的回调函数
205  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
206  * @param stream {ACL_VSTREAM*} 数据流指针, 不能为空, 且其中的描述符必须是有效的
207  * @param read_timeout {int} 监听超时时间(秒),可以为0
208  * @param callback {ACL_EVENT_NOTIFY_RDWR} 数据流可读时的回调函数
209  * @param context {void*} 回调函数 callback 所需要的参数
210  */
211 ACL_API void acl_event_enable_listen(ACL_EVENT *eventp, ACL_VSTREAM *stream,
212  int read_timeout, ACL_EVENT_NOTIFY_RDWR callback, void *context);
213 
214 /**
215  * 将数据流从事件的读监听流集合中清除
216  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
217  * @param stream {ACL_VSTREAM*} 数据流指针, 不能为空, 且其中的描述符必须是有效的
218  */
219 ACL_API void acl_event_disable_read(ACL_EVENT *eventp, ACL_VSTREAM *stream);
220 
221 /**
222  * 将数据流从事件的写监听流集合中清除
223  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
224  * @param stream {ACL_VSTREAM*} 数据流指针, 不能为空, 且其中的描述符必须是有效的
225  */
226 ACL_API void acl_event_disable_write(ACL_EVENT *eventp, ACL_VSTREAM *stream);
227 
228 /**
229  * 将数据流从事件的读写监听流集合中清除
230  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
231  * @param stream {ACL_VSTREAM*} 数据流指针, 不能为空, 且其中的描述符必须是有效的
232  */
233 ACL_API void acl_event_disable_readwrite(ACL_EVENT *eventp, ACL_VSTREAM *stream);
234 
235 /**
236  * 检查流中的描述符是否已经置入读、写或异常事件的集合中
237  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
238  * @param stream {ACL_VSTREAM*} 数据流指针, 不能为空, 且其中的描述符必须是有效的
239  */
240 ACL_API int acl_event_isset(ACL_EVENT *eventp, ACL_VSTREAM *stream);
241 
242 /**
243  * 检查流中的描述符是否已经置入读事件的集合中
244  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
245  * @param stream {ACL_VSTREAM*} 数据流指针, 不能为空, 且其中的描述符必须是有效的
246  */
247 ACL_API int acl_event_isrset(ACL_EVENT *eventp, ACL_VSTREAM *stream);
248 
249 /**
250  * 检查流中的描述符是否已经置入写事件的集合中
251  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
252  * @param stream {ACL_VSTREAM*} 数据流指针, 不能为空, 且其中的描述符必须是有效的
253  */
254 ACL_API int acl_event_iswset(ACL_EVENT *eventp, ACL_VSTREAM *stream);
255 
256 /**
257  * 检查流中的描述符是否已经置入异常事件的集合中
258  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
259  * @param stream {ACL_VSTREAM*} 数据流指针, 不能为空, 且其中的描述符必须是有效的
260  */
261 ACL_API int acl_event_isxset(ACL_EVENT *eventp, ACL_VSTREAM *stream);
262 
263 /**
264  * 添加一个定时事件
265  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
266  * @param callback {ACL_EVENT_NOTIFY_TIME} 定时事件的回调函数
267  * @param context {void*} callback 所需要的回调参数
268  * @param delay {acl_int64} eventp->event_present + delay 为该事件函数开始执行的时间
269  * 单位为微秒
270  * @param keep {int} 是否重复定时器任务
271  * @return {acl_int64} 事件执行的时间截,单位为微秒
272  */
273 ACL_API acl_int64 acl_event_request_timer(ACL_EVENT *eventp,
274  ACL_EVENT_NOTIFY_TIME callback, void *context, acl_int64 delay, int keep);
275 
276 /**
277  * 取消一个定时事件
278  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
279  * @param callback {ACL_EVENT_NOTIFY_TIME} 定时事件的回调函数
280  * @param context {void*} callback 所需要的回调参数
281  * @return acl_int64 {acl_int64} 距离开始执行事件函数的时间间隔, 以微秒为单位
282  */
283 ACL_API acl_int64 acl_event_cancel_timer(ACL_EVENT *eventp,
284  ACL_EVENT_NOTIFY_TIME callback, void *context);
285 
286 /**
287  * 当定时器处理完毕后,是否需要再次设置该定时器,以方便调用者循环
288  * 使用该定时器
289  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
290  * @param callback {ACL_EVENT_NOTIFY_TIME} 非空
291  * @param context {void*} 附属于 callback 的变量
292  * @param onoff {int} 是否重复通过 acl_event_request_timer 设置的定时器
293  */
294 ACL_API void acl_event_keep_timer(ACL_EVENT *eventp, ACL_EVENT_NOTIFY_TIME callback,
295  void *context, int onoff);
296 
297 /**
298  * 判断所设置的定时器都处于重复使用状态
299  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
300  * @param callback {ACL_EVENT_NOTIFY_TIME} 非空
301  * @param context {void*} 附属于 callback 的变量
302  * @return {int} !0 表示所设置的定时器都处于重复使用状态
303  */
304 ACL_API int acl_event_timer_ifkeep(ACL_EVENT *eventp, ACL_EVENT_NOTIFY_TIME callback,
305  void *context);
306 
307 /**
308  * 事件循环执行的调度函数
309  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
310  */
311 ACL_API void acl_event_loop(ACL_EVENT *eventp);
312 
313 /**
314  * 设置事件循环的空闲休息时间中的秒级数值
315  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
316  * @param sec {int} 秒级空闲休息时间值
317  */
318 ACL_API void acl_event_set_delay_sec(ACL_EVENT *eventp, int sec);
319 
320 /**
321  * 设置事件循环的空闲休息时间中的微秒级数值
322  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
323  * @param usec {int} 微秒级空闲休息时间值
324  */
325 ACL_API void acl_event_set_delay_usec(ACL_EVENT *eventp, int usec);
326 
327 /**
328  * 获得事件循环的空闲休息时间中的秒级数值
329  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
330  * @return {int} 秒级空闲休息时间值
331  */
332 ACL_API int acl_event_get_delay_sec(ACL_EVENT *eventp);
333 
334 /**
335  * 获得事件循环的空闲休息时间中的微秒级数值
336  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
337  * @return {int} 微秒级空闲休息时间值
338  */
339 ACL_API int acl_event_get_delay_usec(ACL_EVENT *eventp);
340 
341 /**
342  * 是否采用线程事件方式
343  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
344  * @return {int} 0: 否; !=0: 是
345  */
346 ACL_API int acl_event_use_thread(ACL_EVENT *eventp);
347 
348 /**
349  * 获得当前事件引擎的事件模型
350  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
351  * @return {int} ACL_EVENT_SELECT/ACL_EVENT_KERNEL/ACL_EVENT_POLL
352  */
353 ACL_API int acl_event_mode(ACL_EVENT *eventp);
354 
355 /**
356  * 获得本次事件循环后被触发的 IO 事件的次数
357  * @param eventp {ACL_EVENT*} 事件对象指针, 不为能为空
358  * @return {int} 该值为本次循环被触发的事件次数
359  */
360 ACL_API int acl_event_last_nready(ACL_EVENT *eventp);
361 
362 #ifdef __cplusplus
363 }
364 #endif
365 
366 #endif
ACL_API int acl_event_isset(ACL_EVENT *eventp, ACL_VSTREAM *stream)
ACL_API void acl_event_set_delay_sec(ACL_EVENT *eventp, int sec)
ACL_API acl_int64 acl_event_cancel_timer(ACL_EVENT *eventp, ACL_EVENT_NOTIFY_TIME callback, void *context)
ACL_API int acl_event_last_nready(ACL_EVENT *eventp)
ACL_API acl_int64 acl_event_time(ACL_EVENT *eventp)
ACL_API ACL_EVENT * acl_event_new_poll_thr(int delay_sec, int delay_usec)
ACL_API int acl_event_use_thread(ACL_EVENT *eventp)
ACL_API void acl_event_enable_listen(ACL_EVENT *eventp, ACL_VSTREAM *stream, int read_timeout, ACL_EVENT_NOTIFY_RDWR callback, void *context)
ACL_API void acl_event_set_fire_hook(ACL_EVENT *eventp, void(*fire_begin)(ACL_EVENT *, void *), void(*fire_end)(ACL_EVENT *, void *), void *ctx)
ACL_API void acl_event_set_delay_usec(ACL_EVENT *eventp, int usec)
ACL_API void acl_event_disable_readwrite(ACL_EVENT *eventp, ACL_VSTREAM *stream)
ACL_API acl_int64 acl_event_request_timer(ACL_EVENT *eventp, ACL_EVENT_NOTIFY_TIME callback, void *context, acl_int64 delay, int keep)
ACL_API ACL_EVENT * acl_event_new_kernel(int delay_sec, int delay_usec)
ACL_API int acl_event_timer_ifkeep(ACL_EVENT *eventp, ACL_EVENT_NOTIFY_TIME callback, void *context)
ACL_API ACL_EVENT * acl_event_new_select_thr(int delay_sec, int delay_usec)
ACL_API void acl_event_enable_read(ACL_EVENT *eventp, ACL_VSTREAM *stream, int read_timeout, ACL_EVENT_NOTIFY_RDWR callback, void *context)
ACL_API int acl_event_isxset(ACL_EVENT *eventp, ACL_VSTREAM *stream)
ACL_API void acl_event_drain(ACL_EVENT *eventp)
ACL_API int acl_event_isrset(ACL_EVENT *eventp, ACL_VSTREAM *stream)
ACL_API void acl_event_enable_write(ACL_EVENT *eventp, ACL_VSTREAM *stream, int write_timeout, ACL_EVENT_NOTIFY_RDWR callback, void *context)
ACL_API int acl_event_get_delay_sec(ACL_EVENT *eventp)
ACL_API ACL_EVENT * acl_event_new_kernel_thr(int delay_sec, int delay_usec)
ACL_API int acl_event_mode(ACL_EVENT *eventp)
ACL_API ACL_EVENT * acl_event_new_wmsg(unsigned int nMsg)
ACL_API int acl_event_get_delay_usec(ACL_EVENT *eventp)
struct ACL_EVENT ACL_EVENT
Definition: acl_events.h:43
ACL_API int acl_event_iswset(ACL_EVENT *eventp, ACL_VSTREAM *stream)
ACL_API void acl_event_set_check_inter(ACL_EVENT *eventp, int n)
ACL_API void acl_event_loop(ACL_EVENT *eventp)
ACL_API void acl_event_free(ACL_EVENT *eventp)
ACL_API void acl_event_disable_write(ACL_EVENT *eventp, ACL_VSTREAM *stream)
ACL_API void acl_event_disable_read(ACL_EVENT *eventp, ACL_VSTREAM *stream)
ACL_API ACL_EVENT * acl_event_new_poll(int delay_sec, int delay_usec)
ACL_API void acl_event_keep_timer(ACL_EVENT *eventp, ACL_EVENT_NOTIFY_TIME callback, void *context, int onoff)
void(* ACL_EVENT_NOTIFY_RDWR)(int event_type, ACL_EVENT *event, ACL_VSTREAM *stream, void *context)
Definition: acl_events.h:54
struct ACL_EVENT_FDTABLE ACL_EVENT_FDTABLE
Definition: acl_events.h:44
ACL_API ACL_EVENT * acl_event_new(int event_mode, int use_thr, int delay_sec, int delay_usec)
ACL_API ACL_EVENT * acl_event_new_select(int delay_sec, int delay_usec)
void(* ACL_EVENT_NOTIFY_TIME)(int event_type, ACL_EVENT *event, void *context)
Definition: acl_events.h:56
ACL_API void acl_event_add_dog(ACL_EVENT *eventp)