1 /* 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 #include <utils/Compat.h> 26 27 #if defined(__MINGW32__) 28 // Ensure that we always pull in winsock2.h before windows.h 29 #ifdef HAVE_WINSOCK 30 #include <winsock2.h> 31 #endif 32 #include <windows.h> 33 #endif 34 35 namespace android { 36 37 /* 38 * This represents a memory-mapped file. It might be the entire file or 39 * only part of it. This requires a little bookkeeping because the mapping 40 * needs to be aligned on page boundaries, and in some cases we'd like to 41 * have multiple references to the mapped area without creating additional 42 * maps. 43 * 44 * This always uses MAP_SHARED. 45 * 46 * TODO: we should be able to create a new FileMap that is a subset of 47 * an existing FileMap and shares the underlying mapped pages. Requires 48 * completing the refcounting stuff and possibly introducing the notion 49 * of a FileMap hierarchy. 50 */ 51 class FileMap { 52 public: 53 FileMap(void); 54 55 /* 56 * Create a new mapping on an open file. 57 * 58 * Closing the file descriptor does not unmap the pages, so we don't 59 * claim ownership of the fd. 60 * 61 * Returns "false" on failure. 62 */ 63 bool create(const char* origFileName, int fd, 64 off64_t offset, size_t length, bool readOnly); 65 66 ~FileMap(void); 67 68 /* 69 * Return the name of the file this map came from, if known. 70 */ getFileName(void)71 const char* getFileName(void) const { return mFileName; } 72 73 /* 74 * Get a pointer to the piece of the file we requested. 75 */ getDataPtr(void)76 void* getDataPtr(void) const { return mDataPtr; } 77 78 /* 79 * Get the length we requested. 80 */ getDataLength(void)81 size_t getDataLength(void) const { return mDataLength; } 82 83 /* 84 * Get the data offset used to create this map. 85 */ getDataOffset(void)86 off64_t getDataOffset(void) const { return mDataOffset; } 87 88 /* 89 * This maps directly to madvise() values, but allows us to avoid 90 * including <sys/mman.h> everywhere. 91 */ 92 enum MapAdvice { 93 NORMAL, RANDOM, SEQUENTIAL, WILLNEED, DONTNEED 94 }; 95 96 /* 97 * Apply an madvise() call to the entire file. 98 * 99 * Returns 0 on success, -1 on failure. 100 */ 101 int advise(MapAdvice advice); 102 103 protected: 104 105 private: 106 // these are not implemented 107 FileMap(const FileMap& src); 108 const FileMap& operator=(const FileMap& src); 109 110 char* mFileName; // original file name, if known 111 void* mBasePtr; // base of mmap area; page aligned 112 size_t mBaseLength; // length, measured from "mBasePtr" 113 off64_t mDataOffset; // offset used when map was created 114 void* mDataPtr; // start of requested data, offset from base 115 size_t mDataLength; // length, measured from "mDataPtr" 116 #if defined(__MINGW32__) 117 HANDLE mFileHandle; // Win32 file handle 118 HANDLE mFileMapping; // Win32 file mapping handle 119 #endif 120 121 static long mPageSize; 122 }; 123 124 }; // namespace android 125 126 #endif // __LIBS_FILE_MAP_H 127