From d5ab121183ddcbd4482e690886000f0c1d14faaa Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 10 Feb 2025 13:56:38 -0800 Subject: [PATCH] pre-allocate file size before write --- src/linker/lnk_io.c | 4 ++++ src/os/core/os_core.h | 1 + src/os/core/win32/os_core_win32.c | 13 +++++++++++++ 3 files changed, 18 insertions(+) diff --git a/src/linker/lnk_io.c b/src/linker/lnk_io.c index e781b1e8..792c28e7 100644 --- a/src/linker/lnk_io.c +++ b/src/linker/lnk_io.c @@ -195,6 +195,10 @@ lnk_write_data_list_to_file_path(String8 path, String8 temp_path, String8List da } if (!os_handle_match(file_handle, os_handle_zero())) { + if (!os_file_reserve_size(file_handle, data.total_size)) { + lnk_log(LNK_Log_IO_Write, "Failed to pre-allocate file %S with size %M", path, data.total_size); + } + // write data nodes { for (String8Node *data_n = data.first; data_n != 0; data_n = data_n->next) { diff --git a/src/os/core/os_core.h b/src/os/core/os_core.h index 3f4075b0..30b7c142 100644 --- a/src/os/core/os_core.h +++ b/src/os/core/os_core.h @@ -209,6 +209,7 @@ internal FileProperties os_properties_from_file(OS_Handle file); internal OS_FileID os_id_from_file(OS_Handle file); internal B32 os_rename_file_by_handle(OS_Handle file, String8 new_name); internal B32 os_rename_file(String8 orig_name, String8 new_name); +internal B32 os_file_reserve_size(OS_Handle file, U64 size); internal B32 os_delete_file_at_path(String8 path); internal B32 os_copy_file_path(String8 dst, String8 src); internal String8 os_full_path_from_path(Arena *arena, String8 path); diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index d2b01c69..fc615797 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -494,6 +494,19 @@ os_rename_file_by_handle(OS_Handle file, String8 new_name) return is_renamed; } +internal B32 +os_file_reserve_size(OS_Handle file, U64 size) +{ + HANDLE handle = (HANDLE)file.u64[0]; + + FILE_ALLOCATION_INFO alloc_info = {0}; + alloc_info.AllocationSize.LowPart = size & max_U32; + alloc_info.AllocationSize.HighPart = (size >> 32) & max_U32; + + BOOL is_reserved = SetFileInformationByHandle(handle, FileAllocationInfo, &alloc_info, sizeof(alloc_info)); + return is_reserved; +} + internal B32 os_delete_file_at_path(String8 path) {