ui/common/condvar.c

branch
newapi
changeset 349
d188f52cff7f
parent 348
a4fdec2fc353
equal deleted inserted replaced
348:a4fdec2fc353 349:d188f52cff7f
32 32
33 UiCondVar* ui_condvar_create(void) { 33 UiCondVar* ui_condvar_create(void) {
34 UiPosixCondVar *var = malloc(sizeof(UiPosixCondVar)); 34 UiPosixCondVar *var = malloc(sizeof(UiPosixCondVar));
35 var->var.data = NULL; 35 var->var.data = NULL;
36 var->var.intdata = 0; 36 var->var.intdata = 0;
37 var->set = 0;
37 pthread_mutex_init(&var->lock, NULL); 38 pthread_mutex_init(&var->lock, NULL);
38 pthread_cond_init(&var->cond, NULL); 39 pthread_cond_init(&var->cond, NULL);
39 return (UiCondVar*)var; 40 return (UiCondVar*)var;
40 } 41 }
41 42
42 void ui_condvar_wait(UiCondVar *var) { 43 void ui_condvar_wait(UiCondVar *var) {
43 UiPosixCondVar *p = (UiPosixCondVar*)var; 44 UiPosixCondVar *p = (UiPosixCondVar*)var;
44 pthread_mutex_lock(&p->lock); 45 pthread_mutex_lock(&p->lock);
45 pthread_cond_wait(&p->cond, &p->lock); 46 if(!p->set) {
47 pthread_cond_wait(&p->cond, &p->lock);
48 }
49 p->set = 0;
46 pthread_mutex_unlock(&p->lock); 50 pthread_mutex_unlock(&p->lock);
47 51
48 } 52 }
49 53
50 void ui_condvar_signal(UiCondVar *var, void *data, int intdata) { 54 void ui_condvar_signal(UiCondVar *var, void *data, int intdata) {
51 UiPosixCondVar *p = (UiPosixCondVar*)var; 55 UiPosixCondVar *p = (UiPosixCondVar*)var;
52 pthread_mutex_lock(&p->lock); 56 pthread_mutex_lock(&p->lock);
53 p->var.data = data; 57 p->var.data = data;
54 p->var.intdata = intdata; 58 p->var.intdata = intdata;
59 p->set = 1;
55 pthread_cond_signal(&p->cond); 60 pthread_cond_signal(&p->cond);
56 pthread_mutex_unlock(&p->lock); 61 pthread_mutex_unlock(&p->lock);
57 } 62 }
58 63
59 void ui_condvar_destroy(UiCondVar *var) { 64 void ui_condvar_destroy(UiCondVar *var) {

mercurial