我是靠谱客的博主 单纯母鸡,最近开发中收集的这篇文章主要介绍内核定时机制API之timer_setup,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部