From 1901e67f39a115f08628bd34941623503f3fb19c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 23 Jun 2026 20:00:57 -0600 Subject: [PATCH] use synchronous reads for call stack computation, but extend artifact cache with the ability to say that a non-retryable failure occurred, so that we can fall back to stale call stacks --- project.4coder | 2 +- project.raddbg | 29 ++----- src/artifact_cache/artifact_cache.c | 38 +++++---- src/artifact_cache/artifact_cache.h | 13 ++- src/dbg_engine/dbg_engine_ctrl.c | 81 ++++++++++++------- src/dbg_engine/dbg_engine_ctrl.h | 9 +-- src/dbg_info/dbg_info.c | 4 +- src/dbg_info/dbg_info.h | 4 +- src/disasm/disasm.c | 4 +- src/disasm/disasm.h | 2 +- src/eval/eval_types.c | 4 +- src/file_stream/file_stream.c | 4 +- src/file_stream/file_stream.h | 2 +- src/raddbg/raddbg_core.c | 6 +- src/raddbg/raddbg_core.h | 6 +- src/raddbg/raddbg_views.c | 4 +- .../tests/rdi_from_dwarf_tests.c | 2 +- src/text/text.c | 2 +- src/text/text.h | 2 +- 19 files changed, 122 insertions(+), 96 deletions(-) diff --git a/project.4coder b/project.4coder index 850ffd88..4c4e9f4c 100644 --- a/project.4coder +++ b/project.4coder @@ -49,7 +49,7 @@ commands = // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, - .f1 = { .win = "raddbg_stable --ipc kill_all && build radbin no_meta debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "raddbg_stable --ipc kill_all && build raddbg no_meta debug telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, //- rjf: [raddbg wsl] // .f1 = { .win = "wsl ./build.sh raddbg", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/project.raddbg b/project.raddbg index d81b9d31..bffd93b9 100644 --- a/project.raddbg +++ b/project.raddbg @@ -9,13 +9,6 @@ target: debug_subprocesses: 0 } target: -{ - executable: "build/raddbg.exe" - working_directory: "../raddebugger" - arguments: "--user:test123" - debug_subprocesses: 0 -} -target: { executable: "build/mule_main.exe" working_directory: build @@ -25,7 +18,6 @@ target: { executable: "build/torture.exe" working_directory: build - arguments: "raddbg/*" } target: { @@ -40,20 +32,13 @@ target: } target: { - executable: "build/release_version/raddbg.exe" - working_directory: "build/release_version" -} -target: -{ - executable: "build/radbin.exe" + executable: "build/ryan_scratch.exe" working_directory: build - arguments: "--breakpad fat.so --capture" -} -target: -{ - executable: "build/radbin.exe" - working_directory: build - arguments: "--rdi raddbg" enabled: 1 } -watch_pin: expression: tag_hash_slots +target: +{ + executable: "build/raddbg.exe" + working_directory: "build/" + arguments: "--bin --dump test123.rdi" +} diff --git a/src/artifact_cache/artifact_cache.c b/src/artifact_cache/artifact_cache.c index 7a5ddec8..b9b0db58 100644 --- a/src/artifact_cache/artifact_cache.c +++ b/src/artifact_cache/artifact_cache.c @@ -391,12 +391,12 @@ ac_async_tick(void) } // rjf: compute val - B32 retry = 0; + AC_Status status = AC_Status_Good; U64 gen = r->gen; - AC_Artifact val = r->create(r->key, r->cancel_signal, &retry, &gen); + AC_Artifact val = r->create(r->key, r->cancel_signal, &status, &gen); // rjf: retry? -> resubmit request - if(retry && lane_idx() == 0 && !ins_atomic_u32_eval(r->cancel_signal)) + if(status == AC_Status_NeedRetry && lane_idx() == 0 && !ins_atomic_u32_eval(r->cancel_signal)) { AC_RequestBatch *batch = &ac_shared->req_batches[task_idx]; MutexScope(batch->mutex) @@ -412,7 +412,7 @@ ac_async_tick(void) // rjf: create function -> cache AC_Cache *cache = 0; - if(!retry && lane_idx() == 0) + if(status != AC_Status_NeedRetry && lane_idx() == 0) { U64 cache_hash = u64_hash_from_str8(str8_struct(&r->create)); U64 cache_slot_idx = cache_hash%ac_shared->cache_slots_count; @@ -431,7 +431,7 @@ ac_async_tick(void) } // rjf: write value into cache - if(!retry && lane_idx() == 0) + if(status != AC_Status_NeedRetry && lane_idx() == 0) { U64 hash = u64_hash_from_str8(r->key); U64 slot_idx = hash%cache->slots_count; @@ -443,8 +443,10 @@ ac_async_tick(void) { if(str8_match(n->key, r->key, 0)) { + B32 got_new_value = (status == AC_Status_Good); + // rjf: eliminate existing values, if any, if they do not match the current - if(cache->destroy != 0 && !MemoryMatchStruct(&n->val, &val) && ins_atomic_u64_eval(&n->completion_count) > 0) for(;;) + if(got_new_value && cache->destroy != 0 && !MemoryMatchStruct(&n->val, &val) && ins_atomic_u64_eval(&n->completion_count) > 0) for(;;) { if(access_pt_is_expired(&n->access_pt, .time = 0, .update_idxs = 0)) { @@ -456,8 +458,11 @@ ac_async_tick(void) } // rjf: write new value + if(got_new_value) + { + n->val = val; + } n->last_completed_gen = gen; - n->val = val; ins_atomic_u64_dec_eval(&n->working_count); ins_atomic_u64_inc_eval(&n->completion_count); } @@ -510,15 +515,15 @@ ac_async_tick(void) LaneCtx lane_ctx_restore = lane_ctx(thin_lane_ctx); // rjf: compute val - B32 retry = 0; + AC_Status status = AC_Status_Good; U64 gen = r->gen; - AC_Artifact val = r->create(r->key, r->cancel_signal, &retry, &gen); + AC_Artifact val = r->create(r->key, r->cancel_signal, &status, &gen); // rjf: restore wide lane ctx lane_ctx(lane_ctx_restore); // rjf: retry? -> resubmit request - if(retry && !ins_atomic_u32_eval(r->cancel_signal)) + if(status == AC_Status_NeedRetry && !ins_atomic_u32_eval(r->cancel_signal)) { AC_RequestBatch *batch = &ac_shared->req_batches[task_idx]; MutexScope(batch->mutex) @@ -534,7 +539,7 @@ ac_async_tick(void) // rjf: create function -> cache AC_Cache *cache = 0; - if(!retry) + if(status != AC_Status_NeedRetry) { U64 cache_hash = u64_hash_from_str8(str8_struct(&r->create)); U64 cache_slot_idx = cache_hash%ac_shared->cache_slots_count; @@ -553,7 +558,7 @@ ac_async_tick(void) } // rjf: write value into cache - if(!retry) + if(status != AC_Status_NeedRetry) { U64 hash = u64_hash_from_str8(r->key); U64 slot_idx = hash%cache->slots_count; @@ -565,8 +570,10 @@ ac_async_tick(void) { if(str8_match(n->key, r->key, 0)) { + B32 got_new_value = (status == AC_Status_Good); + // rjf: eliminate existing values, if any, if they do not match the current - if(cache->destroy != 0 && !MemoryMatchStruct(&n->val, &val) && ins_atomic_u64_eval(&n->completion_count) > 0) for(;;) + if(got_new_value && cache->destroy != 0 && !MemoryMatchStruct(&n->val, &val) && ins_atomic_u64_eval(&n->completion_count) > 0) for(;;) { if(access_pt_is_expired(&n->access_pt, .time = 0, .update_idxs = 0)) { @@ -578,8 +585,11 @@ ac_async_tick(void) } // rjf: store + if(got_new_value) + { + n->val = val; + } n->last_completed_gen = gen; - n->val = val; ins_atomic_u64_dec_eval(&n->working_count); ins_atomic_u64_inc_eval(&n->completion_count); } diff --git a/src/artifact_cache/artifact_cache.h b/src/artifact_cache/artifact_cache.h index 2bd082bb..ff61e9e0 100644 --- a/src/artifact_cache/artifact_cache.h +++ b/src/artifact_cache/artifact_cache.h @@ -4,6 +4,17 @@ #ifndef ARTIFACT_CACHE_H #define ARTIFACT_CACHE_H +//////////////////////////////// +//~ rjf: Artifact Computation Statuses + +typedef enum AC_Status +{ + AC_Status_Good, + AC_Status_NeedRetry, + AC_Status_Failed, +} +AC_Status; + //////////////////////////////// //~ rjf: Artifact Handle Type @@ -16,7 +27,7 @@ struct AC_Artifact //////////////////////////////// //~ rjf: Artifact Computation Function Types -typedef AC_Artifact AC_CreateFunctionType(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); +typedef AC_Artifact AC_CreateFunctionType(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out); typedef void AC_DestroyFunctionType(AC_Artifact artifact); typedef U32 AC_Flags; diff --git a/src/dbg_engine/dbg_engine_ctrl.c b/src/dbg_engine/dbg_engine_ctrl.c index 943f7ad8..977ca9d6 100644 --- a/src/dbg_engine/dbg_engine_ctrl.c +++ b/src/dbg_engine/dbg_engine_ctrl.c @@ -1781,9 +1781,10 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) D_Unwind unwind = { .flags = D_UnwindFlag_Error }; ////////////////////////////// - //- rjf: grab run state pre-unwind computing + //- rjf: grab generations pre-unwind computing // - U64 run_gen = d_run_gen(); + U64 mem_gen = d_mem_gen(); + U64 reg_gen = d_reg_gen(); ////////////////////////////// //- rjf: unpack args @@ -1889,19 +1890,16 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) // stale. if it can't be read, the unwind fails. if(step.status == UWND_StepStatus_FailedMemoryRead) { - D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, process_entity->handle, step.missed_read_vaddr_range, 1, endt_us); - String8 data = slice.data; - if(slice.stale) + U64 size_desired = dim_1u64(step.missed_read_vaddr_range); + U8 *data = push_array(scratch.arena, U8, size_desired); + U64 size = d_process_read(process_entity->handle, step.missed_read_vaddr_range, data); + if(size == size_desired) { - unwind.flags |= D_UnwindFlag_Stale; - } - else if(data.size < dim_1u64(step.missed_read_vaddr_range)) - { - unwind.flags |= D_UnwindFlag_Error; + memory_map_push(scratch.arena, &memory_map, step.missed_read_vaddr_range, data); } else { - memory_map_push(scratch.arena, &memory_map, step.missed_read_vaddr_range, data.str); + unwind.flags |= D_UnwindFlag_Error; } } @@ -1949,6 +1947,18 @@ d_unwind_from_thread(Arena *arena, D_Handle thread, U64 endt_us) } } + //- rjf: if we failed, but our generations changed, mark the 'stale' bit + if(unwind.flags & D_UnwindFlag_Error) + { + U64 post_reg_gen = d_reg_gen(); + U64 post_mem_gen = d_mem_gen(); + if(post_reg_gen != reg_gen || + post_mem_gen != mem_gen) + { + unwind.flags |= D_UnwindFlag_Stale; + } + } + //- rjf: bake frames list into result array { unwind.frames.count = frame_node_count; @@ -5626,7 +5636,7 @@ d_data_from_process_vaddr_range(Arena *arena, D_Handle process, Rng1U64 vaddr_ra //- rjf: process memory artifact cache internal AC_Artifact -d_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) +d_memory_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out) { AC_Artifact artifact = {0}; { @@ -5768,7 +5778,7 @@ d_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *g //- rjf: retry on mem gen "tearing", and if the range is non-empty if(pre_read_mem_gen != post_read_mem_gen && range_size != 0) { - retry_out[0] = 1; + status_out[0] = AC_Status_NeedRetry; } //- rjf: bundle content key as artifact @@ -5981,7 +5991,7 @@ d_process_memory_read(D_Handle process, Rng1U64 range, B32 *is_stale_out, void * //~ rjf: TLS Address Artifact Cache Hooks / Lookups internal AC_Artifact -d_tls_vaddr_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) +d_tls_vaddr_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out) { // rjf: unpack key D_Handle thread = {0}; @@ -6008,7 +6018,7 @@ d_tls_vaddr_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 // rjf: if not successful -> retry if(!success) { - retry_out[0] = 1; + status_out[0] = AC_Status_NeedRetry; } // rjf: package as artifact @@ -6017,11 +6027,6 @@ d_tls_vaddr_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 return artifact; } -internal void d_tls_vaddr_artifact_destroy(AC_Artifact artifact) -{ - // NOTE(rjf): no-op -} - internal U64 d_cached_tls_vaddr_from_thread_module(D_Handle thread_handle, D_Handle module_handle, U64 endt_us, B32 *stale_out) { @@ -6029,7 +6034,7 @@ d_cached_tls_vaddr_from_thread_module(D_Handle thread_handle, D_Handle module_ha Access *access = access_open(); D_Handle key_data[] = {thread_handle, module_handle}; String8 key = str8((U8 *)&key_data[0], sizeof(key_data)); - AC_Artifact artifact = ac_artifact_from_key(access, key, d_tls_vaddr_artifact_create, d_tls_vaddr_artifact_destroy, endt_us, .stale_out = stale_out); + AC_Artifact artifact = ac_artifact_from_key(access, key, d_tls_vaddr_artifact_create, 0, endt_us, .stale_out = stale_out); result = artifact.u64[0]; access_close(access); return result; @@ -6039,7 +6044,7 @@ d_cached_tls_vaddr_from_thread_module(D_Handle thread_handle, D_Handle module_ha //~ rjf: Call Stack Artifact Cache Hooks / Lookups internal AC_Artifact -d_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) +d_call_stack_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out) { AC_Artifact artifact = {0}; { @@ -6168,14 +6173,19 @@ d_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U6 pre_reg_gen = d_reg_gen(); pre_mem_gen = d_mem_gen(); unwind = d_unwind_from_thread(arena, thread_handle, now_time_us()+100); - if(!(unwind.flags & D_UnwindFlag_Stale)) + if(unwind.flags & D_UnwindFlag_Stale) { - good = 1; - call_stack[0] = d_call_stack_from_unwind(arena, process, &unwind); + retry = 1; + } + else if(unwind.flags & D_UnwindFlag_Error) + { + good = 0; + retry = 0; } else { - retry = 1; + good = 1; + call_stack[0] = d_call_stack_from_unwind(arena, process, &unwind); } post_reg_gen = d_reg_gen(); post_mem_gen = d_mem_gen(); @@ -6204,8 +6214,19 @@ d_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U6 artifact.u64[1] = (U64)call_stack; } - //- rjf: mark retry - retry_out[0] = retry; + //- rjf: mark status + if(retry) + { + status_out[0] = AC_Status_NeedRetry; + } + else if(good) + { + status_out[0] = AC_Status_Good; + } + else + { + status_out[0] = AC_Status_Failed; + } scratch_end(scratch); } @@ -6243,7 +6264,7 @@ d_call_stack_from_thread(Access *access, D_Handle thread_handle, B32 high_priori //~ rjf: Call Stack Tree Artifact Cache Hooks / Lookups internal AC_Artifact -d_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) +d_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out) { Temp scratch = scratch_begin(0, 0); Access *access = access_open(); @@ -6354,7 +6375,7 @@ d_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_ou //- rjf: retry on stale if(stale) { - retry_out[0] = 1; + status_out[0] = AC_Status_NeedRetry; } access_close(access); diff --git a/src/dbg_engine/dbg_engine_ctrl.h b/src/dbg_engine/dbg_engine_ctrl.h index 47a8a750..c55144e1 100644 --- a/src/dbg_engine/dbg_engine_ctrl.h +++ b/src/dbg_engine/dbg_engine_ctrl.h @@ -640,7 +640,7 @@ internal String8 d_data_from_process_vaddr_range(Arena *arena, D_Handle process, #define d_process_write_struct(process, vaddr, ptr) d_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), (ptr)) //- rjf: process memory artifact cache -internal AC_Artifact d_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); +internal AC_Artifact d_memory_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out); internal void d_memory_artifact_destroy(AC_Artifact artifact); internal C_Key d_key_from_process_vaddr_range(D_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, B32 wait_for_fresh, U64 endt_us, B32 *out_is_stale); @@ -652,21 +652,20 @@ internal B32 d_process_memory_read(D_Handle process, Rng1U64 range, B32 *is_stal //////////////////////////////// //~ rjf: TLS Address Artifact Cache Hooks / Lookups -internal AC_Artifact d_tls_vaddr_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); -internal void d_tls_vaddr_artifact_destroy(AC_Artifact artifact); +internal AC_Artifact d_tls_vaddr_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out); internal U64 d_cached_tls_vaddr_from_thread_module(D_Handle thread_handle, D_Handle module_handle, U64 endt_us, B32 *stale_out); //////////////////////////////// //~ rjf: Call Stack Artifact Cache Hooks / Lookups -internal AC_Artifact d_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); +internal AC_Artifact d_call_stack_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out); internal void d_call_stack_artifact_destroy(AC_Artifact artifact); internal D_CallStack d_call_stack_from_thread(Access *access, D_Handle thread_handle, B32 high_priority, U64 endt_us); //////////////////////////////// //~ rjf: Call Stack Tree Artifact Cache Hooks / Lookups -internal AC_Artifact d_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); +internal AC_Artifact d_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out); internal void d_call_stack_tree_artifact_destroy(AC_Artifact artifact); internal D_CallStackTree d_call_stack_tree(Access *access, U64 endt_us); diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index fbbe8f63..df265907 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -1152,7 +1152,7 @@ di_conversion_completion_signal_receiver_thread_entry_point(void *p) //~ rjf: Search Artifact Cache Hooks / Lookups internal AC_Artifact -di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) +di_search_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out) { ProfBeginFunction(); Access *access = access_open(); @@ -1569,7 +1569,7 @@ di_search_item_array_from_target_query(Access *access, RDI_SectionKind target, S //~ rjf: Match Artifact Cache Hooks / Lookups internal AC_Artifact -di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) +di_match_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); diff --git a/src/dbg_info/dbg_info.h b/src/dbg_info/dbg_info.h index 85fb9a03..c933c200 100644 --- a/src/dbg_info/dbg_info.h +++ b/src/dbg_info/dbg_info.h @@ -363,14 +363,14 @@ internal void di_conversion_completion_signal_receiver_thread_entry_point(void * //////////////////////////////// //~ rjf: Search Artifact Cache Hooks / Lookups -internal AC_Artifact di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); +internal AC_Artifact di_search_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out); internal void di_search_artifact_destroy(AC_Artifact artifact); internal DI_SearchItemArray di_search_item_array_from_target_query(Access *access, RDI_SectionKind target, String8 query, U64 endt_us, B32 *stale_out); //////////////////////////////// //~ rjf: Match Artifact Cache Hooks / Lookups -internal AC_Artifact di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); +internal AC_Artifact di_match_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out); internal DI_Match di_match_from_string(String8 string, U32 match_index, U32 unit_idx, B32 allow_other_dbgis, DI_Key preferred_dbgi_key, U64 endt_us); #endif // DBG_INFO_H diff --git a/src/disasm/disasm.c b/src/disasm/disasm.c index 58532b5e..21033b6c 100644 --- a/src/disasm/disasm.c +++ b/src/disasm/disasm.c @@ -146,7 +146,7 @@ struct DASM_Artifact }; internal AC_Artifact -dasm_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) +dasm_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out) { DASM_Artifact *artifact = 0; if(lane_idx() == 0) @@ -338,7 +338,7 @@ dasm_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_o //- rjf: if stale, retry if(stale) { - retry_out[0] = 1; + status_out[0] = AC_Status_NeedRetry; } //- rjf: mark dependency on data hash diff --git a/src/disasm/disasm.h b/src/disasm/disasm.h index 816e9c19..87840257 100644 --- a/src/disasm/disasm.h +++ b/src/disasm/disasm.h @@ -201,7 +201,7 @@ internal U64 dasm_line_array_code_off_from_idx(DASM_LineArray *array, U64 idx); //////////////////////////////// //~ rjf: Artifact Cache Hooks / Lookups -internal AC_Artifact dasm_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); +internal AC_Artifact dasm_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out); internal void dasm_artifact_destroy(AC_Artifact artifact); internal DASM_Info dasm_info_from_hash_params(Access *access, U128 hash, DASM_Params *params); internal DASM_Info dasm_info_from_key_params(Access *access, C_Key key, DASM_Params *params, U128 *hash_out); diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index d1ca382f..de41c9a3 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -2579,7 +2579,7 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(array) //~ rjf: (Built-In Type Hooks) `list` lens internal AC_Artifact -e_list_gather_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) +e_list_gather_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out) { Temp scratch = scratch_begin(0, 0); @@ -2684,7 +2684,7 @@ e_list_gather_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U //- rjf: retry if(retry) { - retry_out[0] = 1; + status_out[0] = AC_Status_NeedRetry; } //- rjf: flatten diff --git a/src/file_stream/file_stream.c b/src/file_stream/file_stream.c index 26533c17..5917c920 100644 --- a/src/file_stream/file_stream.c +++ b/src/file_stream/file_stream.c @@ -32,7 +32,7 @@ fs_change_gen(void) //~ rjf: Cache Interaction internal AC_Artifact -fs_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) +fs_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -146,7 +146,7 @@ fs_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out (file_handle_is_valid || pre_props.flags & FilePropertyFlag_IsFolder)); if(!read_good) { - retry_out[0] = 1; + status_out[0] = AC_Status_NeedRetry; ProfScope("abort") { arena_release(data_arena); diff --git a/src/file_stream/file_stream.h b/src/file_stream/file_stream.h index 579f68cc..03ed9777 100644 --- a/src/file_stream/file_stream.h +++ b/src/file_stream/file_stream.h @@ -55,7 +55,7 @@ internal U64 fs_change_gen(void); //////////////////////////////// //~ rjf: Artifact Cache Hooks / Accessing API -internal AC_Artifact fs_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); +internal AC_Artifact fs_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out); internal void fs_artifact_destroy(AC_Artifact artifact); internal C_Key fs_key_from_path_range(String8 path, Rng1U64 range, U64 endt_us); diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 9fec8814..18dc5d4a 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -10088,7 +10088,7 @@ rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, D_Event *event) //~ rjf: Source File Checksum Calculations internal AC_Artifact -rd_md5_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out) +rd_md5_artifact_create(String8 key, B32 *cancel_out, AC_Status *status_out, U64 *gen_out) { AC_Artifact result = {0}; { @@ -10105,7 +10105,7 @@ rd_md5_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_ou } internal AC_Artifact -rd_sha1_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out) +rd_sha1_artifact_create(String8 key, B32 *cancel_out, AC_Status *status_out, U64 *gen_out) { AC_Artifact result = {0}; { @@ -10122,7 +10122,7 @@ rd_sha1_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_o } internal AC_Artifact -rd_sha256_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out) +rd_sha256_artifact_create(String8 key, B32 *cancel_out, AC_Status *status_out, U64 *gen_out) { AC_Artifact result = {0}; { diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index b7994c02..c473ee8f 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -794,9 +794,9 @@ internal DR_FStrList rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, D_E //////////////////////////////// //~ rjf: Source File Checksum Calculations -internal AC_Artifact rd_md5_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out); -internal AC_Artifact rd_sha1_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out); -internal AC_Artifact rd_sha256_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out); +internal AC_Artifact rd_md5_artifact_create(String8 key, B32 *cancel_out, AC_Status *status_out, U64 *gen_out); +internal AC_Artifact rd_sha1_artifact_create(String8 key, B32 *cancel_out, AC_Status *status_out, U64 *gen_out); +internal AC_Artifact rd_sha256_artifact_create(String8 key, B32 *cancel_out, AC_Status *status_out, U64 *gen_out); internal MD5 rd_md5_from_hash(U128 hash); internal SHA1 rd_sha1_from_hash(U128 hash); internal SHA256 rd_sha256_from_hash(U128 hash); diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index f7b7f018..8db66e9d 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -4504,7 +4504,7 @@ struct RD_BitmapCanvasBoxDrawData }; internal AC_Artifact -rd_bitmap_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) +rd_bitmap_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out) { Access *access = access_open(); @@ -5130,7 +5130,7 @@ struct RD_Geo3DBoxDrawData }; internal AC_Artifact -rd_geo3d_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) +rd_geo3d_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out) { Access *access = access_open(); U128 hash = {0}; diff --git a/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c b/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c index f9a069cd..36209f00 100644 --- a/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c +++ b/src/rdi_from_dwarf/tests/rdi_from_dwarf_tests.c @@ -64,7 +64,7 @@ SkippedTest(d2r_regressions) } } -SkippedTest(d2r_determinism) +Test(d2r_determinism) { U64 num_repeats_per_bin = 16; String8 radbin_path = test_build_exe_path(arena, s("radbin")); diff --git a/src/text/text.c b/src/text/text.c index 2e414aeb..ba7d2918 100644 --- a/src/text/text.c +++ b/src/text/text.c @@ -2685,7 +2685,7 @@ struct TXT_ArtifactCreateShared }; internal AC_Artifact -txt_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out) +txt_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); diff --git a/src/text/text.h b/src/text/text.h index 2f039b9e..6425f848 100644 --- a/src/text/text.h +++ b/src/text/text.h @@ -232,7 +232,7 @@ internal TXT_ScopeNode *txt_scope_node_from_info_pt(TXT_TextInfo *info, TxtPt pt //////////////////////////////// //~ rjf: Artifact Cache Hooks / Lookups -internal AC_Artifact txt_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out); +internal AC_Artifact txt_artifact_create(String8 key, B32 *cancel_signal, AC_Status *status_out, U64 *gen_out); internal void txt_artifact_destroy(AC_Artifact artifact); internal TXT_TextInfo txt_text_info_from_hash_lang(Access *access, U128 hash, TXT_LangKind lang); internal TXT_TextInfo txt_text_info_from_key_lang(Access *access, C_Key key, TXT_LangKind lang, U128 *hash_out);