@@ -179,53 +179,71 @@ namespace cage
179
179
{
180
180
CAGE_ASSERT (f);
181
181
#ifdef CAGE_SYSTEM_WINDOWS
182
- HANDLE handle = (HANDLE)_get_osfhandle (_fileno (f));
182
+ const HANDLE handle = (HANDLE)_get_osfhandle (_fileno (f));
183
183
uint64 off = 0 ;
184
184
uint64 s = buffer.size ();
185
185
while (s > 0 )
186
186
{
187
187
OVERLAPPED o;
188
188
detail::memset (&o, 0 , sizeof (o));
189
- uint64 p = at + off;
189
+ const uint64 p = at + off;
190
190
o.Offset = (DWORD)p;
191
191
o.OffsetHigh = (DWORD)((uint64)p >> 32 );
192
- uint64 k = min (s, (uint64)1024 * 1024 * 1024 ); // write in chunks of 1 GB
192
+ const uint64 k = min (s, (uint64)1024 * 1024 * 1024 ); // read in chunks of 1 GB
193
193
DWORD r = 0 ;
194
194
if (!ReadFile (handle, buffer.data () + off, numeric_cast<DWORD>(k), &r, &o) || r != k)
195
195
CAGE_THROW_ERROR (SystemError, " ReadFile" , GetLastError ());
196
196
off += k;
197
197
s -= k;
198
198
}
199
199
#else
200
- if (pread (fileno (f), buffer.data (), buffer.size (), at) != buffer.size ())
201
- CAGE_THROW_ERROR (SystemError, " pread" , errno);
200
+ const int handle = fileno (f);
201
+ uint64 off = 0 ;
202
+ uint64 s = buffer.size ();
203
+ while (s > 0 )
204
+ {
205
+ const uint64 k = min (s, (uint64)1024 * 1024 * 1024 ); // read in chunks of 1 GB
206
+ if (pread (handle, buffer.data () + off, k, at) != k)
207
+ CAGE_THROW_ERROR (SystemError, " pread" , errno);
208
+ off += k;
209
+ s -= k;
210
+ }
202
211
#endif
203
212
}
204
213
205
214
void writeAtImpl (PointerRange<const char > buffer, const uint64 at, FILE *f)
206
215
{
207
216
CAGE_ASSERT (f);
208
217
#ifdef CAGE_SYSTEM_WINDOWS
209
- HANDLE handle = (HANDLE)_get_osfhandle (_fileno (f));
218
+ const HANDLE handle = (HANDLE)_get_osfhandle (_fileno (f));
210
219
uint64 off = 0 ;
211
220
uint64 s = buffer.size ();
212
221
while (s > 0 )
213
222
{
214
223
OVERLAPPED o;
215
224
detail::memset (&o, 0 , sizeof (o));
216
- uint64 p = at + off;
225
+ const uint64 p = at + off;
217
226
o.Offset = (DWORD)p;
218
227
o.OffsetHigh = (DWORD)((uint64)p >> 32 );
219
- uint64 k = min (s, (uint64)1024 * 1024 * 1024 ); // write in chunks of 1 GB
228
+ const uint64 k = min (s, (uint64)1024 * 1024 * 1024 ); // write in chunks of 1 GB
220
229
DWORD r = 0 ;
221
230
if (!WriteFile (handle, buffer.data () + off, numeric_cast<DWORD>(k), &r, &o) || r != k)
222
231
CAGE_THROW_ERROR (SystemError, " WriteFile" , GetLastError ());
223
232
off += k;
224
233
s -= k;
225
234
}
226
235
#else
227
- if (pwrite (fileno (f), buffer.data (), buffer.size (), at) != buffer.size ())
228
- CAGE_THROW_ERROR (SystemError, " pwrite" , errno);
236
+ const int handle = fileno (f);
237
+ uint64 off = 0 ;
238
+ uint64 s = buffer.size ();
239
+ while (s > 0 )
240
+ {
241
+ const uint64 k = min (s, (uint64)1024 * 1024 * 1024 ); // write in chunks of 1 GB
242
+ if (pwrite (handle, buffer.data () + off, k, at) != k)
243
+ CAGE_THROW_ERROR (SystemError, " pwrite" , errno);
244
+ off += k;
245
+ s -= k;
246
+ }
229
247
#endif
230
248
}
231
249
@@ -322,9 +340,9 @@ namespace cage
322
340
uint64 size () override
323
341
{
324
342
CAGE_ASSERT (f);
325
- uint64 pos = ftell (f);
343
+ const uint64 pos = ftell (f);
326
344
fseek (f, 0 , 2 );
327
- uint64 siz = ftell (f);
345
+ const uint64 siz = ftell (f);
328
346
fseek (f, pos, 0 );
329
347
return siz;
330
348
}
0 commit comments