added /RAD_WRITE_TEMP_FILES

When enabled linker writes image and debug info to temporary files
and renames them after all writes are done.
This commit is contained in:
Nikita Smith
2025-02-25 14:41:34 -08:00
parent 8a8a8bcc8d
commit bbce89eada
10 changed files with 148 additions and 47 deletions
+10
View File
@@ -151,6 +151,16 @@ os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range)
return result;
}
internal B32
os_rename_file(String8 orig_name, String8 new_name)
{
Temp scratch = scratch_begin(0,0);
OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareWrite|OS_AccessFlag_ShareDelete, orig_name);
B32 is_renamed = os_rename_file_by_handle(file, new_name);
os_file_close(file);
return is_renamed;
}
////////////////////////////////
//~ rjf: Process Launcher Helpers
+10 -7
View File
@@ -38,13 +38,14 @@ struct OS_ProcessInfo
typedef U32 OS_AccessFlags;
enum
{
OS_AccessFlag_Read = (1<<0),
OS_AccessFlag_Write = (1<<1),
OS_AccessFlag_Execute = (1<<2),
OS_AccessFlag_Append = (1<<3),
OS_AccessFlag_ShareRead = (1<<4),
OS_AccessFlag_ShareWrite = (1<<5),
OS_AccessFlag_Inherited = (1<<6),
OS_AccessFlag_Read = (1<<0),
OS_AccessFlag_Write = (1<<1),
OS_AccessFlag_Execute = (1<<2),
OS_AccessFlag_Append = (1<<3),
OS_AccessFlag_ShareRead = (1<<4),
OS_AccessFlag_ShareWrite = (1<<5),
OS_AccessFlag_ShareDelete = (1<<6),
OS_AccessFlag_Inherited = (1<<7),
};
////////////////////////////////
@@ -206,6 +207,8 @@ internal U64 os_file_write(OS_Handle file, Rng1U64 rng, void *data);
internal B32 os_file_set_times(OS_Handle file, DateTime time);
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_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);
+32 -7
View File
@@ -321,13 +321,14 @@ os_file_open(OS_AccessFlags flags, String8 path)
DWORD share_mode = 0;
DWORD creation_disposition = OPEN_EXISTING;
SECURITY_ATTRIBUTES security_attributes = {sizeof(security_attributes), 0, 0};
if(flags & OS_AccessFlag_Read) {access_flags |= GENERIC_READ;}
if(flags & OS_AccessFlag_Write) {access_flags |= GENERIC_WRITE;}
if(flags & OS_AccessFlag_Execute) {access_flags |= GENERIC_EXECUTE;}
if(flags & OS_AccessFlag_ShareRead) {share_mode |= FILE_SHARE_READ;}
if(flags & OS_AccessFlag_ShareWrite) {share_mode |= FILE_SHARE_WRITE|FILE_SHARE_DELETE;}
if(flags & OS_AccessFlag_Write) {creation_disposition = CREATE_ALWAYS;}
if(flags & OS_AccessFlag_Append) {creation_disposition = OPEN_ALWAYS; access_flags |= FILE_APPEND_DATA; }
if(flags & OS_AccessFlag_Read) {access_flags |= GENERIC_READ;}
if(flags & OS_AccessFlag_Write) {access_flags |= GENERIC_WRITE;}
if(flags & OS_AccessFlag_Execute) {access_flags |= GENERIC_EXECUTE;}
if(flags & OS_AccessFlag_ShareRead) {share_mode |= FILE_SHARE_READ;}
if(flags & OS_AccessFlag_ShareWrite) {share_mode |= FILE_SHARE_WRITE|FILE_SHARE_DELETE;}
if(flags & OS_AccessFlag_ShareDelete) {share_mode |= FILE_SHARE_DELETE; access_flags |= DELETE;}
if(flags & OS_AccessFlag_Write) {creation_disposition = CREATE_ALWAYS;}
if(flags & OS_AccessFlag_Append) {creation_disposition = OPEN_ALWAYS; access_flags |= FILE_APPEND_DATA; }
if(flags & OS_AccessFlag_Inherited)
{
security_attributes.bInheritHandle = 1;
@@ -469,6 +470,30 @@ os_id_from_file(OS_Handle file)
return result;
}
internal B32
os_rename_file_by_handle(OS_Handle file, String8 new_name)
{
Temp scratch = scratch_begin(0,0);
HANDLE handle = (HANDLE)file.u64[0];
String16 new_name16 = str16_from_8(scratch.arena, new_name);
U64 file_rename_info_size = sizeof(FILE_RENAME_INFO);
U64 buffer_size = file_rename_info_size + sizeof(WCHAR)*new_name16.size;
U8 *buffer = push_array(scratch.arena, U8, buffer_size);
FILE_RENAME_INFO *rename_info = (FILE_RENAME_INFO *)buffer;
rename_info->ReplaceIfExists = 1;
rename_info->FileNameLength = new_name16.size * sizeof(new_name16.str[0]);
MemoryCopy(rename_info->FileName, new_name16.str, new_name16.size * sizeof(new_name16.str[0]));
BOOL is_renamed = SetFileInformationByHandle(handle, FileRenameInfo, buffer, buffer_size);
scratch_end(scratch);
return is_renamed;
}
internal B32
os_delete_file_at_path(String8 path)
{