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