flag->set = false;
pthread_cond_init(&flag->cnd, NULL);
pthread_mutex_init(&flag->mtx, NULL);
+ list_ini(&flag->cvs);
+ flag_sub(flag, &flag->cnd);
}
void flag_dst(Flag *flag)
{
pthread_cond_destroy(&flag->cnd);
pthread_mutex_destroy(&flag->mtx);
+ list_clr(&flag->cvs, NULL, NULL, NULL);
+}
+
+void flag_sub(Flag *flag, pthread_cond_t *cnd)
+{
+ pthread_mutex_lock(&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->set = true;
- pthread_cond_broadcast(&flag->cnd);
+
+ LIST_ITERATE(&flag->cvs, node)
+ pthread_cond_broadcast(node->dat);
+
pthread_mutex_unlock(&flag->mtx);
}