Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2003592
  • 博文数量: 369
  • 博客积分: 10093
  • 博客等级: 上将
  • 技术积分: 4271
  • 用 户 组: 普通用户
  • 注册时间: 2005-03-21 00:59
文章分类

全部博文(369)

文章存档

2013年(1)

2011年(2)

2010年(10)

2009年(16)

2008年(33)

2007年(146)

2006年(160)

2005年(1)

分类: LINUX

2006-06-01 23:49:51

内核中有工作于软中断上下文环境的定时器,能够实现一定的时间后执行特定的例程。为了使用起来更加方便,仿照glib的g_timeout_add将其简单的包装了一下:
File:simple_timeout.h
#include
#include
#include
#include
#include

typedef struct _simple_timeout{
        struct timer_list timer;
        int (*function) (void*);
        void *args;
        unsigned long time;
} simple_timeout;

void simple_timeout_add(simple_timeout *timeout, unsigned long time,
                int (*function)(void*), void *args);

int simple_timeout_del(simple_timeout *timeout);
File: simple_timeout.c
#include
#include
#include
#include
#include

#include "simple_timeout.h"

MODULE_LICENSE("GPL");

static void simple_timeout_helper(unsigned long arg)
{
        simple_timeout *st = (simple_timeout*)arg;

        if(st->function(st->args) == 0){
                st->timer.expires = jiffies + st->time;
                add_timer(&st->timer);
        }else{
                del_timer_sync(&st->timer);
        }
}

void simple_timeout_add(simple_timeout *timeout, unsigned long time,
                int (*function)(void*), void *args)
{
        timeout->time = time;
        timeout->function = function;
        timeout->args = args;
        init_timer(&timeout->timer);
        timeout->timer.function = simple_timeout_helper;
        timeout->timer.data = (unsigned long)timeout;
        timeout->timer.expires = jiffies + time;
        add_timer(&timeout->timer);
}

int simple_timeout_del(simple_timeout *timeout)
{
        return del_timer_sync(&timeout->timer);
}

EXPORT_SYMBOL_GPL(simple_timeout_add);
EXPORT_SYMBOL_GPL(simple_timeout_del);
使用示例如下:
File: sample.c
#include
#include
#include
#include
#include

#include "simple_timeout.h"

MODULE_LICENSE("GPL");

simple_timeout timeout;
unsigned long arg = 0;

int sample(void *args)
{
        unsigned long *arg = (unsigned long*)args;

        *arg = *arg + 1;
        printk("timeout sample:%lu\n", *arg);
        if(*arg == 10){
                return -1;
        }else{
                return 0;
        }
}

static int __init sample_init(void)
{
        simple_timeout_add(&timeout, 1 * HZ, &sample, &arg);
        return 0;
}

static void __exit sample_exit(void)
{
        if(simple_timeout_del(&timeout))
                printk("Active timer deactivated.\n");
        else
                printk("No timer active.\n");
}

module_init(sample_init);
module_exit(sample_exit);

阅读(1422) | 评论(0) | 转发(0) |
0

上一篇:What do you believe in?

下一篇:大学教育

给主人留下些什么吧!~~