diff options
author | wrowe <wrowe@13f79535-47bb-0310-9956-ffa450edef68> | 2000-12-07 06:58:59 +0000 |
---|---|---|
committer | wrowe <wrowe@13f79535-47bb-0310-9956-ffa450edef68> | 2000-12-07 06:58:59 +0000 |
commit | 546fc279369de2c8607838c7c4d78eb312cb3345 (patch) | |
tree | 11098bb1fb6e42534b40e0c616f00ca69e06b882 | |
parent | af71460fad496a8568255fedb6d657394b926745 (diff) | |
download | libapr-546fc279369de2c8607838c7c4d78eb312cb3345.tar.gz |
Implement Win32 MMAP support.
git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@60912 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | CHANGES | 3 | ||||
-rw-r--r-- | apr.dsp | 15 | ||||
-rw-r--r-- | aprlib.dsp | 15 | ||||
-rw-r--r-- | include/apr.hw | 2 | ||||
-rw-r--r-- | include/apr_mmap.h | 10 | ||||
-rw-r--r-- | mmap/win32/mmap.c | 165 |
6 files changed, 205 insertions, 5 deletions
@@ -1,4 +1,7 @@ Changes with APR a9 + + *) Add Win32 MMAP support [William Rowe] + *) Allow the APR programmer to specify if the MMAP is read-only or write-able. [Ryan Bloom and Will Rowe] @@ -68,9 +68,8 @@ LIB32=link.exe -lib RSC=rc.exe # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 -# ADD BASE CPP /nologo /MTd /W3 /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD BASE CPP /nologo /MTd /W3 /GX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /ZI /c # ADD CPP /nologo /MDd /W3 /GX /ZI /Od /I "./include" /I "./include/arch" /I "./include/arch/win32" /I "./include/arch/unix" /D "_DEBUG" /D "APR_DECLARE_EXPORT" /D "WIN32" /D "_WINDOWS" /FD /c -# SUBTRACT CPP /YX BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo @@ -371,6 +370,18 @@ SOURCE=.\shmem\win32\shmem.c # PROP Exclude_From_Build 1 # End Source File # End Group +# Begin Group "mmap" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\mmap\unix\common.c +# End Source File +# Begin Source File + +SOURCE=.\mmap\win32\mmap.c +# End Source File +# End Group # End Group # Begin Group "Generated Header Files" diff --git a/aprlib.dsp b/aprlib.dsp index b55b4a6ac..156dfdd91 100644 --- a/aprlib.dsp +++ b/aprlib.dsp @@ -68,9 +68,8 @@ LIB32=link.exe -lib RSC=rc.exe # ADD BASE RSC /l 0x409 # ADD RSC /l 0x409 -# ADD BASE CPP /nologo /MTd /W3 /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD BASE CPP /nologo /MTd /W3 /GX /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /ZI /c # ADD CPP /nologo /MDd /W3 /GX /ZI /Od /I "./include" /I "./include/arch" /I "./include/arch/win32" /I "./include/arch/unix" /D "_DEBUG" /D "APR_DECLARE_EXPORT" /D "WIN32" /D "_WINDOWS" /FD /c -# SUBTRACT CPP /YX BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo @@ -371,6 +370,18 @@ SOURCE=.\shmem\win32\shmem.c # PROP Exclude_From_Build 1 # End Source File # End Group +# Begin Group "mmap" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\mmap\unix\common.c +# End Source File +# Begin Source File + +SOURCE=.\mmap\win32\mmap.c +# End Source File +# End Group # End Group # Begin Group "Generated Header Files" diff --git a/include/apr.hw b/include/apr.hw index 1957894f6..eae8d18fe 100644 --- a/include/apr.hw +++ b/include/apr.hw @@ -171,7 +171,7 @@ #define APR_HAS_SHARED_MEMORY 0 #define APR_HAS_THREADS 1 #define APR_HAS_SENDFILE 1 -#define APR_HAS_MMAP 0 +#define APR_HAS_MMAP 1 #define APR_HAS_FORK 0 #define APR_HAS_RANDOM 1 #define APR_HAS_XLATE 0 diff --git a/include/apr_mmap.h b/include/apr_mmap.h index 4cf4e58fe..a95cedaef 100644 --- a/include/apr_mmap.h +++ b/include/apr_mmap.h @@ -90,6 +90,16 @@ struct apr_mmap_t { /** An area ID. Only valid on BeOS */ area_id area; #endif +#ifdef WIN32 + /** The handle of the file mapping */ + HANDLE mhandle; + /** The start of the real memory page area (mapped view) */ + void *mv; + /** The physical start, size and offset */ + size_t pstart; + size_t psize; + size_t poffset; +#endif /** The start of the memory mapped area */ void *mm; /** The amount of data in the mmap */ diff --git a/mmap/win32/mmap.c b/mmap/win32/mmap.c new file mode 100644 index 000000000..6e66e8800 --- /dev/null +++ b/mmap/win32/mmap.c @@ -0,0 +1,165 @@ +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" must + * not be used to endorse or promote products derived from this + * software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * nor may "Apache" appear in their name, without prior written + * permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * <http://www.apache.org/>. + */ + +#include "apr.h" +#include "apr_private.h" +#include "apr_general.h" +#include "apr_mmap.h" +#include "apr_errno.h" +#include "fileio.h" +#include "apr_portable.h" + +#if APR_HAS_MMAP + +static apr_status_t mmap_cleanup(void *themmap) +{ + apr_mmap_t *mm = themmap; + apr_status_t rv = 0; + if (mm->mv) { + if (!UnmapViewOfFile(mm->mv)) + { + apr_status_t rv = apr_get_os_error(); + CloseHandle(mm->mhandle); + mm->mv = NULL; + mm->mhandle = NULL; + return rv; + } + mm->mv = NULL; + } + if (mm->mhandle) + { + if (!CloseHandle(mm->mhandle)) + { + apr_status_t rv = apr_get_os_error(); + CloseHandle(mm->mhandle); + mm->mhandle = NULL; + return rv; + } + mm->mhandle = NULL; + } + return APR_SUCCESS; +} + +apr_status_t apr_mmap_create(apr_mmap_t **new, apr_file_t *file, apr_off_t offset, + apr_size_t size, apr_int32_t flag, apr_pool_t *cont) +{ + static DWORD memblock = 0; + DWORD fmaccess = 0, mvaccess = 0; + + if (flag & APR_MMAP_WRITE) + fmaccess |= PAGE_READWRITE; + else if (flag & APR_MMAP_READ) + fmaccess |= PAGE_READONLY; + + if (flag & APR_MMAP_READ) + mvaccess |= FILE_MAP_READ; + if (flag & APR_MMAP_WRITE) + mvaccess |= FILE_MAP_WRITE; + + if (!file || !file->filehand || file->filehand == INVALID_HANDLE_VALUE + || file->buffered) + return APR_EBADF; + + if (!memblock) + { + SYSTEM_INFO si; + GetSystemInfo(&si); + memblock = si.dwAllocationGranularity; + } + + *new = apr_pcalloc(cont, sizeof(apr_mmap_t)); + (*new)->pstart = (offset / memblock) * memblock; + (*new)->psize = (offset % memblock) + size; + (*new)->poffset = offset - (*new)->pstart; + + (*new)->mhandle = CreateFileMapping(file->filehand, NULL, fmaccess, + 0, (*new)->psize, NULL); + if (!(*new)->mhandle || (*new)->mhandle == INVALID_HANDLE_VALUE) + { + *new = NULL; + return apr_get_os_error(); + } + + (*new)->mv = MapViewOfFile((*new)->mhandle, mvaccess, 0, + (*new)->poffset, (*new)->psize); + if (!(*new)->mv) + { + apr_status_t rv = apr_get_os_error(); + CloseHandle((*new)->mhandle); + *new = NULL; + return rv; + } + + (*new)->mm = (char*)((*new)->mv) + offset; + (*new)->size = size; + (*new)->cntxt = cont; + + /* register the cleanup... */ + apr_register_cleanup((*new)->cntxt, (void*)(*new), mmap_cleanup, + apr_null_cleanup); + return APR_SUCCESS; +} + +apr_status_t apr_mmap_delete(apr_mmap_t *mmap) +{ + apr_status_t rv; + + if ((rv = mmap_cleanup(mmap)) == APR_SUCCESS) { + apr_kill_cleanup(mmap->cntxt, mmap, mmap_cleanup); + return APR_SUCCESS; + } + return rv; +} + +#endif |