@@ -151,29 +151,29 @@ namespace jetpack::io {
151
151
#ifdef _WIN32
152
152
hFile = ::CreateFileA (path_.c_str (), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL , CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
153
153
if (hFile == INVALID_HANDLE_VALUE) {
154
- std::cerr << " open file failed: " << filename << " , " << ::GetLastError () << std::endl;
154
+ std::cerr << fmt::format ( " open file {} failed: {} " , path_, ::GetLastError () ) << std::endl;
155
155
return IOError::OpenFailed;
156
156
}
157
157
158
158
DWORD file_size;
159
159
::GetFileSize (hFile, &file_size);
160
- size = int64_t (file_size);
160
+ current_size_ = int64_t (file_size);
161
161
162
- hMapping = ::CreateFileMapping (hFile, NULL , PAGE_READWRITE, 0 , size , NULL );
162
+ hMapping = ::CreateFileMapping (hFile, NULL , PAGE_READWRITE, 0 , current_size_ , NULL );
163
163
if (hMapping == NULL ) {
164
164
::CloseHandle (hFile);
165
- std::cerr << " read file failed: " << filename << " , " << ::GetLastError () << std::endl;
165
+ std::cerr << fmt::format ( " read file {} failed: {} " , path_, ::GetLastError () ) << std::endl;
166
166
return IOError::ReadFailed;
167
167
}
168
168
169
169
void * p = MapViewOfFile (hMapping, FILE_MAP_WRITE, 0 , 0 , 0 );
170
170
if (p == NULL ) {
171
171
::CloseHandle (hMapping);
172
172
::CloseHandle (hFile);
173
- std::cerr << " read file failed: " << filename << " , " << ::GetLastError () << std::endl;
173
+ std::cerr << fmt::format ( " read file {} failed: {} " , path_, ::GetLastError () ) << std::endl;
174
174
return IOError::ReadFailed;
175
175
}
176
- mapped_mem = reinterpret_cast <uintptr_t >(p);
176
+ mapped_mem_ = reinterpret_cast <unsigned char * >(p);
177
177
return IOError::Ok;
178
178
#else
179
179
fd = ::open (path_.c_str (), O_RDWR | O_CREAT, 0644 );
@@ -202,6 +202,46 @@ namespace jetpack::io {
202
202
}
203
203
204
204
IOError FileWriterInternal::Resize (uint64_t size) {
205
+ #ifdef _WIN32
206
+ ::UnmapViewOfFile (mapped_mem_);
207
+ ::CloseHandle (hMapping);
208
+
209
+ bool ok = false ;
210
+
211
+ LARGE_INTEGER large_size;
212
+ large_size.QuadPart = size;
213
+ ok = ::SetFilePointerEx (hFile, large_size, NULL , FILE_BEGIN);
214
+ if (!ok) {
215
+ std::cerr << fmt::format (" can not set file pointer of {}" , path_) << std::endl;
216
+ return IOError::ResizeFailed;
217
+ }
218
+
219
+ ok = ::SetEndOfFile (hFile);
220
+ if (!ok) {
221
+ std::cerr << fmt::format (" can not set end of {}" , path_) << std::endl;
222
+ return IOError::ResizeFailed;
223
+ }
224
+
225
+ current_size_ = size;
226
+
227
+ hMapping = ::CreateFileMapping (hFile, NULL , PAGE_READWRITE, 0 , current_size_, NULL );
228
+ if (hMapping == NULL ) {
229
+ ::CloseHandle (hFile);
230
+ std::cerr << fmt::format (" create file mapping {} failed: {}" , path_, ::GetLastError ()) << std::endl;
231
+ return IOError::ResizeFailed;
232
+ }
233
+
234
+ void * p = MapViewOfFile (hMapping, FILE_MAP_WRITE, 0 , 0 , 0 );
235
+ if (p == NULL ) {
236
+ ::CloseHandle (hMapping);
237
+ ::CloseHandle (hFile);
238
+ std::cerr << fmt::format (" map file {} failed: {}" , path_, ::GetLastError ()) << std::endl;
239
+ return IOError::ResizeFailed;
240
+ }
241
+ mapped_mem_ = reinterpret_cast <unsigned char *>(p);
242
+
243
+ return IOError::Ok;
244
+ #else
205
245
::munmap (mapped_mem_, current_size_);
206
246
207
247
if (::ftruncate (fd, size) != 0 ) {
@@ -217,6 +257,7 @@ namespace jetpack::io {
217
257
}
218
258
219
259
return IOError::Ok;
260
+ #endif
220
261
}
221
262
222
263
IOError FileWriterInternal::EnsureSize (uint64_t size) {
@@ -253,9 +294,9 @@ namespace jetpack::io {
253
294
254
295
FileWriterInternal::~FileWriterInternal () {
255
296
#ifdef _WIN32
297
+ ::UnmapViewOfFile (mapped_mem_);
256
298
::CloseHandle (hMapping);
257
- ::UnmapViewOfFile (hFile);
258
- ::CloseHandle (hFile);
299
+ ::CloseHandle (hFile);
259
300
#else
260
301
if (likely (mapped_mem_ != nullptr )) {
261
302
::munmap (mapped_mem_, current_size_);
0 commit comments