Linux内核API try_to_del_timer_sync

函数try_to_del_timer_sync()实现将处于非活动状态的定时器从动态定时器链表中删除。

try_to_del_timer_sync文件包含

#include<linux/timer.h>

try_to_del_timer_sync函数定义

在内核源码中的位置:linux-3.19.3/kernel/time/timer.c

函数定义格式:

int try_to_del_timer_sync(struct timer_list *timer);

try_to_del_timer_sync输入参数说明

此函数的输入参数是struct timer_list类型的变量,此变量用于存放动态定时器,其定义及详细解释参考add_timer()分析文档的输入参数说明部分。

try_to_del_timer_sync返回参数说明

  • 函数try_to_del_timer_sync()返回整数,可能的取值是-1、0和1。返回1说明删除的定时器处于激活状态等待执行,但处于非活动状态,此时的删除起到实际意义上的删除,即将定时器从动态定时器链表中成功的删除;返回0说明删除的定时器已不在动态定时器链表中,此时的删除没有任何意义;返回-1说明此时定时器已到期,处于活动状态,无法删除,此时的删除操作没有任何意义。

try_to_del_timer_sync实例解析

编写测试文件:try_to_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 result=try_to_del_timer_sync(&my_timer);
    printk("the try_to_del_timer_sync result is :%d\n", result);
}

定时器初始化、模块加载函数定义:

int __init try_to_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=try_to_del_timer_sync(&my_timer); //从链表中删除动态定时器
    printk("the try_to_del_timer_sync result is :%d\n", result);    //显示删除结果
    add_timer(&my_timer);                          //重新激活动态定时器
    printk("my_timer init.\n");
    return 0;
}

模块退出函数定义:

void __exit try_to_del_timer_sync_exit(void)
{
    int result=try_to_del_timer_sync(&my_timer);    //从链表中删除动态定时器
    printk("the try_to_del_timer_sync result is :%d\n", result);     //显示删除结果
    printk("Goodbye   try_to_del_timer_sync\n");
}

模块加载、退出函数调用:

module_init(try_to_del_timer_sync_init);
module_exit(try_to_del_timer_sync_exit);

实例运行结果及分析:

执行命令insmod try_to_del_timer_sync.ko插入模块,然后输入命令dmesg -c查看系统输出信息,出现如图所示结果。

Linux内核API try_to_del_timer_sync

执行命令rmmod try_to_del_timer_sync.ko删除模块,输入命令dmesg -c查看系统输出信息,出现如图所示结果。

Linux内核API try_to_del_timer_sync

结果分析:

对于函数try_to_del_timer_sync()被调用三次。第一次返回1,此时定时器正处于激活状态,处于非活动状态,尚未到期,此时能够成功将定时器从动态定时器链表中删除。定时器删除之后再次调用函数add_timer()将其插入链表,所以定时器到期时到期处理函数能够正常执行,第二次函数执行返回-1,此时定时器已到期,处于活动状态,此时无法删除,对定时器链表没有任何影响。第三次函数调用返回0,此时定时器到期处理函数已执行完毕,定时器已从动态定时器链表中自动删除,此操作也是没有任何意义的。

函数比较:

函数del_timer()、del_timer_sync()、try_to_del_timer_sync()作用基本相同,都能实现将处于激活状态而没有处于活动状态的定时器从定时器链表中删除,只是处理的代码不同和返回的结果不同而已。函数del_timer_sync()是通过循环调用函数try_to_del_timer_sync()实现其作用的,函数del_timer()和函数del_timer_sync()返回的结果的可能值是0和1,并且返回结果代表的意义也相同,而函数try_to_del_timer_sync()返回的结果可能值是-1、0和1。

赞(0)
未经允许不得转载:极客笔记 » Linux内核API try_to_del_timer_sync
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址