blob: fb8005e7223ed0be384a377a9618c52eee5204b7 [file] [log] [blame]
/*
* Copyright (C) 2007 Pingtel Corp., certain elements licensed under a Contributor Agreement.
* Contributors retain copyright to elements licensed under a Contributor Agreement.
* Licensed to the User under the LGPL license.
*
* Modified by: Angus Salkeld <asalkeld@redhat.com>
* Copyright (C) 2012 Red Hat, Inc.
* To conform to official implementation and support process shared semaphores.
*
* The bsd posix semaphore implementation does not have support for timing
* out while waiting for a synchronization object. This uses the
* pthread_cond_timedwait function and a mutex to build all the other
* synchronization objecs with timeout capabilities.
*/
#ifndef _RPL_SEM_H
#define _RPL_SEM_H
#include "os_base.h"
#include <pthread.h>
#include <semaphore.h>
#ifdef __cplusplus
extern "C" {
#endif
#ifdef HAVE_SEM_TIMEDWAIT
#define rpl_sem_t sem_t
#define rpl_sem_init sem_init
#define rpl_sem_wait sem_wait
#define rpl_sem_timedwait sem_timedwait
#define rpl_sem_post sem_post
#define rpl_sem_getvalue sem_getvalue
#define rpl_sem_destroy sem_destroy
#define rpl_sem_trywait sem_trywait
#else
typedef struct rpl_sem {
unsigned int count;
uint32_t destroy_request;
pthread_mutex_t mutex;
pthread_cond_t cond;
} rpl_sem_t;
int rpl_sem_init(rpl_sem_t * sem, int pshared, unsigned int count);
int rpl_sem_wait(rpl_sem_t * sem);
int rpl_sem_timedwait(rpl_sem_t * sem, const struct timespec *timeout);
int rpl_sem_trywait(rpl_sem_t * sem);
int rpl_sem_post(rpl_sem_t * sem);
int rpl_sem_getvalue(rpl_sem_t * sem, int *sval);
int rpl_sem_destroy(rpl_sem_t * sem);
#endif /* HAVE_SEM_TIMEDWAIT */
#ifdef __cplusplus
}
#endif
#endif /* _RPL_SEM_H */