• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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) noexcept;
56      FileMap& operator=(FileMap&& f) noexcept;
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