minor fix to the type table
[musl-tables] / vmfill.c
1 #include <stdlib.h>
2 #include <stdint.h>
3 #include <stdio.h>
4 #include <sys/mman.h>
5 #include <fcntl.h>
6 #include <unistd.h>
7
8 #ifndef PAGE_SIZE
9         #define PAGE_SIZE sysconf(_SC_PAGE_SIZE)
10 #endif
11
12 static void printvm() {
13         int fd = open("/proc/self/smaps", O_RDONLY);
14         char buf[4096];
15         int n;
16
17         printf("/proc/self/smaps:\n");
18         fflush(stdout);
19         while ((n = read(fd, buf, sizeof buf)) > 0)
20                 write(1, buf, n);
21         close(fd);
22 }
23
24 static size_t mmapmax(int fd, void **p) {
25         size_t i,j,n=0;
26
27         for (i=j=SIZE_MAX/2+1; i>=PAGE_SIZE; i/=2) {
28                 if ((*p=mmap(NULL, j, PROT_NONE, MAP_PRIVATE, fd, 0)) == MAP_FAILED)
29                         j -= i/2;
30                 else {
31                         n = j;
32                         munmap(*p, n);
33                         j += i/2;
34                 }
35         }
36         if (n && (*p=mmap(NULL, n, PROT_NONE, MAP_PRIVATE, fd, 0)) == MAP_FAILED) {
37                 fprintf(stderr, "failed to mmap the same amount again.\n");
38                 exit(1);
39         }
40         return n;
41 }
42
43 int main(int argc, char *argv[]) {
44         const int fd = open("/dev/zero", O_RDWR);
45         void *p[100];
46         size_t n[100];
47         size_t sum = 0;
48         int i;
49         int vmmaps = 0;
50
51         if (argc == 2 && argv[1][0]=='-' && argv[1][1]=='v')
52                 vmmaps = 1;
53
54         for (i=0; i<sizeof p/sizeof *p; i++) {
55                 n[i] = mmapmax(fd, p+i);
56                 if (!n[i])
57                         break;
58                 sum += n[i];
59                 printf("%d %16zu B %012zx-%012zx\n", i, n[i], (size_t)p[i], (size_t)p[i]+n[i]);
60         }
61         printf("mmaped %zu B in %d blocks.\n", sum, i);
62
63         printf("try malloc:");
64         for(i=0; i < 1000 && malloc(PAGE_SIZE) != NULL; i++)
65                 printf(".");
66         printf(" %zu B\n", i*(size_t)PAGE_SIZE);
67
68         if (vmmaps)
69                 printvm();
70         return 0;
71 }