Linux内核API del_timer_sync

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查看内核输出信息,出现如图所示结果。

Linux内核API del_timer_sync

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

Linux内核API del_timer_sync

结果分析:

在测试文件中函数del_timer_sync( )被调用两次,第一次返回1,此时定时器正处于激活状态,但未处于活动状态,定时器尚未到期,此时函数del_timer_sync( )完成真正意义上的删除,即将定时器从动态定时器链表中删除。定时器被删除之后,再次调用函数add_timer( )将其插入动态定时器链表中,所以定时器处理函数能够正常执行。当定时器处理函数执行结束之后,此定时器会被内核自动从动态定时器链表中删除,所以第二次函数执行返回0。

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

评论 抢沙发

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