blob: f023fd610768ddd99c3b47c2848fae7ce80e046a [file] [log] [blame]
/* -*- Mode: C; tab-width: 8; c-basic-offset: 2; indent-tabs-mode: nil; -*- */
#include "util.h"
size_t page_size = 0;
#define PAGE_ZEROES (page_size / sizeof(int))
static size_t count_page_zeroes(int* p) {
size_t zeroes = 0;
size_t i;
for (i = 0; i < page_size / sizeof(*p); ++i) {
if (!p[i]) {
++zeroes;
}
}
return zeroes;
}
static void set_page_values_nonzero(int* p) {
size_t i;
for (i = 0; i < page_size / sizeof(*p); ++i) {
p[i] = i + 1;
}
}
int main(void) {
int* page;
void* fixed_area;
page_size = sysconf(_SC_PAGESIZE);
fixed_area =
mmap(NULL, page_size * 5, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
test_assert(fixed_area != MAP_FAILED);
test_assert(0 == munmap(fixed_area, page_size * 5));
page = mmap(fixed_area + page_size, page_size, PROT_READ | PROT_WRITE,
MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
test_assert(page != MAP_FAILED);
test_assert(count_page_zeroes(page) == PAGE_ZEROES);
set_page_values_nonzero(page);
test_assert(0 == madvise(page, page_size, MADV_DONTNEED));
test_assert(count_page_zeroes(page) == PAGE_ZEROES);
set_page_values_nonzero(page);
test_assert(0 == madvise(page, 1, MADV_DONTNEED));
test_assert(count_page_zeroes(page) == PAGE_ZEROES);
set_page_values_nonzero(page);
test_assert(-1 == madvise(fixed_area - 1, page_size * 5, MADV_DONTNEED));
test_assert(EINVAL == errno);
/* check this madvise had no effect */
test_assert(count_page_zeroes(page) < PAGE_ZEROES);
test_assert(-1 == madvise(fixed_area, page_size * 5, MADV_DONTNEED));
test_assert(ENOMEM == errno);
/* check this madvise did take effect */
test_assert(count_page_zeroes(page) == PAGE_ZEROES);
atomic_puts("EXIT-SUCCESS");
return 0;
}