diff options
| -rw-r--r-- | lib/librthread/rthread_sem.c | 60 |
1 files changed, 56 insertions, 4 deletions
diff --git a/lib/librthread/rthread_sem.c b/lib/librthread/rthread_sem.c index ea855d5d1d3..879fa75d4a9 100644 --- a/lib/librthread/rthread_sem.c +++ b/lib/librthread/rthread_sem.c @@ -126,9 +126,16 @@ sem_init(sem_t *semp, int pshared, unsigned int value) return (-1); } + if (value > SEM_VALUE_MAX) { + errno = EINVAL; + return (-1); + } + sem = calloc(1, sizeof(*sem)); - if (!sem) + if (!sem) { + errno = ENOSPC; return (-1); + } sem->value = value; *semp = sem; @@ -138,13 +145,17 @@ sem_init(sem_t *semp, int pshared, unsigned int value) int sem_destroy(sem_t *semp) { - if (!*semp) - return (EINVAL); + if (!semp || !*semp) { + errno = EINVAL; + return (-1); + } + if ((*semp)->waitcount) { #define MSG "sem_destroy on semaphore with waiters!\n" write(2, MSG, sizeof(MSG) - 1); #undef MSG - return (EBUSY); + errno = EBUSY; + return (-1); } free(*semp); *semp = NULL; @@ -157,6 +168,11 @@ sem_getvalue(sem_t *semp, int *sval) { sem_t sem = *semp; + if (!semp || !*semp) { + errno = EINVAL; + return (-1); + } + _spinlock(&sem->lock); *sval = sem->value; _spinunlock(&sem->lock); @@ -169,6 +185,11 @@ sem_post(sem_t *semp) { sem_t sem = *semp; + if (!semp || !*semp) { + errno = EINVAL; + return (-1); + } + _sem_post(sem); return (0); @@ -179,6 +200,11 @@ sem_wait(sem_t *semp) { sem_t sem = *semp; + if (!semp || !*semp) { + errno = EINVAL; + return (-1); + } + _sem_wait(sem, 0); return (0); @@ -190,6 +216,11 @@ sem_trywait(sem_t *semp) sem_t sem = *semp; int rv; + if (!semp || !*semp) { + errno = EINVAL; + return (-1); + } + rv = _sem_wait(sem, 1); if (!rv) { @@ -200,3 +231,24 @@ sem_trywait(sem_t *semp) return (0); } +sem_t * +sem_open(const char *name, int oflag, ...) +{ + errno = ENOSYS; + return (SEM_FAILED); +} + +int +sem_close(sem_t *sem) +{ + errno = ENOSYS; + return (-1); +} + +int +sem_unlink(const char *name) +{ + errno = ENOSYS; + return (-1); +} + |
