1*38b870ccSIlya Leoshkevich #include <assert.h> 2*38b870ccSIlya Leoshkevich #include <stdlib.h> 3*38b870ccSIlya Leoshkevich #include <sys/mman.h> 4*38b870ccSIlya Leoshkevich #include <unistd.h> 5*38b870ccSIlya Leoshkevich 6*38b870ccSIlya Leoshkevich static void test_anonymous(void) 7*38b870ccSIlya Leoshkevich { 8*38b870ccSIlya Leoshkevich int pagesize = getpagesize(); 9*38b870ccSIlya Leoshkevich char *page; 10*38b870ccSIlya Leoshkevich int ret; 11*38b870ccSIlya Leoshkevich 12*38b870ccSIlya Leoshkevich page = mmap(NULL, pagesize, PROT_READ, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); 13*38b870ccSIlya Leoshkevich assert(page != MAP_FAILED); 14*38b870ccSIlya Leoshkevich 15*38b870ccSIlya Leoshkevich /* Check that mprotect() does not interfere with MADV_DONTNEED. */ 16*38b870ccSIlya Leoshkevich ret = mprotect(page, pagesize, PROT_READ | PROT_WRITE); 17*38b870ccSIlya Leoshkevich assert(ret == 0); 18*38b870ccSIlya Leoshkevich 19*38b870ccSIlya Leoshkevich /* Check that MADV_DONTNEED clears the page. */ 20*38b870ccSIlya Leoshkevich *page = 42; 21*38b870ccSIlya Leoshkevich ret = madvise(page, pagesize, MADV_DONTNEED); 22*38b870ccSIlya Leoshkevich assert(ret == 0); 23*38b870ccSIlya Leoshkevich assert(*page == 0); 24*38b870ccSIlya Leoshkevich 25*38b870ccSIlya Leoshkevich ret = munmap(page, pagesize); 26*38b870ccSIlya Leoshkevich assert(ret == 0); 27*38b870ccSIlya Leoshkevich } 28*38b870ccSIlya Leoshkevich 29*38b870ccSIlya Leoshkevich static void test_file(void) 30*38b870ccSIlya Leoshkevich { 31*38b870ccSIlya Leoshkevich char tempname[] = "/tmp/.cmadviseXXXXXX"; 32*38b870ccSIlya Leoshkevich int pagesize = getpagesize(); 33*38b870ccSIlya Leoshkevich ssize_t written; 34*38b870ccSIlya Leoshkevich char c = 42; 35*38b870ccSIlya Leoshkevich char *page; 36*38b870ccSIlya Leoshkevich int ret; 37*38b870ccSIlya Leoshkevich int fd; 38*38b870ccSIlya Leoshkevich 39*38b870ccSIlya Leoshkevich fd = mkstemp(tempname); 40*38b870ccSIlya Leoshkevich assert(fd != -1); 41*38b870ccSIlya Leoshkevich ret = unlink(tempname); 42*38b870ccSIlya Leoshkevich assert(ret == 0); 43*38b870ccSIlya Leoshkevich written = write(fd, &c, sizeof(c)); 44*38b870ccSIlya Leoshkevich assert(written == sizeof(c)); 45*38b870ccSIlya Leoshkevich page = mmap(NULL, pagesize, PROT_READ, MAP_PRIVATE, fd, 0); 46*38b870ccSIlya Leoshkevich assert(page != MAP_FAILED); 47*38b870ccSIlya Leoshkevich 48*38b870ccSIlya Leoshkevich /* Check that mprotect() does not interfere with MADV_DONTNEED. */ 49*38b870ccSIlya Leoshkevich ret = mprotect(page, pagesize, PROT_READ | PROT_WRITE); 50*38b870ccSIlya Leoshkevich assert(ret == 0); 51*38b870ccSIlya Leoshkevich 52*38b870ccSIlya Leoshkevich /* Check that MADV_DONTNEED resets the page. */ 53*38b870ccSIlya Leoshkevich *page = 0; 54*38b870ccSIlya Leoshkevich ret = madvise(page, pagesize, MADV_DONTNEED); 55*38b870ccSIlya Leoshkevich assert(ret == 0); 56*38b870ccSIlya Leoshkevich assert(*page == c); 57*38b870ccSIlya Leoshkevich 58*38b870ccSIlya Leoshkevich ret = munmap(page, pagesize); 59*38b870ccSIlya Leoshkevich assert(ret == 0); 60*38b870ccSIlya Leoshkevich ret = close(fd); 61*38b870ccSIlya Leoshkevich assert(ret == 0); 62*38b870ccSIlya Leoshkevich } 63*38b870ccSIlya Leoshkevich 64*38b870ccSIlya Leoshkevich int main(void) 65*38b870ccSIlya Leoshkevich { 66*38b870ccSIlya Leoshkevich test_anonymous(); 67*38b870ccSIlya Leoshkevich test_file(); 68*38b870ccSIlya Leoshkevich 69*38b870ccSIlya Leoshkevich return EXIT_SUCCESS; 70*38b870ccSIlya Leoshkevich } 71