From 0e72627fdb86b1204dd58ce42c8918701c7e2cf1 Mon Sep 17 00:00:00 2001 From: Robert Spalek Date: Thu, 26 Oct 2006 20:05:16 -0700 Subject: [PATCH] added a wrapper for POSIX semaphores that works also on Darwin --- lib/semaphore.h | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 lib/semaphore.h diff --git a/lib/semaphore.h b/lib/semaphore.h new file mode 100644 index 00000000..ad160b1f --- /dev/null +++ b/lib/semaphore.h @@ -0,0 +1,59 @@ +/* + * The UCW Library -- POSIX semaphores wrapper + * + * (c) 2006 Robert Spalek + * + * This software may be freely distributed and used according to the terms + * of the GNU Lesser General Public License. + */ + +#ifndef _UCW_SEMAPHORE_H +#define _UCW_SEMAPHORE_H + +#include + +#ifdef CONFIG_DARWIN + +#include + +/* In Darwin, sem_init() is unfortunately not implemented and the guide + * recommends emulating it using sem_open(). */ + +static inline sem_t * +sem_alloc(void) +{ + static uns cnt = 0; + byte buf[20]; + sprintf(buf, "tmp/sem-%d-%d", getpid(), cnt++); + sem_t *sem = sem_open(buf, O_CREAT, 0777, 0); + ASSERT(sem != (sem_t*) SEM_FAILED); + return sem; +} + +static inline void +sem_free(sem_t *sem) +{ + sem_close(sem); +} + +#else + +static inline sem_t * +sem_alloc(void) +{ + sem_t *sem = xmalloc(sizeof(sem_t)); + int res = sem_init(sem, 0, 0); + ASSERT(!res); + return sem; +} + +static inline void +sem_free(sem_t *sem) +{ + sem_destroy(sem); + xfree(sem); +} + +#endif + +#endif -- 2.39.5