1 #define _GNU_SOURCE 2 #include "tests/sys_mman.h" 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 static char *mkmap(unsigned sz) 7 { 8 static char *map; 9 static unsigned mapsz; 10 char *p; 11 12 if (map != NULL) 13 munmap(map, mapsz); 14 15 p = (char *)mmap(0, sz, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 16 17 if (p == (char *)-1) { 18 perror("mmap"); 19 exit(1); 20 } 21 22 map = p; 23 mapsz = sz; 24 25 return p; 26 } 27 28 29 int main() 30 { 31 char *np; 32 char *p; 33 34 p = mkmap(1024*1024); 35 np = mremap(p, 1024*1024, 256*1024, 0); /* shrink, fixed */ 36 if (np == (char *)-1) 37 perror("mremap(shrink, fixed)"); 38 if (np != p) 39 fprintf(stderr, "shrink, nomove: p=%p np=%p: shrink moved?!\n", 40 p, np); 41 if (np != (char *)-1) 42 munmap(np, 256*1024); 43 44 p = mkmap(1024*1024); 45 np = mremap(p, 1024*1024, 256*1024, MREMAP_MAYMOVE); /* shrink, maymove */ 46 if (np == (char *)-1) 47 perror("mremap(shrink, maymove)"); 48 if (np != p) 49 fprintf(stderr, "shrink, maymove: p=%p np=%p: shrink moved?!\n", 50 p, np); 51 if (np != (char *)-1) 52 munmap(np, 256*1024); 53 54 p = mkmap(1024*1024); 55 np = mremap(p, 1024*1024, 2048*1024, 0); /* grow, fixed */ 56 if (np == (char *)-1) 57 perror("mremap(grow, fixed)"); 58 if (np != p) 59 fprintf(stderr, "grow, nomove: p=%p np=%p: shrink moved?!\n", 60 p, np); 61 if (np != (char *)-1) 62 munmap(np, 2048*1024); 63 64 p = mkmap(1024*1024); 65 np = mremap(p, 1024*1024, 2048*1024, MREMAP_MAYMOVE); /* grow, maymove */ 66 if (np == (char *)-1) 67 perror("mremap(grow, maymove)"); 68 if (np != p) 69 fprintf(stderr, "grow, maymove: p=%p np=%p: shrink moved?!\n", 70 p, np); 71 if (np != (char *)-1) 72 munmap(np, 2048*1024); 73 74 p = mkmap(1024*1024); 75 munmap(p+512*1024, 4096); 76 np = mremap(p, 512*1024, 1024*1024, 0); /* grow, nomove, constrained */ 77 if (np == (char *)-1) 78 perror("mremap(grow, nomove, constrained)"); 79 else if (np == p) 80 fprintf(stderr, "grow, maymove, constrained: p=%p np=%p (managed to grow without moving?!)\n", 81 p, np); 82 if (np != (char *)-1) 83 munmap(np, 1024*1024); 84 85 p = mkmap(1024*1024); 86 munmap(p+512*1024, 4096); 87 88 np = mremap(p, 512*1024, 1024*1024, MREMAP_MAYMOVE); /* grow, maymove, constrained */ 89 if (np == (char *)-1) 90 perror("mremap(grow, maymove, constrained)"); 91 if (np == p) 92 fprintf(stderr, "grow, maymove, constrained: p=%p np=%p (managed to grow without moving?!)\n", 93 p, np); 94 if (np != (char *)-1) 95 munmap(np, 1024*1024); 96 97 return 0; 98 } 99