#include <errno.h>
#include <linux/kernel.h>
#include <asm/segment.h>
#include <asm/system.h>
#include <linux/sched.h>
#include <unistd.h>
/*#include <signal.h>*/
#define MAX 30
char names[MAX][MAX] = {'\0'};
sem_t arr[30]= {NULL};
void MakeNull(queue *q)
{
q->front = 0;
q->rear = MAX - 1;
}
int add(int x)
{
int y;
y = (x+1)%MAX;
return y;
}
void EnQueue(struct task_struct *curr, queue *q)
{
if(add(add(q->rear))==q->front)
printk("queue is full");
else
{
q->rear = add(q->rear);
q->task[q->rear]=curr;
}
}
void DeQueue(queue *q)
{
if(add(q->rear)==q->front)
{
printk("queue is empty");
}
else
q->front = add(q->front);
}
struct task_struct *Front( queue* q )
{
if(add(q->rear)==q->front)
return NULL;
else
return (q->task[q->front]);
}
int sys_sem_open(const char *name, unsigned int value)
{
char n;
int i = 0;
int tag;
char MyName[MAX];
while ((n = get_fs_byte(&name [i])) != '\0')
{
MyName[i] = n;
i++;
}
MyName[i] = '\0';
for (i = 0; i < MAX; i++)
{
tag = strcmp(MyName,names[i]);
if (tag==0)
return &arr[i];
}
for (i = 0; i < MAX; i++)
{
if (arr[i].flag == 0)
{
strcpy(names[i],MyName);
arr[i].flag = 1;
arr[i].value = value;
/*printk("%d",value);*/
MakeNull( &(arr[i].wait));
return &arr[i];
}
}
return NULL;
}
int sys_sem_wait(sem_t *sem)
{
int value;
cli();
(sem->value) = (sem->value)-1;
value = sem->value;
if (value < 0)
{
EnQueue(current, &(sem->wait));
/*sleep();*/
current->state = TASK_UNINTERRUPTIBLE;
schedule();
}
sti();
return 0;
}
int sys_sem_post(sem_t *sem)
{
struct task_struct* tmp;
int value;
cli();
(sem->value) = (sem->value)+1;
value = sem->value;
/*printk("post %d\t",sem->value);*/
if (value <= 0)
{
tmp = Front(&(sem->wait));
/*wake(tmp);*/
if (tmp != NULL)
(*tmp).state = TASK_RUNNING;
DeQueue(&(sem->wait));
}
sti();
return 0;
}
int sys_sem_unlink(const char *name)
{
char n;
int i=0,j=0,k=0;
char aName[MAX];
int tag;
while ((n = get_fs_byte(name + i)) != '\0')
{
aName[i] = n;
i++;
}
aName[i] = '\0';
for(j=0; j<MAX; j++)
{
tag = strcmp(names[i],aName);
if (tag==0)
{
arr[i].flag = 0;
arr[i].value = 0;
for(k=0;k<MAX;k++)
{
names[i][k] = '\0';
}
return 0;
}
}
return -1;
}
评论3
最新资源