From a77a2c30b1134676a676887c30b070efc467119f Mon Sep 17 00:00:00 2001 From: Nathan Fisher Date: Mon, 31 Jul 2023 11:24:03 -0400 Subject: [PATCH] Replace semaphore with pthread_cond_t in job queue --- include/jobq.h | 6 ++++-- src/jobq.c | 9 +++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/include/jobq.h b/include/jobq.h index c00c92b..df9a0c2 100644 --- a/include/jobq.h +++ b/include/jobq.h @@ -34,8 +34,9 @@ #define JOBQ_H #include -#include +#include #include +#include #include "haggis.h" @@ -53,7 +54,8 @@ struct _job_node { typedef struct _job_node haggis_jobq_node; typedef struct { - sem_t *sem; + pthread_cond_t *cond; + size_t count; pthread_mutex_t *mutex; haggis_jobq_node *head; haggis_jobq_node *tail; diff --git a/src/jobq.c b/src/jobq.c index 4c470f5..e402dce 100644 --- a/src/jobq.c +++ b/src/jobq.c @@ -47,16 +47,19 @@ int haggis_jobq_push(haggis_jobq *queue, haggis_job *job) { queue->tail->prev = new; queue->tail = new; } + queue->count++; pthread_mutex_unlock(queue->mutex); - return sem_post(queue->sem); + return 0; } haggis_job* haggis_jobq_pop(haggis_jobq *queue) { haggis_jobq_node *j; haggis_job *job; - sem_wait(queue->sem); + while (queue->count == 0) + pthread_cond_wait(queue->cond, queue->mutex); pthread_mutex_lock(queue->mutex); + queue->count--; j = queue->head; job = j->job; if (queue->tail == queue->head) { @@ -66,7 +69,5 @@ haggis_job* haggis_jobq_pop(haggis_jobq *queue) { } free(j); pthread_mutex_unlock(queue->mutex); - if (sem_post(queue->sem) != 0) - return NULL; return job; }