文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>内核定时器及简单的超时函数包装

内核定时器及简单的超时函数包装

时间:2006-06-01  来源:xiaosuo

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

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 <linux/module.h>
#include <linux/version.h>
#include <linux/timer.h>
#include <linux/sched.h>
#include <linux/init.h>

#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 <linux/module.h>
#include <linux/version.h>
#include <linux/timer.h>
#include <linux/sched.h>
#include <linux/init.h>

#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);
相关阅读 更多 +
排行榜 更多 +
单挑幸存者安卓版

单挑幸存者安卓版

飞行射击 下载
决战战地指挥官

决战战地指挥官

飞行射击 下载
鸡仔幸存者最新版

鸡仔幸存者最新版

飞行射击 下载