1251875Speter/* Licensed to the Apache Software Foundation (ASF) under one or more 2251875Speter * contributor license agreements. See the NOTICE file distributed with 3251875Speter * this work for additional information regarding copyright ownership. 4251875Speter * The ASF licenses this file to You under the Apache License, Version 2.0 5251875Speter * (the "License"); you may not use this file except in compliance with 6251875Speter * the License. You may obtain a copy of the License at 7251875Speter * 8251875Speter * http://www.apache.org/licenses/LICENSE-2.0 9251875Speter * 10251875Speter * Unless required by applicable law or agreed to in writing, software 11251875Speter * distributed under the License is distributed on an "AS IS" BASIS, 12251875Speter * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13251875Speter * See the License for the specific language governing permissions and 14251875Speter * limitations under the License. 15251875Speter */ 16251875Speter 17251875Speter#ifndef APR_MMAP_H 18251875Speter#define APR_MMAP_H 19251875Speter 20251875Speter/** 21251875Speter * @file apr_mmap.h 22251875Speter * @brief APR MMAP routines 23251875Speter */ 24251875Speter 25251875Speter#include "apr.h" 26251875Speter#include "apr_pools.h" 27251875Speter#include "apr_errno.h" 28251875Speter#include "apr_ring.h" 29251875Speter#include "apr_file_io.h" /* for apr_file_t */ 30251875Speter 31251875Speter#ifdef BEOS 32251875Speter#include <kernel/OS.h> 33251875Speter#endif 34251875Speter 35251875Speter#ifdef __cplusplus 36251875Speterextern "C" { 37251875Speter#endif /* __cplusplus */ 38251875Speter 39251875Speter/** 40251875Speter * @defgroup apr_mmap MMAP (Memory Map) Routines 41251875Speter * @ingroup APR 42251875Speter * @{ 43251875Speter */ 44251875Speter 45251875Speter/** MMap opened for reading */ 46251875Speter#define APR_MMAP_READ 1 47251875Speter/** MMap opened for writing */ 48251875Speter#define APR_MMAP_WRITE 2 49251875Speter 50251875Speter/** @see apr_mmap_t */ 51251875Spetertypedef struct apr_mmap_t apr_mmap_t; 52251875Speter 53251875Speter/** 54251875Speter * @remark 55251875Speter * As far as I can tell the only really sane way to store an MMAP is as a 56251875Speter * void * and a length. BeOS requires this area_id, but that's just a little 57251875Speter * something extra. I am exposing this type, because it doesn't make much 58251875Speter * sense to keep it private, and opening it up makes some stuff easier in 59251875Speter * Apache. 60251875Speter */ 61251875Speter/** The MMAP structure */ 62251875Speterstruct apr_mmap_t { 63251875Speter /** The pool the mmap structure was allocated out of. */ 64251875Speter apr_pool_t *cntxt; 65251875Speter#ifdef BEOS 66251875Speter /** An area ID. Only valid on BeOS */ 67251875Speter area_id area; 68251875Speter#endif 69251875Speter#ifdef WIN32 70251875Speter /** The handle of the file mapping */ 71251875Speter HANDLE mhandle; 72251875Speter /** The start of the real memory page area (mapped view) */ 73251875Speter void *mv; 74251875Speter /** The physical start, size and offset */ 75251875Speter apr_off_t pstart; 76251875Speter apr_size_t psize; 77251875Speter apr_off_t poffset; 78251875Speter#endif 79251875Speter /** The start of the memory mapped area */ 80251875Speter void *mm; 81251875Speter /** The amount of data in the mmap */ 82251875Speter apr_size_t size; 83251875Speter /** ring of apr_mmap_t's that reference the same 84251875Speter * mmap'ed region; acts in place of a reference count */ 85251875Speter APR_RING_ENTRY(apr_mmap_t) link; 86251875Speter}; 87251875Speter 88251875Speter#if APR_HAS_MMAP || defined(DOXYGEN) 89251875Speter 90251875Speter/** @def APR_MMAP_THRESHOLD 91251875Speter * Files have to be at least this big before they're mmap()d. This is to deal 92251875Speter * with systems where the expense of doing an mmap() and an munmap() outweighs 93251875Speter * the benefit for small files. It shouldn't be set lower than 1. 94251875Speter */ 95251875Speter#ifdef MMAP_THRESHOLD 96251875Speter# define APR_MMAP_THRESHOLD MMAP_THRESHOLD 97251875Speter#else 98251875Speter# ifdef SUNOS4 99251875Speter# define APR_MMAP_THRESHOLD (8*1024) 100251875Speter# else 101251875Speter# define APR_MMAP_THRESHOLD 1 102251875Speter# endif /* SUNOS4 */ 103251875Speter#endif /* MMAP_THRESHOLD */ 104251875Speter 105251875Speter/** @def APR_MMAP_LIMIT 106251875Speter * Maximum size of MMap region 107251875Speter */ 108251875Speter#ifdef MMAP_LIMIT 109251875Speter# define APR_MMAP_LIMIT MMAP_LIMIT 110251875Speter#else 111251875Speter# define APR_MMAP_LIMIT (4*1024*1024) 112251875Speter#endif /* MMAP_LIMIT */ 113251875Speter 114251875Speter/** Can this file be MMaped */ 115251875Speter#define APR_MMAP_CANDIDATE(filelength) \ 116251875Speter ((filelength >= APR_MMAP_THRESHOLD) && (filelength < APR_MMAP_LIMIT)) 117251875Speter 118251875Speter/* Function definitions */ 119251875Speter 120251875Speter/** 121251875Speter * Create a new mmap'ed file out of an existing APR file. 122251875Speter * @param newmmap The newly created mmap'ed file. 123269847Speter * @param file The file to turn into an mmap. 124251875Speter * @param offset The offset into the file to start the data pointer at. 125251875Speter * @param size The size of the file 126251875Speter * @param flag bit-wise or of: 127251875Speter * <PRE> 128251875Speter * APR_MMAP_READ MMap opened for reading 129251875Speter * APR_MMAP_WRITE MMap opened for writing 130251875Speter * </PRE> 131251875Speter * @param cntxt The pool to use when creating the mmap. 132251875Speter */ 133251875SpeterAPR_DECLARE(apr_status_t) apr_mmap_create(apr_mmap_t **newmmap, 134251875Speter apr_file_t *file, apr_off_t offset, 135251875Speter apr_size_t size, apr_int32_t flag, 136251875Speter apr_pool_t *cntxt); 137251875Speter 138251875Speter/** 139251875Speter * Duplicate the specified MMAP. 140251875Speter * @param new_mmap The structure to duplicate into. 141251875Speter * @param old_mmap The mmap to duplicate. 142251875Speter * @param p The pool to use for new_mmap. 143251875Speter */ 144251875SpeterAPR_DECLARE(apr_status_t) apr_mmap_dup(apr_mmap_t **new_mmap, 145251875Speter apr_mmap_t *old_mmap, 146251875Speter apr_pool_t *p); 147251875Speter 148251875Speter/** 149251875Speter * Remove a mmap'ed. 150251875Speter * @param mm The mmap'ed file. 151251875Speter */ 152251875SpeterAPR_DECLARE(apr_status_t) apr_mmap_delete(apr_mmap_t *mm); 153251875Speter 154251875Speter/** 155251875Speter * Move the pointer into the mmap'ed file to the specified offset. 156251875Speter * @param addr The pointer to the offset specified. 157251875Speter * @param mm The mmap'ed file. 158251875Speter * @param offset The offset to move to. 159251875Speter */ 160251875SpeterAPR_DECLARE(apr_status_t) apr_mmap_offset(void **addr, apr_mmap_t *mm, 161251875Speter apr_off_t offset); 162251875Speter 163251875Speter#endif /* APR_HAS_MMAP */ 164251875Speter 165251875Speter/** @} */ 166251875Speter 167251875Speter#ifdef __cplusplus 168251875Speter} 169251875Speter#endif 170251875Speter 171251875Speter#endif /* ! APR_MMAP_H */ 172