mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 08:26:14 +00:00
99 lines
2.3 KiB
C
99 lines
2.3 KiB
C
#define _GNU_SOURCE
|
|
#include "tests/sys_mman.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
static char *mkmap(unsigned sz)
|
|
{
|
|
static char *map;
|
|
static unsigned mapsz;
|
|
char *p;
|
|
|
|
if (map != NULL)
|
|
munmap(map, mapsz);
|
|
|
|
p = (char *)mmap(0, sz, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
|
|
|
|
if (p == (char *)-1) {
|
|
perror("mmap");
|
|
exit(1);
|
|
}
|
|
|
|
map = p;
|
|
mapsz = sz;
|
|
|
|
return p;
|
|
}
|
|
|
|
|
|
int main()
|
|
{
|
|
char *np;
|
|
char *p;
|
|
|
|
p = mkmap(1024*1024);
|
|
np = mremap(p, 1024*1024, 256*1024, 0); /* shrink, fixed */
|
|
if (np == (char *)-1)
|
|
perror("mremap(shrink, fixed)");
|
|
if (np != p)
|
|
fprintf(stderr, "shrink, nomove: p=%p np=%p: shrink moved?!\n",
|
|
p, np);
|
|
if (np != (char *)-1)
|
|
munmap(np, 256*1024);
|
|
|
|
p = mkmap(1024*1024);
|
|
np = mremap(p, 1024*1024, 256*1024, MREMAP_MAYMOVE); /* shrink, maymove */
|
|
if (np == (char *)-1)
|
|
perror("mremap(shrink, maymove)");
|
|
if (np != p)
|
|
fprintf(stderr, "shrink, maymove: p=%p np=%p: shrink moved?!\n",
|
|
p, np);
|
|
if (np != (char *)-1)
|
|
munmap(np, 256*1024);
|
|
|
|
p = mkmap(1024*1024);
|
|
np = mremap(p, 1024*1024, 2048*1024, 0); /* grow, fixed */
|
|
if (np == (char *)-1)
|
|
perror("mremap(grow, fixed)");
|
|
if (np != p)
|
|
fprintf(stderr, "grow, nomove: p=%p np=%p: shrink moved?!\n",
|
|
p, np);
|
|
if (np != (char *)-1)
|
|
munmap(np, 2048*1024);
|
|
|
|
p = mkmap(1024*1024);
|
|
np = mremap(p, 1024*1024, 2048*1024, MREMAP_MAYMOVE); /* grow, maymove */
|
|
if (np == (char *)-1)
|
|
perror("mremap(grow, maymove)");
|
|
if (np != p)
|
|
fprintf(stderr, "grow, maymove: p=%p np=%p: shrink moved?!\n",
|
|
p, np);
|
|
if (np != (char *)-1)
|
|
munmap(np, 2048*1024);
|
|
|
|
p = mkmap(1024*1024);
|
|
munmap(p+512*1024, 4096);
|
|
np = mremap(p, 512*1024, 1024*1024, 0); /* grow, nomove, constrained */
|
|
if (np == (char *)-1)
|
|
perror("mremap(grow, nomove, constrained)");
|
|
else if (np == p)
|
|
fprintf(stderr, "grow, maymove, constrained: p=%p np=%p (managed to grow without moving?!)\n",
|
|
p, np);
|
|
if (np != (char *)-1)
|
|
munmap(np, 1024*1024);
|
|
|
|
p = mkmap(1024*1024);
|
|
munmap(p+512*1024, 4096);
|
|
|
|
np = mremap(p, 512*1024, 1024*1024, MREMAP_MAYMOVE); /* grow, maymove, constrained */
|
|
if (np == (char *)-1)
|
|
perror("mremap(grow, maymove, constrained)");
|
|
if (np == p)
|
|
fprintf(stderr, "grow, maymove, constrained: p=%p np=%p (managed to grow without moving?!)\n",
|
|
p, np);
|
|
if (np != (char *)-1)
|
|
munmap(np, 1024*1024);
|
|
|
|
return 0;
|
|
}
|