diff --git a/src/linker/lnk_io.c b/src/linker/lnk_io.c index 4c5b5c4f..09956665 100644 --- a/src/linker/lnk_io.c +++ b/src/linker/lnk_io.c @@ -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; } diff --git a/src/linker/lnk_io.h b/src/linker/lnk_io.h index 473173de..2b98ca4a 100644 --- a/src/linker/lnk_io.h +++ b/src/linker/lnk_io.h @@ -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); diff --git a/src/linker/os_ext/core/os_core.c b/src/linker/os_ext/core/os_core.c index f4b11eb9..3c68a048 100644 --- a/src/linker/os_ext/core/os_core.c +++ b/src/linker/os_ext/core/os_core.c @@ -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) { diff --git a/src/linker/os_ext/core/os_core.h b/src/linker/os_ext/core/os_core.h index c7791972..a1d1e597 100644 --- a/src/linker/os_ext/core/os_core.h +++ b/src/linker/os_ext/core/os_core.h @@ -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);