1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 #include "condvar.h"
30
31 #include <stdlib.h>
32
33 UiCondVar* ui_condvar_create(
void) {
34 UiPosixCondVar *var = malloc(
sizeof(UiPosixCondVar));
35 var->var.data =
NULL;
36 var->var.intdata =
0;
37 var->set =
0;
38 pthread_mutex_init(&var->lock,
NULL);
39 pthread_cond_init(&var->cond,
NULL);
40 return (UiCondVar*)var;
41 }
42
43 void ui_condvar_wait(UiCondVar *var) {
44 UiPosixCondVar *p = (UiPosixCondVar*)var;
45 pthread_mutex_lock(&p->lock);
46 if(!p->set) {
47 pthread_cond_wait(&p->cond, &p->lock);
48 }
49 p->set =
0;
50 pthread_mutex_unlock(&p->lock);
51
52 }
53
54 void ui_condvar_signal(UiCondVar *var,
void *data,
int intdata) {
55 UiPosixCondVar *p = (UiPosixCondVar*)var;
56 pthread_mutex_lock(&p->lock);
57 p->var.data = data;
58 p->var.intdata = intdata;
59 p->set =
1;
60 pthread_cond_signal(&p->cond);
61 pthread_mutex_unlock(&p->lock);
62 }
63
64 void ui_condvar_destroy(UiCondVar *var) {
65 UiPosixCondVar *p = (UiPosixCondVar*)var;
66 pthread_mutex_destroy(&p->lock);
67 pthread_cond_destroy(&p->cond);
68 free(p);
69
70 }
71