From 4e1758fbf2261950df0d323460e7fbf35d402dd5 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 13 Feb 2022 16:25:40 +0100 Subject: [PATCH] Add flags --- flag.c | 34 ++++++++++++++++++++++++++++++++++ flag.h | 19 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 flag.c create mode 100644 flag.h diff --git a/flag.c b/flag.c new file mode 100644 index 0000000..e7d1a6f --- /dev/null +++ b/flag.c @@ -0,0 +1,34 @@ +#include +#include "flag.h" + +Flag *flag_create() +{ + Flag *flag = malloc(sizeof *flag); + flag->done = false; + pthread_cond_init(&flag->cv, NULL); + pthread_mutex_init(&flag->mtx, NULL); + return flag; +} + +void flag_delete(Flag *flag) +{ + pthread_cond_destroy(&flag->cv); + pthread_mutex_destroy(&flag->mtx); + free(flag); +} + +void flag_wait(Flag *flag) +{ + pthread_mutex_lock(&flag->mtx); + if (! flag->done) + pthread_cond_wait(&flag->cv, &flag->mtx); + pthread_mutex_unlock(&flag->mtx); +} + +void flag_set(Flag *flag) +{ + pthread_mutex_lock(&flag->mtx); + flag->done = true; + pthread_cond_broadcast(&flag->cv); + pthread_mutex_unlock(&flag->mtx); +} diff --git a/flag.h b/flag.h new file mode 100644 index 0000000..61e0be2 --- /dev/null +++ b/flag.h @@ -0,0 +1,19 @@ +#ifndef _DRAGONSTD_FLAG_H_ +#define _DRAGONSTD_FLAG_H_ + +#include +#include +#include + +typedef struct { + atomic_bool done; + pthread_cond_t cv; + pthread_mutex_t mtx; +} Flag; + +Flag *flag_create(); +void flag_delete(Flag *flag); +void flag_set(Flag *flag); +void flag_wait(Flag *flag); + +#endif -- 2.44.0