本章节主要介绍通过timerfd
机制来实现事件框架中的定时器。
本次合入的PR为https://gitee.com/popzilla/popevent/pulls/1。主要合入如下两个文件,分别为:
pop_timer.c
,定时器的功能实现;pop_timer.h
,定时器的对外接口。
整体思路是,当创建定时器时通过timerfd
设置溢出的时间,将创建出的fd
加入到之前实现的事件框架中去,对fd
的事件进行监听。当定时器溢出时,便会收到fd
可读事件,此时执行定时器回调即可。关于timerfd
的介绍可见之前的章节《timerfd简介》。
接口
当前提供如下接口:
pop_timer_t pop_timer_create(uint32_t millsec, bool loop, pop_timer_cb cb, void *usrdata);
其中各参数功能如下:
- millsec,定时器溢出时间,单位毫秒;
- loop,是否循环定时器;
- cb,定时器溢出时的处理函数;
- usrdata,定时器溢出时传入给处理函数的用户自定义数据;
测试
测试代码比较简单,功能主要为定时每隔500毫秒打印一次计数值。
void timer_proc(pop_timer_t timer, void *usrdata)
{
uint32_t *counter = (uint32_t *)usrdata;
printf("counter: %u\n", *counter);
(*counter)++;
}
int main(void)
{
/* 事件框架初始化 */
pop_event_init();
/* 启动定时器,每500毫秒调用一次timer_proc,其中`counter`为自定义函数。 */
static uint32_t counter = 0;
pop_timer_create(500, true, timer_proc, &counter);
/* 事件循环,此处函数不会再退出 */
pop_event_loop();
return 0;
}