summaryrefslogtreecommitdiff
path: root/main/sem.c
diff options
context:
space:
mode:
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;