mremap.c revision e739ac0589b4fb43561f801c4faba8c1b89f8680
1#define _GNU_SOURCE 2#include "tests/sys_mman.h" 3#include <stdio.h> 4#include <stdlib.h> 5 6static 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 29int 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