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 #ifndef _WIN32
30
31 #include "condvar.h"
32
33 #include <stdlib.h>
34
35 UiCondVar* ui_condvar_create(
void) {
36 UiPosixCondVar *var = malloc(
sizeof(UiPosixCondVar));
37 var->var.data =
NULL;
38 var->var.intdata =
0;
39 var->set =
0;
40 pthread_mutex_init(&var->lock,
NULL);
41 pthread_cond_init(&var->cond,
NULL);
42 return (UiCondVar*)var;
43 }
44
45 void ui_condvar_wait(UiCondVar *var) {
46 UiPosixCondVar *p = (UiPosixCondVar*)var;
47 pthread_mutex_lock(&p->lock);
48 if(!p->set) {
49 pthread_cond_wait(&p->cond, &p->lock);
50 }
51 p->set =
0;
52 pthread_mutex_unlock(&p->lock);
53
54 }
55
56 void ui_condvar_signal(UiCondVar *var,
void *data,
int intdata) {
57 UiPosixCondVar *p = (UiPosixCondVar*)var;
58 pthread_mutex_lock(&p->lock);
59 p->var.data = data;
60 p->var.intdata = intdata;
61 p->set =
1;
62 pthread_cond_signal(&p->cond);
63 pthread_mutex_unlock(&p->lock);
64 }
65
66 void ui_condvar_destroy(UiCondVar *var) {
67 UiPosixCondVar *p = (UiPosixCondVar*)var;
68 pthread_mutex_destroy(&p->lock);
69 pthread_cond_destroy(&p->cond);
70 free(p);
71
72 }
73
74 #endif