Added gawk check to the Makefile
[akaros.git] / tests / ucq.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <parlib.h>
4 #include <sys/mman.h>
5 #include <ucq.h>
6 #include <assert.h>
7
8 int main(int argc, char** argv)
9 {
10         /* this program should only be started from the kernel for tests */
11         printf("Attempting to read ucq messages from test_ucq().  "
12                "Don't call this manually.\n");
13         /* Map into a known, extremely ghetto location.  The kernel knows to look
14          * here. */
15         struct ucq *ucq = mmap((void*)USTACKTOP, PGSIZE, PROT_WRITE | PROT_READ,
16                                MAP_POPULATE, -1, 0);
17         assert((uintptr_t)ucq == USTACKTOP);
18         /* Now init it */
19         uintptr_t two_pages = (uintptr_t)mmap(0, PGSIZE * 2, PROT_WRITE | PROT_READ,
20                                               MAP_POPULATE | MAP_ANONYMOUS, -1, 0);
21         assert(two_pages);
22         ucq_init_raw(ucq, two_pages, two_pages + PGSIZE);
23         /* try to get a simple message */
24         struct event_msg msg;
25         /* 1: Spin til we can get a message (0 on success breaks) */
26         while (get_ucq_msg(ucq, &msg))
27                 cpu_relax();
28         printf("[user] Got simple message type %d(7) with A2 %08p(0xdeadbeef)\n",
29                msg.ev_type, msg.ev_arg2);
30         /* 2: get a bunch */
31         for (int i = 0; i < 5000; i++) {
32                 while (get_ucq_msg(ucq, &msg))
33                         cpu_relax();
34                 assert(msg.ev_type == i);
35         }
36         printf("Received a bunch!  Last one was %d(4999)\n", msg.ev_type);
37         return 0;
38 }