Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com Message-ID: <20030930020612.11298.qmail@linuxmail.org> Content-Type: text/plain; charset="iso-8859-1" Content-Disposition: inline Content-Transfer-Encoding: 7bit MIME-Version: 1.0 From: "peter garrone" To: cygwin AT cygwin DOT com Date: Tue, 30 Sep 2003 10:06:11 +0800 Subject: munmap bug test program X-Originating-Ip: 192.10.200.223 X-Originating-Server: ws5-6.us4.outblaze.com 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 #include #include #include #include #include #include #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/