概述
timer_setup(timer, callback, flags) 用于为第一次使用timer做好准备,一般和add_timer 配合使用
其使用的例程如下:
static void prb_setup_retire_blk_timer(struct packet_sock *po)
{
struct tpacket_kbdq_core *pkc;
pkc = GET_PBDQC_FROM_RB(&po->rx_ring);
timer_setup(&pkc->retire_blk_timer, prb_retire_rx_blk_timer_expired,
0);
pkc->retire_blk_timer.expires = jiffies;
}
其源码分析如下:
#define timer_setup(timer, callback, flags)
__init_timer((timer), (callback), (flags))
原来这个是一个宏
#ifdef CONFIG_LOCKDEP
#define __init_timer(_timer, _fn, _flags)
do {
static struct lock_class_key __key;
init_timer_key((_timer), (_fn), (_flags), #_timer, &__key);
} while (0)
#define __init_timer_on_stack(_timer, _fn, _flags)
do {
static struct lock_class_key __key;
init_timer_on_stack_key((_timer), (_fn), (_flags),
#_timer, &__key);
} while (0)
#else
#define __init_timer(_timer, _fn, _flags)
init_timer_key((_timer), (_fn), (_flags), NULL, NULL)
#define __init_timer_on_stack(_timer, _fn, _flags)
init_timer_on_stack_key((_timer), (_fn), (_flags), NULL, NULL)
#endif
config_lockedp用于检测死锁,常用debug,这里假定没有开这个宏
所以这里的又会转调init_timer_key
void init_timer_key(struct timer_list *timer,
void (*func)(struct timer_list *), unsigned int flags,
const char *name, struct lock_class_key *key)
{
#如果没有打开CONFIG_DEBUG_OBJECTS_TIMERS的话,debug_init 为null
debug_init(timer);
#所以主要调用这个函数初始化timer
do_init_timer(timer, func, flags, name, key);
}
static void do_init_timer(struct timer_list *timer,
void (*func)(struct timer_list *),
unsigned int flags,
const char *name, struct lock_class_key *key)
{
#pprev 为null,说明这个timer处于pending状态,当然了刚开始创建timer的时候当然要pending了,毕竟
#还没有开始执行
timer->entry.pprev = NULL;
#时间到期要执行的回调函数
timer->function = func;
#看来flags中保存了当前的cpu id
timer->flags = flags | raw_smp_processor_id();
lockdep_init_map(&timer->lockdep_map, name, key, 0);
}
总结一下,看起来timer_setup(timer, callback, flags) 主要用是用callback和flags来给timer_list *timer 来赋值
但是不包括新建这个指针.
最后
以上就是单纯母鸡为你收集整理的内核定时机制API之timer_setup的全部内容,希望文章能够帮你解决内核定时机制API之timer_setup所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复