From 856c59a9499ddb39c96e10f28d1e652512d60c90 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 18 Apr 2024 15:09:43 -0700 Subject: [PATCH] set up ctrl thread log scopes; ditch ctrl -> user log stuff, just make each log site in control of exporting to a separate file --- src/ctrl/ctrl_core.c | 32 ++++++++++++++++++++++++-------- src/ctrl/ctrl_core.h | 7 ++++--- src/os/core/os_core.c | 15 +++++++++++++++ src/os/core/os_core.h | 1 + 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 747ad430..8c8fa31b 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -851,6 +851,14 @@ ctrl_init(void) ctrl_state->c2u_ring_base = push_array_no_zero(arena, U8, ctrl_state->c2u_ring_size); ctrl_state->c2u_ring_mutex = os_mutex_alloc(); ctrl_state->c2u_ring_cv = os_condition_variable_alloc(); + { + Temp scratch = scratch_begin(0, 0); + String8 user_program_data_path = os_string_from_system_path(scratch.arena, OS_SystemPath_UserProgramData); + String8 user_data_folder = push_str8f(scratch.arena, "%S/raddbg/logs", user_program_data_path); + os_make_directory(user_data_folder); + ctrl_state->ctrl_thread_log_path = push_str8f(ctrl_state->arena, "%S/ctrl_thread.raddbg_log", user_data_folder); + scratch_end(scratch); + } ctrl_state->ctrl_thread_entity_store = ctrl_entity_store_alloc(); ctrl_state->dmn_event_arena = arena_alloc(); ctrl_state->user_entry_point_arena = arena_alloc(); @@ -1745,6 +1753,7 @@ ctrl_thread__entry_point(void *p) for(;;) { temp_end(scratch); + log_scope_begin(); //- rjf: get next messages CTRL_MsgList msgs = ctrl_u2c_pop_msgs(scratch.arena); @@ -1783,6 +1792,9 @@ ctrl_thread__entry_point(void *p) } } } + + String8 log = log_scope_end(scratch.arena); + ctrl_thread__flush_log(log); } scratch_end(scratch); @@ -1941,14 +1953,7 @@ ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, log_msgf("string: \"%S\"\n", ev->string); log_msgf("ip_vaddr: 0x%I64x\n", ev->instruction_pointer); String8 log = log_scope_end(scratch.arena); - if(log.size != 0) - { - CTRL_EventList evts = {0}; - CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts); - evt->kind = CTRL_EventKind_Log; - evt->string = log; - ctrl_c2u_push_events(&evts); - } + ctrl_thread__flush_log(log); } // rjf: determine if we should filter @@ -2288,6 +2293,17 @@ ctrl_eval_memory_read(void *u, void *out, U64 addr, U64 size) return result; } +//- rjf: log flusher + +internal void +ctrl_thread__flush_log(String8 string) +{ + if(string.size != 0) + { + os_append_data_to_file_path(ctrl_state->ctrl_thread_log_path, string); + } +} + //- rjf: msg kind implementations internal void diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 96e55f09..3f671f5a 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -302,9 +302,6 @@ typedef enum CTRL_EventKind CTRL_EventKind_MemDecommit, CTRL_EventKind_MemRelease, - //- rjf: log - CTRL_EventKind_Log, - CTRL_EventKind_COUNT } CTRL_EventKind; @@ -517,6 +514,7 @@ struct CTRL_State OS_Handle c2u_ring_cv; // rjf: ctrl thread state + String8 ctrl_thread_log_path; OS_Handle ctrl_thread; Log *ctrl_thread_log; CTRL_EntityStore *ctrl_thread_entity_store; @@ -712,6 +710,9 @@ internal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ //- rjf: eval helpers internal B32 ctrl_eval_memory_read(void *u, void *out, U64 addr, U64 size); +//- rjf: log flusher +internal void ctrl_thread__flush_log(String8 string); + //- rjf: msg kind implementations internal void ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); internal void ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg); diff --git a/src/os/core/os_core.c b/src/os/core/os_core.c index b3cad911..5f4fc32d 100644 --- a/src/os/core/os_core.c +++ b/src/os/core/os_core.c @@ -113,6 +113,21 @@ os_write_data_list_to_file_path(String8 path, String8List list) return good; } +internal B32 +os_append_data_to_file_path(String8 path, String8 data) +{ + B32 good = 0; + OS_Handle file = os_file_open(OS_AccessFlag_Write, path); + if(!os_handle_match(file, os_handle_zero())) + { + good = 1; + U64 pos = os_properties_from_file(file).size; + os_file_write(file, r1u64(pos, pos+data.size), data.str); + os_file_close(file); + } + return good; +} + internal OS_FileID os_id_from_file_path(String8 path) { diff --git a/src/os/core/os_core.h b/src/os/core/os_core.h index ea82c9d2..c31d2a61 100644 --- a/src/os/core/os_core.h +++ b/src/os/core/os_core.h @@ -171,6 +171,7 @@ internal String8List os_string_list_from_argcv(Arena *arena, int argc, char **ar internal String8 os_data_from_file_path(Arena *arena, String8 path); internal B32 os_write_data_to_file_path(String8 path, String8 data); internal B32 os_write_data_list_to_file_path(String8 path, String8List list); +internal B32 os_append_data_to_file_path(String8 path, String8 data); internal OS_FileID os_id_from_file_path(String8 path); internal S64 os_file_id_compare(OS_FileID a, OS_FileID b); internal String8 os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range);