From c4bf855af92e28735c04b9440a69f5971863b116 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 25 Sep 2025 14:54:33 -0700 Subject: [PATCH] extend artifact cache nodes with last requested vs. last completed gen; pass last requested gen to artifact creation to support cancellation --- src/artifact_cache/artifact_cache.c | 16 +++++++++------- src/artifact_cache/artifact_cache.h | 8 ++++++-- src/ctrl/ctrl_core.c | 4 ++-- src/ctrl/ctrl_core.h | 4 ++-- src/disasm/disasm.c | 2 +- src/disasm/disasm.h | 2 +- src/file_stream/file_stream.c | 2 +- src/file_stream/file_stream.h | 2 +- src/raddbg/raddbg_views.c | 4 ++-- src/text/text.c | 2 +- src/text/text.h | 2 +- 11 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/artifact_cache/artifact_cache.c b/src/artifact_cache/artifact_cache.c index 3c774b4a..94a64706 100644 --- a/src/artifact_cache/artifact_cache.c +++ b/src/artifact_cache/artifact_cache.c @@ -81,7 +81,8 @@ ac_artifact_from_key_(Access *access, String8 key, AC_ArtifactParams *params, U6 { if(str8_match(n->key, key, 0)) { - B32 is_stale = (n->gen != params->gen); + ins_atomic_u64_eval_assign(&n->last_requested_gen, params->gen); + B32 is_stale = (n->last_completed_gen != params->gen); if(ins_atomic_u64_eval(&n->completion_count) != 0 && (!is_stale || !(params->flags & AC_Flag_WaitForFresh))) { got_artifact = 1; @@ -159,6 +160,7 @@ ac_artifact_from_key_(Access *access, String8 key, AC_ArtifactParams *params, U6 } n->v.key = str8_copy(req_batch->arena, key); n->v.gen = params->gen; + n->v.last_requested_gen = &node->last_requested_gen; n->v.create = params->create; } cond_var_broadcast(async_tick_start_cond_var); @@ -166,10 +168,10 @@ ac_artifact_from_key_(Access *access, String8 key, AC_ArtifactParams *params, U6 } // rjf: get value from node, if possible - if(!got_artifact && ins_atomic_u64_eval(&node->completion_count) != 0 && ((node->gen == params->gen) || !(params->flags & AC_Flag_WaitForFresh) || out_of_time)) + if(!got_artifact && ins_atomic_u64_eval(&node->completion_count) != 0 && ((node->last_completed_gen == params->gen) || !(params->flags & AC_Flag_WaitForFresh) || out_of_time)) { got_artifact = 1; - artifact_is_stale = (node->gen == params->gen); + artifact_is_stale = (node->last_completed_gen == params->gen); artifact = node->val; access_touch(access, &node->access_pt, stripe->cv); } @@ -327,7 +329,7 @@ ac_async_tick(void) // rjf: compute val B32 retry = 0; - AC_Artifact val = r->create(r->key, &retry); + AC_Artifact val = r->create(r->key, r->gen, r->last_requested_gen, &retry); // rjf: retry? -> resubmit request if(retry && lane_idx() == 0) @@ -377,7 +379,7 @@ ac_async_tick(void) { if(str8_match(n->key, r->key, 0)) { - n->gen = r->gen; + n->last_completed_gen = r->gen; n->val = val; ins_atomic_u64_dec_eval(&n->working_count); ins_atomic_u64_inc_eval(&n->completion_count); @@ -408,7 +410,7 @@ ac_async_tick(void) // rjf: compute val B32 retry = 0; - AC_Artifact val = r->create(r->key, &retry); + AC_Artifact val = r->create(r->key, r->gen, r->last_requested_gen, &retry); // rjf: retry? -> resubmit request if(retry) @@ -458,7 +460,7 @@ ac_async_tick(void) { if(str8_match(n->key, r->key, 0)) { - n->gen = r->gen; + n->last_completed_gen = r->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 2f874679..6d14a48e 100644 --- a/src/artifact_cache/artifact_cache.h +++ b/src/artifact_cache/artifact_cache.h @@ -16,7 +16,7 @@ struct AC_Artifact //////////////////////////////// //~ rjf: Artifact Computation Function Types -typedef AC_Artifact AC_CreateFunctionType(String8 key, B32 *retry_out); +typedef AC_Artifact AC_CreateFunctionType(String8 key, U64 gen, U64 *requested_gen, B32 *retry_out); typedef void AC_DestroyFunctionType(AC_Artifact artifact); typedef U32 AC_Flags; @@ -48,6 +48,7 @@ struct AC_Request { String8 key; U64 gen; + U64 *last_requested_gen; AC_CreateFunctionType *create; }; @@ -66,7 +67,8 @@ struct AC_Node // rjf: key/gen/value String8 key; - U64 gen; + U64 last_requested_gen; + U64 last_completed_gen; AC_Artifact val; // rjf: metadata @@ -74,6 +76,8 @@ struct AC_Node U64 working_count; U64 completion_count; U64 evict_threshold_us; + B32 cancelled; + U64 _unused_; }; typedef struct AC_Slot AC_Slot; diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 9271ca3f..849e225a 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -7464,7 +7464,7 @@ ASYNC_WORK_DEF(ctrl_call_stack_tree_build_work) //~ rjf: Process Memory Artifact Cache Hooks / Lookups internal AC_Artifact -ctrl_memory_artifact_create(String8 key, B32 *retry_out) +ctrl_memory_artifact_create(String8 key, U64 gen, U64 *requested_gen, B32 *retry_out) { AC_Artifact artifact = {0}; { @@ -7631,7 +7631,7 @@ ctrl_key_from_process_vaddr_range_new(CTRL_Handle process, Rng1U64 vaddr_range, //~ rjf: Call Stack Artifact Cache Hooks / Lookups internal AC_Artifact -ctrl_call_stack_artifact_create(String8 key, B32 *retry_out) +ctrl_call_stack_artifact_create(String8 key, U64 gen, U64 *requested_gen, B32 *retry_out) { AC_Artifact artifact = {0}; { diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 44060551..216aad93 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -1253,14 +1253,14 @@ ASYNC_WORK_DEF(ctrl_call_stack_tree_build_work); //////////////////////////////// //~ rjf: Process Memory Artifact Cache Hooks / Lookups -internal AC_Artifact ctrl_memory_artifact_create(String8 key, B32 *retry_out); +internal AC_Artifact ctrl_memory_artifact_create(String8 key, U64 gen, U64 *requested_gen, B32 *retry_out); internal void ctrl_memory_artifact_destroy(AC_Artifact artifact); internal C_Key ctrl_key_from_process_vaddr_range_new(CTRL_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, U64 endt_us, B32 *out_is_stale); //////////////////////////////// //~ rjf: Call Stack Artifact Cache Hooks / Lookups -internal AC_Artifact ctrl_call_stack_artifact_create(String8 key, B32 *retry_out); +internal AC_Artifact ctrl_call_stack_artifact_create(String8 key, U64 gen, U64 *requested_gen, B32 *retry_out); internal void ctrl_call_stack_artifact_destroy(AC_Artifact artifact); internal CTRL_CallStack ctrl_call_stack_from_thread_new(Access *access, CTRL_Handle thread_handle, B32 high_priority, U64 endt_us); diff --git a/src/disasm/disasm.c b/src/disasm/disasm.c index 56a9572f..d5905f7f 100644 --- a/src/disasm/disasm.c +++ b/src/disasm/disasm.c @@ -265,7 +265,7 @@ struct DASM_Artifact }; internal AC_Artifact -dasm_artifact_create(String8 key, B32 *retry_out) +dasm_artifact_create(String8 key, U64 gen, U64 *requested_gen, B32 *retry_out) { DASM_Artifact *artifact = 0; if(lane_idx() == 0) diff --git a/src/disasm/disasm.h b/src/disasm/disasm.h index cd346fd7..7ccd09f8 100644 --- a/src/disasm/disasm.h +++ b/src/disasm/disasm.h @@ -197,7 +197,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 *retry_out); +internal AC_Artifact dasm_artifact_create(String8 key, U64 gen, U64 *requested_gen, B32 *retry_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/file_stream/file_stream.c b/src/file_stream/file_stream.c index d099f0c1..f68da6f5 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 *retry_out) +fs_artifact_create(String8 key, U64 gen, U64 *requested_gen, B32 *retry_out) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); diff --git a/src/file_stream/file_stream.h b/src/file_stream/file_stream.h index 4ecc10ff..9622e48c 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 *retry_out); +internal AC_Artifact fs_artifact_create(String8 key, U64 gen, U64 *requested_gen, B32 *retry_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_views.c b/src/raddbg/raddbg_views.c index ab6efa48..673ed4be 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -3750,7 +3750,7 @@ struct RD_BitmapCanvasBoxDrawData }; internal AC_Artifact -rd_bitmap_artifact_create(String8 key, B32 *retry_out) +rd_bitmap_artifact_create(String8 key, U64 gen, U64 *requested_gen, B32 *retry_out) { Access *access = access_open(); @@ -4364,7 +4364,7 @@ struct RD_Geo3DBoxDrawData }; internal AC_Artifact -rd_geo3d_artifact_create(String8 key, B32 *retry_out) +rd_geo3d_artifact_create(String8 key, U64 gen, U64 *requested_gen, B32 *retry_out) { Access *access = access_open(); U128 hash = {0}; diff --git a/src/text/text.c b/src/text/text.c index ef19c3a3..ba628572 100644 --- a/src/text/text.c +++ b/src/text/text.c @@ -1969,7 +1969,7 @@ struct TXT_ArtifactCreateShared }; internal AC_Artifact -txt_artifact_create(String8 key, B32 *retry_out) +txt_artifact_create(String8 key, U64 gen, U64 *requested_gen, B32 *retry_out) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); diff --git a/src/text/text.h b/src/text/text.h index 45f9a2f3..1c31aa52 100644 --- a/src/text/text.h +++ b/src/text/text.h @@ -203,7 +203,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 *retry_out); +internal AC_Artifact txt_artifact_create(String8 key, U64 gen, U64 *requested_gen, B32 *retry_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);