mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-14 17:28:07 +00:00
make os file read an atomic operation
This commit is contained in:
@@ -368,35 +368,25 @@ internal U64
|
|||||||
os_file_read(OS_Handle file, Rng1U64 rng, void *out_data)
|
os_file_read(OS_Handle file, Rng1U64 rng, void *out_data)
|
||||||
{
|
{
|
||||||
if(os_handle_match(file, os_handle_zero())) { return 0; }
|
if(os_handle_match(file, os_handle_zero())) { return 0; }
|
||||||
|
|
||||||
HANDLE handle = (HANDLE)file.u64[0];
|
HANDLE handle = (HANDLE)file.u64[0];
|
||||||
|
U8 *ptr = out_data;
|
||||||
// rjf: clamp range by file size
|
U64 off = rng.min;
|
||||||
U64 size = 0;
|
while(off != rng.max)
|
||||||
GetFileSizeEx(handle, (LARGE_INTEGER *)&size);
|
|
||||||
Rng1U64 rng_clamped = r1u64(ClampTop(rng.min, size), ClampTop(rng.max, size));
|
|
||||||
U64 total_read_size = 0;
|
|
||||||
|
|
||||||
// rjf: read loop
|
|
||||||
{
|
{
|
||||||
U64 to_read = dim_1u64(rng_clamped);
|
U64 amt64 = rng.max - off;
|
||||||
for(U64 off = rng.min; total_read_size < to_read;)
|
U32 amt32 = (U32)Min(MB(32), amt64);
|
||||||
{
|
|
||||||
U64 amt64 = to_read - total_read_size;
|
|
||||||
U32 amt32 = u32_from_u64_saturate(amt64);
|
|
||||||
DWORD read_size = 0;
|
DWORD read_size = 0;
|
||||||
OVERLAPPED overlapped = {0};
|
OVERLAPPED overlapped = { .Offset = (U32)off, .OffsetHigh = (U32)(off >> 32) };
|
||||||
overlapped.Offset = (off&0x00000000ffffffffull);
|
if( ! ReadFile(handle, ptr, amt32, &read_size, &overlapped))
|
||||||
overlapped.OffsetHigh = (off&0xffffffff00000000ull) >> 32;
|
|
||||||
ReadFile(handle, (U8 *)out_data + total_read_size, amt32, &read_size, &overlapped);
|
|
||||||
off += read_size;
|
|
||||||
total_read_size += read_size;
|
|
||||||
if(read_size != amt32)
|
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
ptr += read_size;
|
||||||
|
off += read_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
U64 total_read_size = off - rng.min;
|
||||||
return total_read_size;
|
return total_read_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user