@@ -111,7 +111,7 @@ class MmapWrapperImpl : public MmapWrapper {
111111 HANDLE hmapping_;
112112};
113113
114- std::unique_ptr<MmapWrapper> MmapWrapper::create (const std::string& filename) {
114+ std::unique_ptr<MmapWrapper> MmapWrapper::create (const std::string& filename, bool writable ) {
115115 void * mapped_data = nullptr ;
116116 size_t file_size = 0 ;
117117
@@ -136,14 +136,18 @@ std::unique_ptr<MmapWrapper> MmapWrapper::create(const std::string& filename) {
136136
137137 file_size = static_cast <size_t >(size.QuadPart );
138138
139- HANDLE mapping_handle = CreateFileMapping (file_handle, NULL , PAGE_READONLY, 0 , 0 , NULL );
139+ DWORD page_prot = writable ? PAGE_WRITECOPY : PAGE_READONLY;
140+
141+ HANDLE mapping_handle = CreateFileMapping (file_handle, NULL , page_prot, 0 , 0 , NULL );
140142
141143 if (mapping_handle == NULL ) {
142144 CloseHandle (file_handle);
143145 return nullptr ;
144146 }
145147
146- mapped_data = MapViewOfFile (mapping_handle, FILE_MAP_READ, 0 , 0 , file_size);
148+ DWORD view_access = writable ? FILE_MAP_COPY : FILE_MAP_READ;
149+
150+ mapped_data = MapViewOfFile (mapping_handle, view_access, 0 , 0 , file_size);
147151
148152 if (mapped_data == NULL ) {
149153 CloseHandle (mapping_handle);
@@ -181,7 +185,7 @@ class MmapWrapperImpl : public MmapWrapper {
181185 }
182186};
183187
184- std::unique_ptr<MmapWrapper> MmapWrapper::create (const std::string& filename) {
188+ std::unique_ptr<MmapWrapper> MmapWrapper::create (const std::string& filename, bool writable ) {
185189 int file_descriptor = open (filename.c_str (), O_RDONLY);
186190 if (file_descriptor == -1 ) {
187191 return nullptr ;
@@ -203,7 +207,9 @@ std::unique_ptr<MmapWrapper> MmapWrapper::create(const std::string& filename) {
203207
204208 size_t file_size = sb.st_size ;
205209
206- void * mapped_data = mmap (NULL , file_size, PROT_READ, mmap_flags, file_descriptor, 0 );
210+ int mmap_prot = PROT_READ | (writable ? PROT_WRITE : 0 );
211+
212+ void * mapped_data = mmap (NULL , file_size, mmap_prot, mmap_flags, file_descriptor, 0 );
207213
208214 close (file_descriptor);
209215
0 commit comments