mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-03 18:13:01 +00:00
83 lines
1.3 KiB
C
83 lines
1.3 KiB
C
#include <stdio.h>
|
|
#include "tests/sys_mman.h"
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
|
|
static unsigned int pagesize;
|
|
|
|
#define PAGES 1024u
|
|
#define LEN (PAGES*pagesize)
|
|
|
|
static void *domap(void)
|
|
{
|
|
void *ret = mmap(0, LEN, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
|
|
|
|
if (ret == (void *)-1) {
|
|
perror("mmap");
|
|
exit(1);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/* unmap in pieces to exercise munmap more */
|
|
static void nibblemap(void *p)
|
|
{
|
|
int off;
|
|
int i;
|
|
|
|
off = (random() % LEN) & ~(pagesize-1);
|
|
|
|
for(i = 0; i < PAGES; i++) {
|
|
/* printf("unmapping off=%d\n", off/pagesize); */
|
|
munmap((char *)p + off, pagesize);
|
|
off += 619*pagesize;
|
|
off %= LEN;
|
|
}
|
|
}
|
|
|
|
static void prmaps()
|
|
{
|
|
char buf[100];
|
|
sprintf(buf, "/bin/cat /proc/%d/maps", getpid());
|
|
system(buf);
|
|
exit(1);
|
|
}
|
|
|
|
int main()
|
|
{
|
|
int i;
|
|
void *expect1, *expect2;
|
|
|
|
pagesize = getpagesize();
|
|
|
|
expect1 = domap();
|
|
expect2 = domap();
|
|
munmap(expect1, LEN);
|
|
munmap(expect2, LEN);
|
|
|
|
for(i = 0; i < 5; i++) {
|
|
void *m1, *m2;
|
|
|
|
m1 = domap();
|
|
if (m1 != expect1) {
|
|
printf("FAIL i=%d: m1=%p expect1=%p\n",
|
|
i, m1, expect1);
|
|
prmaps();
|
|
return 1;
|
|
}
|
|
m2 = domap();
|
|
if (m2 != expect2) {
|
|
printf("FAIL i=%d: m2=%p expect2=%p\n",
|
|
i, m2, expect2);
|
|
prmaps();
|
|
return 1;
|
|
}
|
|
nibblemap(m2);
|
|
munmap(m1, LEN);
|
|
}
|
|
|
|
printf("PASS\n");
|
|
return 0;
|
|
}
|