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 #if defined(_WIN32)
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     FileMap(FileMap&& f);
56     FileMap& operator=(FileMap&& f);
57 
58     /*
59      * Create a new mapping on an open file.
60      *
61      * Closing the file descriptor does not unmap the pages, so we don't
62      * claim ownership of the fd.
63      *
64      * Returns "false" on failure.
65      */
66     bool create(const char* origFileName, int fd,
67                 off64_t offset, size_t length, bool readOnly);
68 
69     ~FileMap(void);
70 
71     /*
72      * Return the name of the file this map came from, if known.
73      */
getFileName(void)74     const char* getFileName(void) const { return mFileName; }
75 
76     /*
77      * Get a pointer to the piece of the file we requested.
78      */
getDataPtr(void)79     void* getDataPtr(void) const { return mDataPtr; }
80 
81     /*
82      * Get the length we requested.
83      */
getDataLength(void)84     size_t getDataLength(void) const { return mDataLength; }
85 
86     /*
87      * Get the data offset used to create this map.
88      */
getDataOffset(void)89     off64_t getDataOffset(void) const { return mDataOffset; }
90 
91     /*
92      * This maps directly to madvise() values, but allows us to avoid
93      * including <sys/mman.h> everywhere.
94      */
95     enum MapAdvice {
96         NORMAL, RANDOM, SEQUENTIAL, WILLNEED, DONTNEED
97     };
98 
99     /*
100      * Apply an madvise() call to the entire file.
101      *
102      * Returns 0 on success, -1 on failure.
103      */
104     int advise(MapAdvice advice);
105 
106 protected:
107 
108 private:
109     // these are not implemented
110     FileMap(const FileMap& src);
111     const FileMap& operator=(const FileMap& src);
112 
113     char*       mFileName;      // original file name, if known
114     void*       mBasePtr;       // base of mmap area; page aligned
115     size_t      mBaseLength;    // length, measured from "mBasePtr"
116     off64_t     mDataOffset;    // offset used when map was created
117     void*       mDataPtr;       // start of requested data, offset from base
118     size_t      mDataLength;    // length, measured from "mDataPtr"
119 #if defined(__MINGW32__)
120     HANDLE      mFileHandle;    // Win32 file handle
121     HANDLE      mFileMapping;   // Win32 file mapping handle
122 #endif
123 
124     static long mPageSize;
125 };
126 
127 }; // namespace android
128 
129 #endif // __LIBS_FILE_MAP_H
130