diff options
author | Martin Pieuchot <mpi@cvs.openbsd.org> | 2012-01-04 17:59:29 +0000 |
---|---|---|
committer | Martin Pieuchot <mpi@cvs.openbsd.org> | 2012-01-04 17:59:29 +0000 |
commit | ed330b1b2bc29ed5af74d2fff88eddcc0c2e7967 (patch) | |
tree | b3f39dd04a957d0e245e31561fa3039fa2dc3be2 /lib/librthread/rthread_sem.c | |
parent | 0d5f7123c39d5acf2e4f31f2bbbc4b9e6e0e5f14 (diff) |
Add some sanity checks, set errno accordingly to POSIX and add the named
semaphore stubs already provided by libpthread. We may move them in their
own file in the future when we figure out a real implementation.
Discussed with and looks ok to guenther@
Diffstat (limited to 'lib/librthread/rthread_sem.c')
-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); +} + |