Subversion Repositories shark

Compare Revisions

Ignore whitespace Rev 316 → Rev 317

/shark/trunk/kernel/modules/sem.c
20,11 → 20,11
 
/**
------------
CVS : $Id: sem.c,v 1.3 2003-01-07 17:07:51 pj Exp $
CVS : $Id: sem.c,v 1.4 2003-11-05 15:04:15 giacomo Exp $
 
File: $File$
Revision: $Revision: 1.3 $
Last update: $Date: 2003-01-07 17:07:51 $
Revision: $Revision: 1.4 $
Last update: $Date: 2003-11-05 15:04:15 $
------------
 
This file contains the Hartik 3.3.1 Semaphore functions
151,10 → 151,12
// the pshared parameter is NRQ for PSE52
int sem_init(sem_t *sem, int pshared, unsigned int value)
{
SYS_FLAGS f;
if (value > SEM_VALUE_MAX)
return EINVAL;
 
kern_cli();
f = kern_fsave();
*sem = free_sem;
if (*sem != NIL) {
free_sem = sem_table[*sem].next;
165,10 → 167,10
}
else {
errno = ENOSPC;
kern_sti();
kern_frestore(f);
return -1;
}
kern_sti();
kern_frestore(f);
return 0;
}
 
177,17 → 179,19
/*----------------------------------------------------------------------*/
int sem_destroy(sem_t *sem)
{
kern_cli();
SYS_FLAGS f;
f = kern_fsave();
 
if (*sem < 0 || *sem >= SEM_NSEMS_MAX || !sem_table[*sem].used) {
errno = EINVAL;
kern_sti();
kern_frestore(f);
return -1;
}
 
if (sem_table[*sem].blocked.first != NIL) {
errno = EBUSY;
kern_sti();
kern_frestore(f);
return -1;
}
 
195,7 → 199,7
sem_table[*sem].next = free_sem;
free_sem = *sem;
 
kern_sti();
kern_frestore(f);
return 0;
}
 
210,8 → 214,9
int found = 0;
mode_t m;
sem_t sem;
SYS_FLAGS f;
 
kern_cli();
f = kern_fsave();
 
for (i = 0; i < SEM_NSEMS_MAX; i++)
if (sem_table[i].used) {
223,16 → 228,16
if (found) {
if (oflag == (O_CREAT | O_EXCL)) {
errno = EEXIST;
kern_sti();
kern_frestore(f);
return SEM_FAILED;
} else {
kern_sti();
kern_frestore(f);
return &sem_table[i].index;
}
} else {
if (!(oflag & O_CREAT)) {
errno = ENOENT;
kern_sti();
kern_frestore(f);
return SEM_FAILED;
} else {
va_list l;
244,7 → 249,7
 
if (j > SEM_VALUE_MAX) {
errno = EINVAL;
kern_sti();
kern_frestore(f);
return SEM_FAILED;
}
 
256,12 → 261,12
sem_table[sem].count = j;
iq_init(&sem_table[sem].blocked, &freedesc, 0);
sem_table[sem].used = 1;
kern_sti();
kern_frestore(f);
return &sem_table[sem].index;
}
else {
errno = ENOSPC;
kern_sti();
kern_frestore(f);
return SEM_FAILED;
}
}
273,11 → 278,13
/*----------------------------------------------------------------------*/
int sem_close(sem_t *sem)
{
kern_cli();
SYS_FLAGS f;
 
f = kern_fsave();
 
if (*sem < 0 || *sem >= SEM_NSEMS_MAX || !sem_table[*sem].used) {
errno = EINVAL;
kern_sti();
kern_frestore(f);
return -1;
}
 
293,7 → 300,7
sem_table[*sem].next = free_sem;
free_sem = *sem;
 
kern_sti();
kern_frestore(f);
return 0;
}
 
304,8 → 311,9
{
int i;
int found = 0;
SYS_FLAGS f;
 
kern_cli();
f = kern_fsave();
 
for (i = 0; i < SEM_NSEMS_MAX; i++)
if (sem_table[i].used) {
319,11 → 327,11
sem_table[i].used = 0;
sem_table[i].next = free_sem;
free_sem = i;
kern_sti();
kern_frestore(f);
return 0;
} else {
errno = ENOENT;
kern_sti();
kern_frestore(f);
return SEM_FAILED;
}
}
393,6 → 401,7
int sem_trywait(sem_t *s)
{
struct sem_des *s1; /* It speeds up access */
SYS_FLAGS f;
 
if (*s < 0 || *s >= SEM_NSEMS_MAX || !sem_table[*s].used) {
errno = EINVAL;
399,7 → 408,7
return -1;
}
 
kern_cli();
f = kern_fsave();
 
s1 = &sem_table[*s];
 
408,13 → 417,13
 
if (s1->blocked.first != NIL || s1->count == 0) {
errno = EAGAIN;
kern_sti();
kern_frestore(f);
return -1;
}
else
s1->count--;
kern_sti();
kern_frestore(f);
return 0;
}
 
426,6 → 435,10
int sem_xwait(sem_t *s, int n, int wait)
{
struct sem_des *s1; /* It speeds up access */
SYS_FLAGS f;
f = kern_fsave();
kern_frestore(f);
 
if (*s < 0 || *s >= SEM_NSEMS_MAX || !sem_table[*s].used) {
errno = EINVAL;
434,7 → 447,7
 
/* We do not need to save context if we are sure we shall not block! */
if (wait == NON_BLOCK)
kern_cli();
f = kern_fsave();
else
proc_table[exec_shadow].context = kern_context_save();
 
448,13 → 461,13
 
if (s1->blocked.first != NIL || s1->count < n) {
errno = EAGAIN;
kern_sti();
kern_frestore(f);
return -1;
}
else
s1->count -= n;
 
kern_sti();
kern_frestore(f);
return 0;
}
/* The blocking wait is more complex... */
665,6 → 678,7
int sem_getvalue(sem_t *sem, int *sval)
{
PID p;
SYS_FLAGS f;
 
if (*sem < 0 || *sem >= SEM_NSEMS_MAX || !sem_table[*sem].used) {
errno = EINVAL;
671,7 → 685,7
return -1;
}
 
kern_cli();
f = kern_fsave();
 
if (iq_isempty(&sem_table[*sem].blocked))
/* the sem is free */
686,7 → 700,7
} while (p != NIL);
}
 
kern_sti();
kern_frestore(f);
return 0;
}