ldd3源码jiq.c编译出现的问题
2014-12-15 21:29
246 查看
此博客转载于:http://blog.csdn.net/makethyme/article/details/6940203
本人使用的环境是uname -r 为2.6.35.6-45.fc14.i686
编译中,首先碰到的就是现在头文件<linux/config.h>已经不存在,搜索看看就知道这么解决了。
另外一个就是<linux/workqueue.h>中一些函数和结构体已经改变了:
extern int schedule_delayed_work(struct delayed_work *work, unsigned long delay);
extern int schedule_work(struct work_struct *work);
struct delayed_work {
struct work_struct work;
struct timer_list timer;
};
为了尽可能少修改源代码,修改如下:
1)定义一个新的结构体
static struct delayed_work_struct_ldd3_t {
struct delayed_work delayed_work;
void *privatedata;
} delayed_work_struct_ldd3;
在该结构体中,privatedata指向以前的jiq_data结构。而struct delayed_work delayed_work则包含
结构work_struction work.
2)由于使用jiq_data的地方很多,保留该变量,但是在jiq_init()函数中,将该变量已delayed_work_struct_ldd3关联起来。
delayed_work_struct_ldd3.privatedata = (void*)&jiq_data;
3)源代码中好像还以一个宏定义为
#define SCHEDULE_QUEUE ((task_queue *) 1)
在此文件中应该没用,可以注释掉。
4)在函数jiq_init中,将以前的INIT_WORK(…)替换为
INIT_DELAYED_WORK(&(delayed_work_struct_ldd3.delayed_work),jiq_print_wq);
如果仍然使用INIT_WORK,则/proc/jiqwq能够正常工作。但是/proc/jiqwqdelay不能正常工作。即
schedule_delayed_work需要INIT_DELAYED_WORK而不是INIT_WORK配合。
5)此情况下jiq_print_wq变化较大:
static void jiq_print_wq(struct work_struct *ptr) //传入的参数类型不再是void *,而是struct work_struct *了
{
//通过work_struct得到delayed_work,再得到delayed_work_struct_ldd3_t,从而得到jiq_data数据结构。
struct delayed_work *p_delayed_work = to_delayed_work(ptr);
struct delayed_work_struct_ldd3_t *p_delayed_work_struct_ldd3 =
container_of(p_delayed_work, struct delayed_work_struct_ldd3_t,delayed_work);
struct clientdata *data = (struct clientdata *) (p_delayed_work_struct_ldd3->privatedata);
if (! jiq_print (data))
return;
if (data->delay)
schedule_delayed_work(p_delayed_work, data->delay);
else
schedule_work(ptr);
}
6)函数jiq_read_wq中
schedule_work(&jiq_work)修改为schedule_work(&(delayed_work_struct_ldd3.delayed_work.work));
7)函数jiq_read_wq_delayed中
schedule_delayed_work(&jiq_work,delay)修改为schedule_delayed_work(&(delayed_work_struct_ldd3.delayed_work),delay);
编译运行可得到:
cat /proc/jiqwqdelay
time delta preempt pid cpu command
3385115 1 0 6 0 events/0
3385116 1 0 6 0 events/0
3385117 1 0 6 0 events/0
3385118 1 0 6 0 events/0
3385119 1 0 6 0 events/0
cat /proc/jiqwq
time delta preempt pid cpu command
3403777 1 0 6 0 events/0
3403777 0 0 6 0 events/0
3403777 0 0 6 0 events/0
3403777 0 0 6 0 events/0
3403777 0 0 6 0 events/0
3403777 0 0 6 0 events/0
本人使用的环境是uname -r 为2.6.35.6-45.fc14.i686
编译中,首先碰到的就是现在头文件<linux/config.h>已经不存在,搜索看看就知道这么解决了。
另外一个就是<linux/workqueue.h>中一些函数和结构体已经改变了:
extern int schedule_delayed_work(struct delayed_work *work, unsigned long delay);
extern int schedule_work(struct work_struct *work);
struct delayed_work {
struct work_struct work;
struct timer_list timer;
};
为了尽可能少修改源代码,修改如下:
1)定义一个新的结构体
static struct delayed_work_struct_ldd3_t {
struct delayed_work delayed_work;
void *privatedata;
} delayed_work_struct_ldd3;
在该结构体中,privatedata指向以前的jiq_data结构。而struct delayed_work delayed_work则包含
结构work_struction work.
2)由于使用jiq_data的地方很多,保留该变量,但是在jiq_init()函数中,将该变量已delayed_work_struct_ldd3关联起来。
delayed_work_struct_ldd3.privatedata = (void*)&jiq_data;
3)源代码中好像还以一个宏定义为
#define SCHEDULE_QUEUE ((task_queue *) 1)
在此文件中应该没用,可以注释掉。
4)在函数jiq_init中,将以前的INIT_WORK(…)替换为
INIT_DELAYED_WORK(&(delayed_work_struct_ldd3.delayed_work),jiq_print_wq);
如果仍然使用INIT_WORK,则/proc/jiqwq能够正常工作。但是/proc/jiqwqdelay不能正常工作。即
schedule_delayed_work需要INIT_DELAYED_WORK而不是INIT_WORK配合。
5)此情况下jiq_print_wq变化较大:
static void jiq_print_wq(struct work_struct *ptr) //传入的参数类型不再是void *,而是struct work_struct *了
{
//通过work_struct得到delayed_work,再得到delayed_work_struct_ldd3_t,从而得到jiq_data数据结构。
struct delayed_work *p_delayed_work = to_delayed_work(ptr);
struct delayed_work_struct_ldd3_t *p_delayed_work_struct_ldd3 =
container_of(p_delayed_work, struct delayed_work_struct_ldd3_t,delayed_work);
struct clientdata *data = (struct clientdata *) (p_delayed_work_struct_ldd3->privatedata);
if (! jiq_print (data))
return;
if (data->delay)
schedule_delayed_work(p_delayed_work, data->delay);
else
schedule_work(ptr);
}
6)函数jiq_read_wq中
schedule_work(&jiq_work)修改为schedule_work(&(delayed_work_struct_ldd3.delayed_work.work));
7)函数jiq_read_wq_delayed中
schedule_delayed_work(&jiq_work,delay)修改为schedule_delayed_work(&(delayed_work_struct_ldd3.delayed_work),delay);
编译运行可得到:
cat /proc/jiqwqdelay
time delta preempt pid cpu command
3385115 1 0 6 0 events/0
3385116 1 0 6 0 events/0
3385117 1 0 6 0 events/0
3385118 1 0 6 0 events/0
3385119 1 0 6 0 events/0
cat /proc/jiqwq
time delta preempt pid cpu command
3403777 1 0 6 0 events/0
3403777 0 0 6 0 events/0
3403777 0 0 6 0 events/0
3403777 0 0 6 0 events/0
3403777 0 0 6 0 events/0
3403777 0 0 6 0 events/0
相关文章推荐
- LabVIEW编译时出现文件找不到的问题原因及其解决办法
- 用anjuta编译gtk程序时出现类似与"main.c::10:21:gtk/gtk.h:没有那个文件和目录"问题的解决
- 关于VC6中基于对话框的程序,往Combox 添加一个CComboBox变量,然后程序编译运行,窗口不出现的问题
- JRTPLIB编译说出现的问题及解决方法(转载)
- 配置chrome编译环境,安装windows sdk 6.1出现的问题。
- [解决问题]asp.net程序编译调试时偶尔出现访问被拒绝的错误
- MTK编译出现Undefined symbol Image$$ZI$$Limit的问题解决
- 使用ANT编译过程中出现的字符不匹配的问题
- 《见习小恶魔》源代码编译过程中可能出现的问题及解决方法
- 在Solaris下编译socket出现的问题
- 编译Opal时出现大量未定义符号问题的解决
- VS2008编译DirectX SDK 2004 summer版的Sound例子程序出现的libcp.lib找不到的问题的解决办法
- delphi7莫名奇妙编译出现的问题
- 理解VS2005 编译程序后出现的 manifest 后缀文件的问题
- Eclipse下编译出现错误:can not find the main class,Program will exit 问题解决
- libusb编译出现问题
- Redhat AS3上编译qt4.3.2,出现krb5.h找不到的问题
- 我把一个VC6的工程转换为VS2008的工程后,编译总是出现找不到而且不能升级vc90.pdb文件的问题,error C2471--解决办法
- 关于Vs 2005 中出现编译通过,但运行时出现“未使用调试信息生成二进制文件”的问题
- linux 编译安装wireshark出现的问题