del_timer_sync函数功能描述:函数del_timer_sync( )用于将处于非活动状态的定时器从动态定时器链表中删除。如果内核中有宏CONFIG_SMP的定义,函数del_timer_sync( )就是函数del_timer( ),如果内核中没有宏CONFIG_SMP的定义,则函数调用try_to_del_timer_sync( )实现其作用。
del_timer_sync文件包含
#include<linux/timer.h>
del_timer_sync函数定义
在内核源码中的位置:linux-3.19.3/include/linux/timer.h, linux-3.19.3/kernel/time/timer.c
函数定义格式:
#ifdef CONFIG_SMP
extern int del_timer_sync(struct timer_list *timer);
#else
# define del_timer_sync(t) del_timer(t)
#endif
int del_timer_sync(struct timer_list *timer)
{
#ifdef CONFIG_LOCKDEP
unsigned long flags;
local_irq_save(flags);
lock_map_acquire(&timer->lockdep_map);
lock_map_release(&timer->lockdep_map);
local_irq_restore(flags);
#endif
WARN_ON(in_irq( ) && ! tbase_get_irqsafe(timer->base));
for (; ; ) {
int ret = try_to_del_timer_sync(timer);
if (ret >= 0)
return ret;
cpu_relax( );
}
}
del_timer_sync输入参数说明
- 此函数的输入参数是struct timer_list类型的变量,此变量用于存放动态定时器,其定义及详细解释参考函数add_timer( )的分析文档。
del_timer_sync返回参数说明
- 函数del_timer_sync( )返回整数,可能的取值是0和1,返回1说明删除的定时器处于激活状态等待执行,但处于非活动状态,定时器能被成功删除;返回0说明删除的定时器已经处于活动状态或已经不存在,定时器无法删除。
del_timer_sync实例解析
编写测试文件:del_timer_sync.c
头文件引用及全局变量声明:
#include <linux/module.h>
#include<linux/timer.h>
MODULE_LICENSE("GPL");
struct timer_list my_timer; //声明动态定时器变量
定时器到期处理函数定义:
// 自定义定时器到期执行的函数,此函数在此只有显示的功能
void my_timer_function(unsigned long data)
{
printk("In the my_timer_function\n");
printk("the jiffies is :%ld\n", jiffies); //显示当前节拍数
struct timer_list *mytimer = (struct timer_list *)data;
printk("the expries of my_timer1 is :%ld\n", mytimer->expires);
// 显示定时器到期节拍数
}
定时器初始化、模块加载函数定义:
int __init del_timer_sync_init(void)
{
printk("my_timer will be created.\n");
printk("the jiffies is :%ld\n", jiffies); //显示当前节拍数
init_timer(&my_timer); //初始化动态定时器
my_timer.expires = jiffies + 1*HZ; //HZ=250;初始化字段expires
my_timer.data = &my_timer; //初始化字段data
my_timer.function = my_timer_function; //初始化字段function
add_timer(&my_timer); //激活动态定时器
int result=del_timer_sync(&my_timer); //从链表中删除动态定时器
printk("the del_timer_sync result is :%d\n", result); //显示删除结果
add_timer(&my_timer); //重新激活动态定时器
printk("my_timer init.\n");
return 0;
}
模块退出函数定义:
void __exit del_timer_sync_exit(void)
{
int result=del_timer_sync(&my_timer); //从链表中删除动态定时器
printk("the del_timer_sync result is :%d\n", result); //显示删除结果
printk("Goodbye del_timer_sync\n");
}
模块加载、退出函数调用:
module_init(del_timer_sync_init);
module_exit(del_timer_sync_exit);
实例运行结果及分析:
执行命令insmod del_timer_sync.ko插入模块,然后输入命令dmesg -c查看内核输出信息,出现如图所示结果。
执行命令rmmod del_timer_sync.ko删除模块,输入命令dmesg -c查看系统输出信息,出现如图所示结果。
结果分析:
在测试文件中函数del_timer_sync( )被调用两次,第一次返回1,此时定时器正处于激活状态,但未处于活动状态,定时器尚未到期,此时函数del_timer_sync( )完成真正意义上的删除,即将定时器从动态定时器链表中删除。定时器被删除之后,再次调用函数add_timer( )将其插入动态定时器链表中,所以定时器处理函数能够正常执行。当定时器处理函数执行结束之后,此定时器会被内核自动从动态定时器链表中删除,所以第二次函数执行返回0。