#include //#include //#include //#include //#include #include #include wg_t* new_gw(void) { wg_t* wg = malloc(sizeof(wg_t)); wg->num = 0; sem_init(&(wg->sem), 1, 0); return wg; } void wg_init(wg_t* wg) { wg->num = 0; sem_init(&(wg->sem), 1, 0); } void wg_add(wg_t* wg) { wg->num++; } void wg_done(wg_t* wg) { if ((--wg->num) == 0) sem_post(&(wg->sem)); } void wg_wait(wg_t* wg) { if ((wg->num) < 1) sem_post(&(wg->sem)); sem_wait(&(wg->sem)); } void wg_destroy(wg_t* wg) { sem_destroy(&(wg->sem)); } void wg_free(wg_t* wg) { sem_destroy(&(wg->sem)); free(wg); }