further simplify linker/os_ext/os_core.c

This commit is contained in:
Nikita Smith
2024-11-07 14:08:21 -08:00
parent daeb08e79f
commit 7650a83d1e
4 changed files with 71 additions and 88 deletions
+61 -1
View File
@@ -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;
}
+10
View File
@@ -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);
-70
View File
@@ -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)
{
-17
View File
@@ -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);