This test program highlights the recent munmap problem addressed by Corinna. It works with the updated mmap, and with linux, fails on cygwin with the prior mmap.
/** * mmap test. * mmaps two chunks of adjacent memory, then munmaps one and a half, * then sees if the remainder is still useable. */ #include <unistd.h> #include <sys/mman.h> #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <fcntl.h> #include <string.h> #ifndef _POSIX_MAPPED_FILES #warning Testing mmap/munmap, but _POSIX_MAPPED_FILES not defined. #endif #define CHUNKSIZE 0x10000 #undef Dim #define Dim(x) ((int)(sizeof(x)/sizeof(x[0]))) void * mapping1,*mapping2; char buff[CHUNKSIZE*4]; int main() { int fd; int r; int temp_open_flags; char name[] = "test_cygwin_munmapXXXXXX"; fd = mkstemp(name); assert(fd != -1); temp_open_flags = fcntl(fd, F_GETFL); assert(temp_open_flags != -1); assert((temp_open_flags & O_RDWR) == O_RDWR); /* Have to write to the file for mapping to work. */ r = write(fd, buff, sizeof(buff)); assert(r == sizeof(buff)); mapping1 = mmap(0, 2*CHUNKSIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); assert(mapping1 != MAP_FAILED); mapping2 = mmap(mapping1 + 2*CHUNKSIZE, 2*CHUNKSIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 2*CHUNKSIZE); if(mapping2 == MAP_FAILED) { printf("OS wont do contiguous memory file mappings. Cant do test. Try changing CHUNKSIZE\n"); munmap(mapping1, 2*CHUNKSIZE); close(fd); unlink(name); exit(0); } printf("mappings: %x %x\n",mapping1,mapping2); /* Unmap from middle of first chunk to end of second chunk. */ r = munmap(mapping1 + CHUNKSIZE, 3*CHUNKSIZE); assert(r == 0); /* now try setting the first half of the first chunk */ memset(mapping1, 0, CHUNKSIZE); close(fd); /* Unmap the last bit, so hopefully the unlink of the temporary file will work. */ r = munmap(mapping1, CHUNKSIZE); assert(r == 0); r = unlink(name); assert(r == 0); return 0; } -- ______________________________________________ http://www.linuxmail.org/ Now with e-mail forwarding for only US$5.95/yr Powered by Outblaze -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/