This is the mail archive of the
cygwin@cygwin.com
mailing list for the Cygwin project.
munmap bug test program
- From: "peter garrone" <pgarrone at linuxmail dot org>
- To: cygwin at cygwin dot com
- Date: Tue, 30 Sep 2003 10:06:11 +0800
- Subject: munmap bug test program
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/