From: Robert Spalek Date: Fri, 27 Oct 2006 03:05:16 +0000 (-0700) Subject: added a wrapper for POSIX semaphores that works also on Darwin X-Git-Tag: holmes-import~507^2~37 X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=0e72627fdb86b1204dd58ce42c8918701c7e2cf1;p=libucw.git added a wrapper for POSIX semaphores that works also on Darwin --- 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