parlib: Prevent running ctors twice
[akaros.git] / user / utest / mmap_pf.c
1 #define _LARGEFILE64_SOURCE /* needed to use lseek64 */
2
3 #include <stdio.h>
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <fcntl.h>
7 #include <parlib/arch/arch.h>
8 #include <unistd.h>
9 #include <errno.h>
10 #include <dirent.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include <sys/mman.h>
14
15 #include <utest/utest.h>
16
17 /* This test will run with a 2LS */
18 #include <parlib/parlib.h>
19 #include <parlib/uthread.h>
20
21 TEST_SUITE("MMAP PAGE FAULT");
22
23 /* <--- Begin definition of test cases ---> */
24
25 char global_char;
26
27 /* Hacky helper to start flushing the page cache.  It will never stop btw. */
28 static void turn_on_flusher(void)
29 {
30         int ret;
31         int fd = open("#regress/mondata", O_RDWR);
32         const char msg[] = "fs pmflusher";
33
34         assert(fd >= 0);
35         ret = write(fd, msg, sizeof(msg));
36         assert(ret == sizeof(msg));
37 }
38
39 /* This test isn't guaranteed to trigger a PF on an mmap'd file, but it's
40  * likely.  This is close coupled to KFS (hello.txt), #regress, and the behavior
41  * of pm_flusher. */
42 bool test_pf(void)
43 {
44         int fd;
45         void *addr;
46
47         fd = open("hello.txt", O_READ);
48         UT_ASSERT(fd >= 0);
49         addr = mmap(0, 4096, PROT_READ, MAP_SHARED, fd, 0);
50         UT_ASSERT(addr != MAP_FAILED);
51         turn_on_flusher();
52         for (int i = 0; i < 100; i++) {
53                 global_char = *(char*)addr;
54                 uthread_usleep(1000);
55         }
56         return TRUE;
57 }
58
59 /* <--- End definition of test cases ---> */
60
61 struct utest utests[] = {
62         UTEST_REG(pf),
63 };
64 int num_utests = sizeof(utests) / sizeof(struct utest);
65
66 int main(int argc, char *argv[])
67 {
68         // Run test suite passing it all the args as whitelist of what tests to run.
69         char **whitelist = &argv[1];
70         int whitelist_len = argc - 1;
71
72         //parlib_wants_to_be_mcp = FALSE; // XXX should be able to do this!
73         uthread_mcp_init();
74         RUN_TEST_SUITE(utests, num_utests, whitelist, whitelist_len);
75 }