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