mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-06 05:48:40 +00: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;
|
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
|
internal String8Array
|
||||||
lnk_read_data_from_file_path_parallel(TP_Context *tp, Arena *arena, String8Array path_arr)
|
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)) {
|
if (lnk_get_log_status(LNK_Log_IO_Read)) {
|
||||||
for (U64 i = 0; i < result.count; ++i) {
|
for (U64 i = 0; i < result.count; ++i) {
|
||||||
lnk_log_read(path_arr.v[i], result.v[i].size);
|
lnk_log_read(path_arr.v[i], result.v[i].size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
scratch_end(scratch);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,15 @@
|
|||||||
#pragma once
|
#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 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);
|
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
|
// Copyright (c) 2024 Epic Games Tools
|
||||||
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
// 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
|
internal String8List
|
||||||
os_file_search(Arena *arena, String8List dir_list, String8 file_path)
|
os_file_search(Arena *arena, String8List dir_list, String8 file_path)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,22 +3,5 @@
|
|||||||
|
|
||||||
#pragma once
|
#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);
|
internal String8List os_file_search(Arena *arena, String8List dir_list, String8 file_path);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user