summaryrefslogtreecommitdiff
path: root/main/sem.c
diff options
context:
space:
mode:
authorDavid M. Lee <dlee@digium.com>2015-01-26 14:50:40 +0000
committerDavid M. Lee <dlee@digium.com>2015-01-26 14:50:40 +0000
commit965777ccfc61067d1dc79f79c12d52f794fa3983 (patch)
treefc931f38e9acc6885ca0df5fdbc1e14bac437495 /main/sem.c
parenta8ae5a7bcb3c102b1a196d109a1d06507dd3dd1e (diff)
Various fixes for OS X
This patch addresses compilation errors on OS X. It's been a while, so there's quite a few things. * Fixed __attribute__ decls in route.h to be portable. * Fixed htonll and ntohll to work when they are defined as macros. * Replaced sem_t usage with our ast_sem wrapper. * Added ast_sem_timedwait to our ast_sem wrapper. * Fixed some GCC 4.9 warnings using sig*set() functions. * Fixed some format strings for portability. * Fixed compilation issues with res_timing_kqueue (although tests still fail on OS X). * Fixed menuconfig /sbin/launchd detection, which disables res_timing_kqueue on OS X). ASTERISK-24539 #close Reported by: George Joseph ASTERISK-24544 #close Reported by: George Joseph Review: https://reviewboard.asterisk.org/r/4327/ ........ Merged revisions 431092 from http://svn.asterisk.org/svn/asterisk/branches/13 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@431093 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/sem.c')
-rw-r--r--main/sem.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/main/sem.c b/main/sem.c
index e67d9c72e..7315165d7 100644
--- a/main/sem.c
+++ b/main/sem.c
@@ -85,6 +85,7 @@ int ast_sem_post(struct ast_sem *sem)
int ast_sem_wait(struct ast_sem *sem)
{
+ int res;
SCOPED_MUTEX(lock, &sem->mutex);
ast_assert(sem->count >= 0);
@@ -92,7 +93,37 @@ int ast_sem_wait(struct ast_sem *sem)
/* Wait for a non-zero count */
++sem->waiters;
while (sem->count == 0) {
- ast_cond_wait(&sem->cond, &sem->mutex);
+ res = ast_cond_wait(&sem->cond, &sem->mutex);
+ /* Give up on error */
+ if (res != 0) {
+ --sem->waiters;
+ return res;
+ }
+ }
+ --sem->waiters;
+
+ /* Take it! */
+ --sem->count;
+
+ return 0;
+}
+
+int ast_sem_timedwait(struct ast_sem *sem, const struct timespec *abs_timeout)
+{
+ int res;
+ SCOPED_MUTEX(lock, &sem->mutex);
+
+ ast_assert(sem->count >= 0);
+
+ /* Wait for a non-zero count */
+ ++sem->waiters;
+ while (sem->count == 0) {
+ res = ast_cond_timedwait(&sem->cond, &sem->mutex, abs_timeout);
+ /* Give up on error */
+ if (res != 0) {
+ --sem->waiters;
+ return res;
+ }
}
--sem->waiters;