OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef BASE_FILES_MEMORY_MAPPED_FILE_H_ | 5 #ifndef BASE_FILES_MEMORY_MAPPED_FILE_H_ |
6 #define BASE_FILES_MEMORY_MAPPED_FILE_H_ | 6 #define BASE_FILES_MEMORY_MAPPED_FILE_H_ |
7 | 7 |
8 #include "base/base_export.h" | 8 #include "base/base_export.h" |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/files/file.h" | 10 #include "base/files/file.h" |
(...skipping 30 matching lines...) Expand all Loading... |
41 private: | 41 private: |
42 // This ctor is used only by kWholeFile, to construct a zero-sized Region | 42 // This ctor is used only by kWholeFile, to construct a zero-sized Region |
43 // (which is forbidden by the public ctor) and uniquely identify kWholeFile. | 43 // (which is forbidden by the public ctor) and uniquely identify kWholeFile. |
44 Region(base::LinkerInitialized); | 44 Region(base::LinkerInitialized); |
45 }; | 45 }; |
46 | 46 |
47 // Opens an existing file and maps it into memory. Access is restricted to | 47 // Opens an existing file and maps it into memory. Access is restricted to |
48 // read only. If this object already points to a valid memory mapped file | 48 // read only. If this object already points to a valid memory mapped file |
49 // then this method will fail and return false. If it cannot open the file, | 49 // then this method will fail and return false. If it cannot open the file, |
50 // the file does not exist, or the memory mapping fails, it will return false. | 50 // the file does not exist, or the memory mapping fails, it will return false. |
51 // Later we may want to allow the user to specify access. | |
52 bool Initialize(const FilePath& file_name); | 51 bool Initialize(const FilePath& file_name); |
53 | 52 |
54 // As above, but works with an already-opened file. MemoryMappedFile takes | 53 // As above, works with an already-opened file, closes it when done, and |
55 // ownership of |file| and closes it when done. | 54 // enables write permission when |write| is true. |
56 bool Initialize(File file); | 55 bool Initialize(File file, bool write); |
57 | 56 |
58 // As above, but works with a region of an already-opened file. | 57 // As above, but works with a region of an already-opened file and enables |
59 bool Initialize(File file, const Region& region); | 58 // write permission when |write| is true. |
| 59 bool Initialize(File file, const Region& region, bool write); |
60 | 60 |
61 #if defined(OS_WIN) | 61 #if defined(OS_WIN) |
62 // Opens an existing file and maps it as an image section. Please refer to | 62 // Opens an existing file and maps it as an image section. Please refer to |
63 // the Initialize function above for additional information. | 63 // the Initialize function above for additional information. |
64 bool InitializeAsImageSection(const FilePath& file_name); | 64 bool InitializeAsImageSection(const FilePath& file_name); |
65 #endif // OS_WIN | 65 #endif // OS_WIN |
66 | 66 |
67 const uint8* data() const { return data_; } | 67 uint8* data() const { return data_; } |
68 size_t length() const { return length_; } | 68 size_t length() const { return length_; } |
69 | 69 |
70 // Is file_ a valid file handle that points to an open, memory mapped file? | 70 // Is file_ a valid file handle that points to an open, memory mapped file? |
71 bool IsValid() const; | 71 bool IsValid() const; |
72 | 72 |
73 private: | 73 private: |
74 // Given the arbitrarily aligned memory region [start, size], returns the | 74 // Given the arbitrarily aligned memory region [start, size], returns the |
75 // boundaries of the region aligned to the granularity specified by the OS, | 75 // boundaries of the region aligned to the granularity specified by the OS, |
76 // (a page on Linux, ~32k on Windows) as follows: | 76 // (a page on Linux, ~32k on Windows) as follows: |
77 // - |aligned_start| is page aligned and <= |start|. | 77 // - |aligned_start| is page aligned and <= |start|. |
78 // - |aligned_size| is a multiple of the VM granularity and >= |size|. | 78 // - |aligned_size| is a multiple of the VM granularity and >= |size|. |
79 // - |offset| is the displacement of |start| w.r.t |aligned_start|. | 79 // - |offset| is the displacement of |start| w.r.t |aligned_start|. |
80 static void CalculateVMAlignedBoundaries(int64 start, | 80 static void CalculateVMAlignedBoundaries(int64 start, |
81 int64 size, | 81 int64 size, |
82 int64* aligned_start, | 82 int64* aligned_start, |
83 int64* aligned_size, | 83 int64* aligned_size, |
84 int32* offset); | 84 int32* offset); |
85 | 85 |
86 // Map the file to memory, set data_ to that memory address. Return true on | 86 // Map the file to memory, set data_ to that memory address. Return true on |
87 // success, false on any kind of failure. This is a helper for Initialize(). | 87 // success, false on any kind of failure. This is a helper for Initialize(). |
88 bool MapFileRegionToMemory(const Region& region); | 88 // - |write| is used to enable write permission of mmap. |
| 89 bool MapFileRegionToMemory(const Region& region, bool write); |
89 | 90 |
90 // Closes all open handles. | 91 // Closes all open handles. |
91 void CloseHandles(); | 92 void CloseHandles(); |
92 | 93 |
93 File file_; | 94 File file_; |
94 uint8* data_; | 95 uint8* data_; |
95 size_t length_; | 96 size_t length_; |
96 | 97 |
97 #if defined(OS_WIN) | 98 #if defined(OS_WIN) |
98 win::ScopedHandle file_mapping_; | 99 win::ScopedHandle file_mapping_; |
99 bool image_; // Map as an image. | 100 bool image_; // Map as an image. |
100 #endif | 101 #endif |
101 | 102 |
102 DISALLOW_COPY_AND_ASSIGN(MemoryMappedFile); | 103 DISALLOW_COPY_AND_ASSIGN(MemoryMappedFile); |
103 }; | 104 }; |
104 | 105 |
105 } // namespace base | 106 } // namespace base |
106 | 107 |
107 #endif // BASE_FILES_MEMORY_MAPPED_FILE_H_ | 108 #endif // BASE_FILES_MEMORY_MAPPED_FILE_H_ |
OLD | NEW |