--- /dev/null
+/*
+ Flag
+ ----
+
+ A flag is a data structure that can be used to syncronize a boolean across multiple
+ threads.
+
+ The flag's state can be set, read and waited for in a thread safe manner.
+*/
+
+#ifndef _DRAGONSTD_FLAG_H_ // include guard
+#define _DRAGONSTD_FLAG_H_
+
+#include <pthread.h> // for pthread_mutex_t, pthread_cond_t
+#include <stdatomic.h> // for atomic_bool
+#include <stdbool.h> // for bool
+#include "list.h" // for List
+
+typedef struct {
+ /* protected */
+ atomic_bool set; // whether the flag is set
+ /* private */
+ pthread_cond_t cnd; // main condition variable
+ pthread_mutex_t mtx; // mutex to protect the main condition variable
+ List cvs; // condition variables
+} Flag;
+
+void flag_ini(Flag *flag);
+/*
+ Initializes the flag.
+
+ The flag should be uninitialized or deleted before passed to this function.
+ This function should be called before any other function is called on the flag.
+*/
+
+void flag_dst(Flag *flag);
+/*
+ Destroy the flag.
+
+ The refcount is unusable until reinitialized afterwards.
+*/
+
+void flag_sub(Flag *flag, pthread_cond_t *cnd);
+/*
+ [Thread Safe]
+ Subscribe condition variable cnd to flag.
+
+ The condition variable will be triggered when the flag is set.
+*/
+
+void flag_uns(Flag *flag, pthread_cond_t *cnd);
+/*
+ [Thread Safe]
+ Unsubscribe condition variable cnd from flag.
+
+ The condition variable will no longer be triggered when the flag is set.
+*/
+
+void flag_set(Flag *flag);
+/*
+ [Thread Safe]
+ Sets the flag.
+
+ This changes the flag state to be true and wakes up any threads waiting for it.
+ Afterwards, **the state cannot be changed back**.
+
+ This function can be called multiple times.
+*/
+
+void flag_slp(Flag *flag);
+/*
+ [Thread Safe]
+ Waits for the flag to be true.
+
+ This will sleep until the flag's state is changed to true, unless it is already set to
+ true.
+*/
+
+#endif // _DRAGONSTD_FLAG_H_