]> git.lizzy.rs Git - dragonstd.git/blobdiff - flag.c
Style: no longer put space after unary operators
[dragonstd.git] / flag.c
diff --git a/flag.c b/flag.c
index e7d1a6f4c48abd8379cb5d48b006c0addbc8c1e7..6937e5f04e3a1b58746d5eb7c54a1aefb8b8ccf7 100644 (file)
--- a/flag.c
+++ b/flag.c
@@ -1,34 +1,50 @@
-#include <stdlib.h>
 #include "flag.h"
 
-Flag *flag_create()
+void flag_ini(Flag *flag)
 {
-       Flag *flag = malloc(sizeof *flag);
-       flag->done = false;
-       pthread_cond_init(&flag->cv, NULL);
+       flag->set = false;
+       pthread_cond_init(&flag->cnd, NULL);
        pthread_mutex_init(&flag->mtx, NULL);
-       return flag;
+       list_ini(&flag->cvs);
+       flag_sub(flag, &flag->cnd);
 }
 
-void flag_delete(Flag *flag)
+void flag_dst(Flag *flag)
 {
-       pthread_cond_destroy(&flag->cv);        
+       pthread_cond_destroy(&flag->cnd);
        pthread_mutex_destroy(&flag->mtx);
-       free(flag);
+       list_clr(&flag->cvs, NULL, NULL, NULL);
 }
 
-void flag_wait(Flag *flag)
+void flag_sub(Flag *flag, pthread_cond_t *cnd)
 {
        pthread_mutex_lock(&flag->mtx);
-       if (! flag->done)
-               pthread_cond_wait(&flag->cv, &flag->mtx);
+       list_add(&flag->cvs, cnd, &cmp_ref, NULL);
+       pthread_mutex_unlock(&flag->mtx);
+}
+
+void flag_uns(Flag *flag, pthread_cond_t *cnd)
+{
+       pthread_mutex_lock(&flag->mtx);
+       list_del(&flag->cvs, cnd, &cmp_ref, NULL);
        pthread_mutex_unlock(&flag->mtx);
 }
 
 void flag_set(Flag *flag)
 {
        pthread_mutex_lock(&flag->mtx);
-       flag->done = true;
-       pthread_cond_broadcast(&flag->cv);
+       flag->set = true;
+
+       LIST_ITERATE(&flag->cvs, node)
+               pthread_cond_broadcast(node->dat);
+
+       pthread_mutex_unlock(&flag->mtx);
+}
+
+void flag_slp(Flag *flag)
+{
+       pthread_mutex_lock(&flag->mtx);
+       if (!flag->set)
+               pthread_cond_wait(&flag->cnd, &flag->mtx);
        pthread_mutex_unlock(&flag->mtx);
 }