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) { |