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/

Reply via email to