]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/dde/fbsd/examples/tests/lock_cv/main.c
Inital import
[l4.git] / l4 / pkg / dde / fbsd / examples / tests / lock_cv / main.c
1 #include <sys/types.h>
2 #include <sys/systm.h>
3 #include <sys/param.h>
4 #include <sys/kernel.h>
5 #include <sys/lock.h>
6 #include <sys/mutex.h>
7 #include <sys/condvar.h>
8
9 #include <l4/dde/dde.h>
10 #include <l4/sys/types.h>
11 #include <l4/thread/thread.h>
12 #include <l4/dde/fbsd/dde.h>
13 #include <l4/dde/fbsd/bsd_dde.h>
14
15 l4_ssize_t l4libc_heapsize = 1*1024*1024;
16
17 static struct mtx mtx1;
18 static struct cv cv1;
19
20 static void cond(void *data) {
21         int res;
22
23         printf("%d: entered\n", (int) data);
24         bsd_dde_prepare_thread("cond");
25
26         mtx_lock(&mtx1);
27         res = cv_timedwait(&cv1, &mtx1, hz/10);
28         mtx_unlock(&mtx1);
29         printf("%d: %s\n", (int) data, (res?"timeout":"success"));
30 }
31
32 int main(int argc, char **argv) {
33         ddekit_init();
34         bsd_dde_init();
35
36         printf("cold=%d\n", cold);
37
38         mtx_init(&mtx1, "test mutex", "test", MTX_DEF);
39         cv_init(&cv1, "test condvar");
40
41         printf("----------------------------------------\n");
42
43         printf("wait for timeout\n");
44         l4thread_create(cond, (void*) 1, L4THREAD_CREATE_ASYNC);
45         l4thread_sleep(200);
46
47         printf("----------------------------------------\n");
48
49         printf("calling signal too early\n");
50         cv_signal(&cv1);
51         l4thread_create(cond, (void*) 2, L4THREAD_CREATE_ASYNC);
52         l4thread_sleep(200);
53
54         printf("----------------------------------------\n");
55
56         printf("calling broadcast too early\n");
57         cv_broadcast(&cv1);
58         l4thread_create(cond, (void*) 3, L4THREAD_CREATE_ASYNC);
59         l4thread_sleep(200);
60
61         printf("----------------------------------------\n");
62
63         printf("waking up one of two threads by signal\n");
64         l4thread_create(cond, (void*) 4, L4THREAD_CREATE_ASYNC);
65         l4thread_create(cond, (void*) 5, L4THREAD_CREATE_ASYNC);
66         l4thread_sleep(30);
67         cv_signal(&cv1);
68         l4thread_sleep(200);
69
70         printf("----------------------------------------\n");
71
72         printf("waking up two threads by signal\n");
73         l4thread_create(cond, (void*) 6, L4THREAD_CREATE_ASYNC);
74         l4thread_create(cond, (void*) 7, L4THREAD_CREATE_ASYNC);
75         l4thread_sleep(30);
76         cv_signal(&cv1);
77         l4thread_sleep(30);
78         cv_signal(&cv1);
79         l4thread_sleep(200);
80
81         printf("----------------------------------------\n");
82
83         printf("waking up two threads by broadcast\n");
84         l4thread_create(cond, (void*) 8, L4THREAD_CREATE_ASYNC);
85         l4thread_create(cond, (void*) 9, L4THREAD_CREATE_ASYNC);
86         l4thread_sleep(30);
87         cv_broadcast(&cv1);
88         l4thread_sleep(200);
89
90         printf("----------------------------------------\n");
91
92         l4thread_sleep_forever();
93         return 0;
94 }