new strategy - allow artifact creation to report a completed generation which differs from the requested generation, thus preventing duplicate gen requests (in the case of ctrl process memory)

This commit is contained in:
Ryan Fleury
2025-10-09 11:24:48 -07:00
parent 28bb158c61
commit 9022efd3ab
13 changed files with 29 additions and 26 deletions
+6 -4
View File
@@ -361,7 +361,8 @@ ac_async_tick(void)
// rjf: compute val
B32 retry = 0;
AC_Artifact val = r->create(r->key, r->gen, r->cancel_signal, &retry);
U64 gen = r->gen;
AC_Artifact val = r->create(r->key, r->cancel_signal, &retry, &gen);
// rjf: retry? -> resubmit request
if(retry && lane_idx() == 0)
@@ -411,7 +412,7 @@ ac_async_tick(void)
{
if(str8_match(n->key, r->key, 0))
{
n->last_completed_gen = r->gen;
n->last_completed_gen = gen;
n->val = val;
ins_atomic_u64_dec_eval(&n->working_count);
ins_atomic_u64_inc_eval(&n->completion_count);
@@ -466,7 +467,8 @@ ac_async_tick(void)
// rjf: compute val
B32 retry = 0;
AC_Artifact val = r->create(r->key, r->gen, r->cancel_signal, &retry);
U64 gen = r->gen;
AC_Artifact val = r->create(r->key, r->cancel_signal, &retry, &gen);
// rjf: restore wide lane ctx
lane_ctx(lane_ctx_restore);
@@ -519,7 +521,7 @@ ac_async_tick(void)
{
if(str8_match(n->key, r->key, 0))
{
n->last_completed_gen = r->gen;
n->last_completed_gen = gen;
n->val = val;
ins_atomic_u64_dec_eval(&n->working_count);
ins_atomic_u64_inc_eval(&n->completion_count);
+1 -1
View File
@@ -16,7 +16,7 @@ struct AC_Artifact
////////////////////////////////
//~ rjf: Artifact Computation Function Types
typedef AC_Artifact AC_CreateFunctionType(String8 key, U64 gen, B32 *cancel_signal, B32 *retry_out);
typedef AC_Artifact AC_CreateFunctionType(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);
typedef void AC_DestroyFunctionType(AC_Artifact artifact);
typedef U32 AC_Flags;
+4 -3
View File
@@ -5977,7 +5977,7 @@ ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg)
//~ rjf: Process Memory Artifact Cache Hooks / Lookups
internal AC_Artifact
ctrl_memory_artifact_create(String8 key, U64 gen, B32 *cancel_signal, B32 *retry_out)
ctrl_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
{
AC_Artifact artifact = {0};
{
@@ -6098,6 +6098,7 @@ ctrl_memory_artifact_create(String8 key, U64 gen, B32 *cancel_signal, B32 *retry
if((zero_terminated_size > 0 || !key_has_history) && range_size != 0 && pre_read_mem_gen == post_read_mem_gen)
{
hash = c_submit_data(content_key, &range_arena, str8((U8 *)range_base, zero_terminated_size));
gen_out[0] = pre_read_mem_gen;
}
//- rjf: wakeup on new submissions
@@ -6369,7 +6370,7 @@ ctrl_process_write(CTRL_Handle process, Rng1U64 range, void *src)
//~ rjf: Call Stack Artifact Cache Hooks / Lookups
internal AC_Artifact
ctrl_call_stack_artifact_create(String8 key, U64 gen, B32 *cancel_signal, B32 *retry_out)
ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
{
AC_Artifact artifact = {0};
{
@@ -6565,7 +6566,7 @@ ctrl_call_stack_from_thread(Access *access, CTRL_Handle thread_handle, B32 high_
//~ rjf: Call Stack Tree Artifact Cache Hooks / Lookups
internal AC_Artifact
ctrl_call_stack_tree_artifact_create(String8 key, U64 gen, B32 *cancel_signal, B32 *retry_out)
ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
{
Temp scratch = scratch_begin(0, 0);
Access *access = access_open();
+3 -3
View File
@@ -1002,7 +1002,7 @@ internal void ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg);
////////////////////////////////
//~ rjf: Process Memory Artifact Cache Hooks / Lookups
internal AC_Artifact ctrl_memory_artifact_create(String8 key, U64 gen, B32 *cancel_signal, B32 *retry_out);
internal AC_Artifact ctrl_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);
internal void ctrl_memory_artifact_destroy(AC_Artifact artifact);
internal C_Key ctrl_key_from_process_vaddr_range(CTRL_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, B32 wait_for_fresh, U64 endt_us, B32 *out_is_stale);
@@ -1017,14 +1017,14 @@ internal B32 ctrl_process_write(CTRL_Handle process, Rng1U64 range, void *src);
////////////////////////////////
//~ rjf: Call Stack Artifact Cache Hooks / Lookups
internal AC_Artifact ctrl_call_stack_artifact_create(String8 key, U64 gen, B32 *cancel_signal, B32 *retry_out);
internal AC_Artifact ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);
internal void ctrl_call_stack_artifact_destroy(AC_Artifact artifact);
internal CTRL_CallStack ctrl_call_stack_from_thread(Access *access, CTRL_Handle thread_handle, B32 high_priority, U64 endt_us);
////////////////////////////////
//~ rjf: Call Stack Tree Artifact Cache Hooks / Lookups
internal AC_Artifact ctrl_call_stack_tree_artifact_create(String8 key, U64 gen, B32 *cancel_signal, B32 *retry_out);
internal AC_Artifact ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);
internal void ctrl_call_stack_tree_artifact_destroy(AC_Artifact artifact);
internal CTRL_CallStackTree ctrl_call_stack_tree(Access *access, U64 endt_us);
+2 -2
View File
@@ -1023,7 +1023,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, U64 gen, B32 *cancel_signal, B32 *retry_out)
di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
{
ProfBeginFunction();
Access *access = access_open();
@@ -1451,7 +1451,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, U64 gen, B32 *cancel_signal, B32 *retry_out)
di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
{
ProfBeginFunction();
Temp scratch = scratch_begin(0, 0);
+2 -2
View File
@@ -352,14 +352,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, U64 gen, B32 *cancel_signal, B32 *retry_out);
internal AC_Artifact di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_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, U64 gen, B32 *cancel_signal, B32 *retry_out);
internal AC_Artifact di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);
internal DI_Match di_match_from_string(String8 string, U64 index, DI_Key preferred_dbgi_key, U64 endt_us);
#endif // DBG_INFO_H
+1 -1
View File
@@ -266,7 +266,7 @@ struct DASM_Artifact
};
internal AC_Artifact
dasm_artifact_create(String8 key, U64 gen, B32 *cancel_signal, B32 *retry_out)
dasm_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
{
DASM_Artifact *artifact = 0;
if(lane_idx() == 0)
+1 -1
View File
@@ -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, U64 gen, B32 *cancel_signal, B32 *retry_out);
internal AC_Artifact dasm_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_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);
+1 -1
View File
@@ -32,7 +32,7 @@ fs_change_gen(void)
//~ rjf: Cache Interaction
internal AC_Artifact
fs_artifact_create(String8 key, U64 gen, B32 *cancel_signal, B32 *retry_out)
fs_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
{
ProfBeginFunction();
Temp scratch = scratch_begin(0, 0);
+1 -1
View File
@@ -55,7 +55,7 @@ internal U64 fs_change_gen(void);
////////////////////////////////
//~ rjf: Artifact Cache Hooks / Accessing API
internal AC_Artifact fs_artifact_create(String8 key, U64 gen, B32 *cancel_signal, B32 *retry_out);
internal AC_Artifact fs_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_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);
+5 -5
View File
@@ -1934,7 +1934,7 @@ RD_VIEW_UI_FUNCTION_DEF(null) {}
//~ rjf: text @view_hook_impl
internal AC_Artifact
rd_md5_artifact_create(String8 key, U64 gen, B32 *cancel_out, B32 *retry_out)
rd_md5_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out)
{
AC_Artifact result = {0};
{
@@ -1951,7 +1951,7 @@ rd_md5_artifact_create(String8 key, U64 gen, B32 *cancel_out, B32 *retry_out)
}
internal AC_Artifact
rd_sha1_artifact_create(String8 key, U64 gen, B32 *cancel_out, B32 *retry_out)
rd_sha1_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out)
{
AC_Artifact result = {0};
{
@@ -1968,7 +1968,7 @@ rd_sha1_artifact_create(String8 key, U64 gen, B32 *cancel_out, B32 *retry_out)
}
internal AC_Artifact
rd_sha256_artifact_create(String8 key, U64 gen, B32 *cancel_out, B32 *retry_out)
rd_sha256_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out)
{
AC_Artifact result = {0};
{
@@ -3843,7 +3843,7 @@ struct RD_BitmapCanvasBoxDrawData
};
internal AC_Artifact
rd_bitmap_artifact_create(String8 key, U64 gen, B32 *cancel_signal, B32 *retry_out)
rd_bitmap_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
{
Access *access = access_open();
@@ -4469,7 +4469,7 @@ struct RD_Geo3DBoxDrawData
};
internal AC_Artifact
rd_geo3d_artifact_create(String8 key, U64 gen, B32 *cancel_signal, B32 *retry_out)
rd_geo3d_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
{
Access *access = access_open();
U128 hash = {0};
+1 -1
View File
@@ -1970,7 +1970,7 @@ struct TXT_ArtifactCreateShared
};
internal AC_Artifact
txt_artifact_create(String8 key, U64 gen, B32 *cancel_signal, B32 *retry_out)
txt_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)
{
ProfBeginFunction();
Temp scratch = scratch_begin(0, 0);
+1 -1
View File
@@ -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, U64 gen, B32 *cancel_signal, B32 *retry_out);
internal AC_Artifact txt_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_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);