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; |
} |
|