20,11 → 20,11 |
|
/** |
------------ |
CVS : $Id: sem.c,v 1.1.1.1 2002-03-29 14:12:52 pj Exp $ |
CVS : $Id: sem.c,v 1.2 2002-11-11 08:32:07 pj Exp $ |
|
File: $File$ |
Revision: $Revision: 1.1.1.1 $ |
Last update: $Date: 2002-03-29 14:12:52 $ |
Revision: $Revision: 1.2 $ |
Last update: $Date: 2002-11-11 08:32:07 $ |
------------ |
|
This file contains the Hartik 3.3.1 Semaphore functions |
79,7 → 79,7 |
char *name; /* a name, for named semaphores */ |
int index; /* an index for sem_open, containing the sem number */ |
int count; /* the semaphore counter */ |
QQUEUE blocked; /* the blocked processes queue */ |
IQUEUE blocked; /* the blocked processes queue */ |
int next; /* the semaphore queue */ |
BYTE used; /* 1 if the semaphore is used */ |
} sem_table[SEM_NSEMS_MAX]; |
91,7 → 91,7 |
int sem; /* the semaphore on whitch the process is blocked */ |
} sp_table[MAX_PROC]; |
|
static QUEUE free_sem; /* Queue of free sem */ |
static int free_sem; /* Queue of free sem */ |
|
|
|
112,7 → 112,7 |
task_testcancel */ |
|
/* extract the process from the semaphore queue... */ |
qq_extract(i,&sem_table[ sp_table[i].sem ].blocked); |
iq_extract(i,&sem_table[ sp_table[i].sem ].blocked); |
|
l = proc_table[i].task_level; |
level_table[l]->task_insert(l,i); |
134,7 → 134,7 |
sem_table[i].name = NULL; |
sem_table[i].index = i; |
sem_table[i].count = 0; |
qq_init(&sem_table[i].blocked); |
iq_init(&sem_table[i].blocked, &freedesc, 0); |
sem_table[i].next = i+1; |
sem_table[i].used = 0; |
} |
160,7 → 160,7 |
free_sem = sem_table[*sem].next; |
sem_table[*sem].name = NULL; |
sem_table[*sem].count = value; |
qq_init(&sem_table[*sem].blocked); |
iq_init(&sem_table[*sem].blocked, &freedesc, 0); |
sem_table[*sem].used = 1; |
} |
else { |
254,7 → 254,7 |
sem_table[sem].name = kern_alloc(strlen((char *)name)+1); |
strcpy(sem_table[sem].name, (char *)name); |
sem_table[sem].count = j; |
qq_init(&sem_table[sem].blocked); |
iq_init(&sem_table[sem].blocked, &freedesc, 0); |
sem_table[sem].used = 1; |
kern_sti(); |
return &sem_table[sem].index; |
378,7 → 378,7 |
sp_table[exec_shadow].sem = *s; |
|
/* ...and put it in sem queue */ |
qq_insertlast(exec_shadow,&s1->blocked); |
iq_insertlast(exec_shadow,&s1->blocked); |
|
/* and finally we reschedule */ |
exec = exec_shadow = -1; |
504,7 → 504,7 |
sp_table[exec_shadow].sem = *s; |
|
/* ...and put it in sem queue */ |
qq_insertlast(exec_shadow,&s1->blocked); |
iq_insertlast(exec_shadow,&s1->blocked); |
|
/* and finally we reschedule */ |
exec = exec_shadow = -1; |
554,7 → 554,7 |
s1->count -= sp_table[p].decsem; |
|
/* Get task from blocked queue */ |
qq_extract(p,&s1->blocked); |
iq_extract(p,&s1->blocked); |
|
l = proc_table[p].task_level; |
level_table[l]->task_insert(l,p); |
579,7 → 579,7 |
s1->count -= sp_table[p].decsem; |
|
/* Get task from blocked queue */ |
qq_extract(p,&s1->blocked); |
iq_extract(p,&s1->blocked); |
|
l = proc_table[p].task_level; |
level_table[l]->task_insert(l,p); |
627,7 → 627,7 |
s1->count -= sp_table[p].decsem; |
|
/* Get task from blocked queue */ |
qq_extract(p,&s1->blocked); |
iq_extract(p,&s1->blocked); |
|
l = proc_table[p].task_level; |
level_table[l]->task_insert(l,p); |
657,7 → 657,7 |
s1->count -= sp_table[p].decsem; |
|
/* Get task from blocked queue */ |
qq_extract(p,&s1->blocked); |
iq_extract(p,&s1->blocked); |
|
l = proc_table[p].task_level; |
level_table[l]->task_insert(l,p); |
695,16 → 695,16 |
|
kern_cli(); |
|
if (sem_table[*sem].blocked.first == NIL) |
if (iq_isempty(&sem_table[*sem].blocked)) |
/* the sem is free */ |
*sval = sem_table[*sem].count; |
else { |
/* the sem is busy */ |
*sval = 0; |
p = sem_table[*sem].blocked.first; |
p = iq_query_first(&sem_table[*sem].blocked); |
do { |
(*sval)--; |
p = proc_table[p].next; |
p = iq_query_next(p, &sem_table[*sem].blocked); |
} while (p != NIL); |
} |
|