QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1214|回复: 0

同步机制 求帮助!1!

[复制链接]
发表于 2005-5-7 13:47:46 | 显示全部楼层 |阅读模式
我想请教一下 2.2内核中的等待队列 struct wait_queue 和 2.6.9里面的定义是一样的么?
如果不一样, 那2.6里的应该怎么定义和用
我这里有份代码, 是可以在2.2下编译通过, 那如果加在2.6.9的内核中,应该怎么去改??? 急, 真的很急!!
[code]#include <linux/kernel.h>
#include <linux/wait.h>
#include <linux/sched.h>
#include <linux/unistd.h>
#include <linux/slab.h>
#include <asm/system.h>


#define TRUE 1

#define FALSE 0



#define        MAX_NAME_LEN        64

#define        MAX_EVENTS        32



struct Event {

        int ownerPid;

        struct wait_queue *queue;

        int numBlocked;

        int usageCount;

};



static struct Event eventArray[MAX_EVENTS];        /* The event array */

asmlinkage int sys_getevntnum(char *name) {
/* dummy */
        return 0;
}

/* Initialize the event array */
void __init evnt_init(void) {
        int i;

        for(i = 0; i<MAX_EVENTS; i++) {
                eventArray.ownerPid = -1;
                eventArray.queue = NULL;
                eventArray.numBlocked = 0;
                eventArray.usageCount = 0;
        }
}


/* Open an event for shared use */
asmlinkage int sys_evntopen(int eventNum)
{
        int i;

        if(eventNum == 0) {
        /* Look for an available slot */
                for(i=0; i < MAX_EVENTS; i++) {
                        if (eventArray.ownerPid == -1) {
                                eventArray.ownerPid = current->pid;
                                eventArray.usageCount = 1;
                                return i;
                        }
                }
                return -1;        /* No events available */
        }
        eventArray[eventNum].usageCount++;
        return eventNum;
}


/* Deallocate this event */
asmlinkage int sys_evntclose(int eventNum) {
        struct wait_queue *qEntry;

/* Could validate owner(s), but this version does not do so */
/* Release blocked processes */
        qEntry = eventArray[eventNum].queue;
        while(eventArray[eventNum].numBlocked > 0) {
                qEntry->task->state = TASK_RUNNING;
                remove_wait_queue(
                        &(eventArray[eventNum].queue), qEntry);
                qEntry = qEntry->next;
                       eventArray[eventNum].numBlocked--;
        }
        eventArray[eventNum].ownerPid = -1;
        eventArray[eventNum].queue = NULL;
        eventArray[eventNum].usageCount = 0;
        return 0;
}


asmlinkage int sys_evntwait(int eventNum) {
        struct wait_queue **queue;[code]


/* Add current task to the blocked process list */
        queue = &(eventArray[eventNum].queue);
        sleep_on(queue);
        return 0;
}

asmlinkage int sys_evntsig(int eventNum) {
        struct wait_queue **queue;



        queue = &(eventArray[eventNum].queue);
        wake_up(queue);
        return 0;
}[/code]

我修改一些实现系统调用的必要东西之后, 用这几个空函数可以实现这些新的系统调用(这些代码是一个event.c文件 放在linux-2.6.9/arch/i386/kernel 中编译)
应该怎么样该这些代码才能在2.6.9中编译通过???(编译内核到这个文件的时候, 显示remove_wait_queue , sleep_on, wake_up 的参数错误, 我应该怎么改????????
谢谢先
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 10:22 , Processed in 0.036825 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表