mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-18 01:52:22 -07:00
further simplify linker/os_ext/os_core.c
This commit is contained in:
+61
-1
@@ -17,15 +17,75 @@ lnk_read_data_from_file_path(Arena *arena, String8 path)
|
||||
return data;
|
||||
}
|
||||
|
||||
internal
|
||||
THREAD_POOL_TASK_FUNC(lnk_data_size_from_file_path_task)
|
||||
{
|
||||
LNK_DiskReader *task = raw_task;
|
||||
|
||||
String8 path = task->path_arr.v[task_id];
|
||||
OS_Handle handle = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path);
|
||||
FileProperties props = os_properties_from_file(handle);
|
||||
|
||||
task->handle_arr[task_id] = handle;
|
||||
task->size_arr[task_id] = props.size;
|
||||
}
|
||||
|
||||
internal
|
||||
THREAD_POOL_TASK_FUNC(lnk_data_from_file_path_task)
|
||||
{
|
||||
LNK_DiskReader *task = raw_task;
|
||||
|
||||
OS_Handle handle = task->handle_arr[task_id];
|
||||
U64 size = task->size_arr[task_id];
|
||||
U8 *buffer = task->buffer + task->off_arr[task_id];
|
||||
|
||||
U64 read_size = os_file_read(handle, rng_1u64(0, size), buffer);
|
||||
Assert(read_size == size);
|
||||
|
||||
task->data_arr.v[task_id] = str8(buffer, read_size);
|
||||
|
||||
os_file_close(handle);
|
||||
}
|
||||
|
||||
internal String8Array
|
||||
lnk_read_data_from_file_path_parallel(TP_Context *tp, Arena *arena, String8Array path_arr)
|
||||
{
|
||||
String8Array result = os_data_from_file_path_parallel(tp, arena, path_arr);
|
||||
Temp scratch = scratch_begin(&arena,1);
|
||||
|
||||
LNK_DiskReader reader = {0};
|
||||
reader.path_arr = path_arr;
|
||||
reader.handle_arr = push_array_no_zero(scratch.arena, OS_Handle, path_arr.count);
|
||||
reader.size_arr = push_array_no_zero(scratch.arena, U64, path_arr.count);
|
||||
|
||||
// open handles and get sizes
|
||||
tp_for_parallel(tp, 0, path_arr.count, lnk_data_size_from_file_path_task, &reader);
|
||||
|
||||
// compute file buffer size
|
||||
U64 total_data_size = sum_array_u64(path_arr.count, reader.size_arr);
|
||||
|
||||
// assign offsets into file buffer
|
||||
U64 *off_arr = push_array_no_zero(scratch.arena, U64, path_arr.count);
|
||||
MemoryCopyTyped(off_arr, reader.size_arr, path_arr.count);
|
||||
counts_to_offsets_array_u64(path_arr.count, off_arr);
|
||||
|
||||
reader.data_arr = str8_array_reserve(arena, path_arr.count);
|
||||
reader.off_arr = off_arr;
|
||||
reader.buffer = push_array_no_zero(arena, U8, total_data_size);
|
||||
|
||||
// read files and close handles
|
||||
tp_for_parallel(tp, 0, path_arr.count, lnk_data_from_file_path_task, &reader);
|
||||
|
||||
String8Array result = {0};
|
||||
result.count = path_arr.count;
|
||||
result.v = reader.data_arr.v;
|
||||
|
||||
if (lnk_get_log_status(LNK_Log_IO_Read)) {
|
||||
for (U64 i = 0; i < result.count; ++i) {
|
||||
lnk_log_read(path_arr.v[i], result.v[i].size);
|
||||
}
|
||||
}
|
||||
|
||||
scratch_end(scratch);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
#pragma once
|
||||
|
||||
typedef struct
|
||||
{
|
||||
String8Array path_arr;
|
||||
String8Array data_arr;
|
||||
OS_Handle *handle_arr;
|
||||
U64 *size_arr;
|
||||
U64 *off_arr;
|
||||
U8 *buffer;
|
||||
} LNK_DiskReader;
|
||||
|
||||
internal String8 lnk_read_data_from_file_path(Arena *arena, String8 path);
|
||||
internal String8Array lnk_read_data_from_file_path_parallel(TP_Context *tp, Arena *arena, String8Array path_arr);
|
||||
|
||||
|
||||
@@ -1,76 +1,6 @@
|
||||
// Copyright (c) 2024 Epic Games Tools
|
||||
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||
|
||||
internal
|
||||
THREAD_POOL_TASK_FUNC(os_data_size_from_file_path_task)
|
||||
{
|
||||
OS_DataSizeFromFilePathTask *task = raw_task;
|
||||
|
||||
String8 path = task->path_arr.v[task_id];
|
||||
OS_Handle handle = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path);
|
||||
FileProperties props = os_properties_from_file(handle);
|
||||
|
||||
task->handle_arr[task_id] = handle;
|
||||
task->size_arr[task_id] = props.size;
|
||||
}
|
||||
|
||||
internal
|
||||
THREAD_POOL_TASK_FUNC(os_data_from_file_path_task)
|
||||
{
|
||||
OS_DataFromFilePathTask *task = raw_task;
|
||||
|
||||
OS_Handle handle = task->handle_arr[task_id];
|
||||
U64 size = task->size_arr[task_id];
|
||||
U8 *buffer = task->buffer + task->off_arr[task_id];
|
||||
|
||||
U64 read_size = os_file_read(handle, rng_1u64(0, size), buffer);
|
||||
Assert(read_size == size);
|
||||
|
||||
task->data_arr.v[task_id] = str8(buffer, read_size);
|
||||
|
||||
os_file_close(handle);
|
||||
}
|
||||
|
||||
internal String8Array
|
||||
os_data_from_file_path_parallel(TP_Context *tp, Arena *arena, String8Array path_arr)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena,1);
|
||||
|
||||
OS_Handle *handle_arr = push_array_no_zero(scratch.arena, OS_Handle, path_arr.count);
|
||||
U64 *size_arr = push_array_no_zero(scratch.arena, U64, path_arr.count);
|
||||
U64 *off_arr = push_array_no_zero(scratch.arena, U64, path_arr.count);
|
||||
|
||||
// open handles and get sizes
|
||||
OS_DataSizeFromFilePathTask sizer;
|
||||
sizer.path_arr = path_arr;
|
||||
sizer.size_arr = size_arr;
|
||||
sizer.handle_arr = handle_arr;
|
||||
tp_for_parallel(tp, 0, path_arr.count, os_data_size_from_file_path_task, &sizer);
|
||||
|
||||
// compute file buffer size
|
||||
U64 total_data_size = sum_array_u64(path_arr.count, sizer.size_arr);
|
||||
|
||||
// assign offsets into file buffer
|
||||
MemoryCopyTyped(off_arr, sizer.size_arr, path_arr.count);
|
||||
counts_to_offsets_array_u64(path_arr.count, off_arr);
|
||||
|
||||
// read files and close handles
|
||||
OS_DataFromFilePathTask reader;
|
||||
reader.data_arr = str8_array_reserve(arena, path_arr.count);
|
||||
reader.handle_arr = handle_arr;
|
||||
reader.size_arr = size_arr;;
|
||||
reader.off_arr = off_arr;
|
||||
reader.buffer = push_array_no_zero(arena, U8, total_data_size);
|
||||
tp_for_parallel(tp, 0, path_arr.count, os_data_from_file_path_task, &reader);
|
||||
|
||||
String8Array result = {0};
|
||||
result.count = path_arr.count;
|
||||
result.v = reader.data_arr.v;
|
||||
|
||||
scratch_end(scratch);
|
||||
return result;
|
||||
}
|
||||
|
||||
internal String8List
|
||||
os_file_search(Arena *arena, String8List dir_list, String8 file_path)
|
||||
{
|
||||
|
||||
@@ -3,22 +3,5 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
typedef struct
|
||||
{
|
||||
String8Array path_arr;
|
||||
OS_Handle *handle_arr;
|
||||
U64 *size_arr;
|
||||
} OS_DataSizeFromFilePathTask;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
String8Array data_arr;
|
||||
OS_Handle *handle_arr;
|
||||
U64 *size_arr;
|
||||
U64 *off_arr;
|
||||
U8 *buffer;
|
||||
} OS_DataFromFilePathTask;
|
||||
|
||||
internal String8Array os_data_from_file_path_parallel(TP_Context *tp, Arena *arena, String8Array path_arr);
|
||||
internal String8List os_file_search(Arena *arena, String8List dir_list, String8 file_path);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user