1
0
Fork 0
mirror of https://git.rwth-aachen.de/acs/public/villas/node/ synced 2025-03-09 00:00:00 +01:00

queue_signalled: add some missing functions from queue

This commit is contained in:
Steffen Vogel 2017-04-15 23:14:02 +02:00
parent 8104f54356
commit a5aa5d0e14
2 changed files with 33 additions and 0 deletions

View file

@ -18,10 +18,16 @@ struct queue_signalled {
pthread_mutex_t mutex; /**< Mutex for ready. */
};
#define queue_signalled_available(q) queue_available(&((q)->queue))
int queue_signalled_init(struct queue_signalled *qs, size_t size, struct memtype *mem);
int queue_signalled_destroy(struct queue_signalled *qs);
int queue_signalled_push(struct queue_signalled *qs, void *ptr);
int queue_signalled_pull(struct queue_signalled *qs, void **ptr);
int queue_signalled_push_many(struct queue_signalled *qs, void *ptr[], size_t cnt);
int queue_signalled_pull_many(struct queue_signalled *qs, void *ptr[], size_t cnt);

View file

@ -47,6 +47,21 @@ int queue_signalled_destroy(struct queue_signalled *qs)
return 0;
}
int queue_signalled_push(struct queue_signalled *qs, void *ptr)
{
int ret;
ret = queue_push(&qs->queue, ptr);
if (ret < 0)
return ret;
pthread_mutex_lock(&qs->mutex);
pthread_cond_broadcast(&qs->ready);
pthread_mutex_unlock(&qs->mutex);
return ret;
}
int queue_signalled_push_many(struct queue_signalled *qs, void *ptr[], size_t cnt)
{
int ret;
@ -62,6 +77,18 @@ int queue_signalled_push_many(struct queue_signalled *qs, void *ptr[], size_t cn
return ret;
}
int queue_signalled_pull(struct queue_signalled *qs, void **ptr)
{
/* Make sure that qs->mutex is unlocked if this thread gets cancelled. */
pthread_cleanup_push((void (*)(void*)) pthread_mutex_unlock, &qs->mutex);
pthread_mutex_lock(&qs->mutex);
pthread_cond_wait(&qs->ready, &qs->mutex);
pthread_mutex_unlock(&qs->mutex);
pthread_cleanup_pop(0);
return queue_pull(&qs->queue, ptr);
}
int queue_signalled_pull_many(struct queue_signalled *qs, void *ptr[], size_t cnt)
{
/* Make sure that qs->mutex is unlocked if this thread gets cancelled. */