blob: 8dfd3bea6dab20b68e0b1122ceb384b1e36c30dc [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17//
18// Encapsulate a shared file mapping.
19//
20#ifndef __LIBS_FILE_MAP_H
21#define __LIBS_FILE_MAP_H
22
23#include <sys/types.h>
24
25#ifdef HAVE_WIN32_FILEMAP
26#include <windows.h>
27#endif
28
29namespace android {
30
31/*
32 * This represents a memory-mapped file. It might be the entire file or
33 * only part of it. This requires a little bookkeeping because the mapping
34 * needs to be aligned on page boundaries, and in some cases we'd like to
35 * have multiple references to the mapped area without creating additional
36 * maps.
37 *
38 * This always uses MAP_SHARED.
39 *
40 * TODO: we should be able to create a new FileMap that is a subset of
41 * an existing FileMap and shares the underlying mapped pages. Requires
42 * completing the refcounting stuff and possibly introducing the notion
43 * of a FileMap hierarchy.
44 */
45class FileMap {
46public:
47 FileMap(void);
48
49 /*
50 * Create a new mapping on an open file.
51 *
52 * Closing the file descriptor does not unmap the pages, so we don't
53 * claim ownership of the fd.
54 *
55 * Returns "false" on failure.
56 */
57 bool create(const char* origFileName, int fd,
58 off_t offset, size_t length, bool readOnly);
59
60 /*
61 * Return the name of the file this map came from, if known.
62 */
63 const char* getFileName(void) const { return mFileName; }
64
65 /*
66 * Get a pointer to the piece of the file we requested.
67 */
68 void* getDataPtr(void) const { return mDataPtr; }
69
70 /*
71 * Get the length we requested.
72 */
73 size_t getDataLength(void) const { return mDataLength; }
74
75 /*
76 * Get the data offset used to create this map.
77 */
78 off_t getDataOffset(void) const { return mDataOffset; }
79
80 /*
81 * Get a "copy" of the object.
82 */
83 FileMap* acquire(void) { mRefCount++; return this; }
84
85 /*
86 * Call this when mapping is no longer needed.
87 */
88 void release(void) {
89 if (--mRefCount <= 0)
90 delete this;
91 }
92
93 /*
94 * This maps directly to madvise() values, but allows us to avoid
95 * including <sys/mman.h> everywhere.
96 */
97 enum MapAdvice {
98 NORMAL, RANDOM, SEQUENTIAL, WILLNEED, DONTNEED
99 };
100
101 /*
102 * Apply an madvise() call to the entire file.
103 *
104 * Returns 0 on success, -1 on failure.
105 */
106 int advise(MapAdvice advice);
107
108protected:
109 // don't delete objects; call release()
110 ~FileMap(void);
111
112private:
113 // these are not implemented
114 FileMap(const FileMap& src);
115 const FileMap& operator=(const FileMap& src);
116
117 int mRefCount; // reference count
118 char* mFileName; // original file name, if known
119 void* mBasePtr; // base of mmap area; page aligned
120 size_t mBaseLength; // length, measured from "mBasePtr"
121 off_t mDataOffset; // offset used when map was created
122 void* mDataPtr; // start of requested data, offset from base
123 size_t mDataLength; // length, measured from "mDataPtr"
124#ifdef HAVE_WIN32_FILEMAP
125 HANDLE mFileHandle; // Win32 file handle
126 HANDLE mFileMapping; // Win32 file mapping handle
127#endif
128
129 static long mPageSize;
130};
131
132}; // namespace android
133
134#endif // __LIBS_FILE_MAP_H