From 871daf3f228c2afc63b77568d17e37240ad11675 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 2 Oct 2025 12:08:31 -0700 Subject: [PATCH] only push unique hashes to key history in content layer; fix staleness detection in search --- src/content/content.c | 16 ++++++++++++---- src/dbg_info/dbg_info.c | 4 ++-- src/dbg_info/dbg_info.h | 2 +- src/raddbg/raddbg_eval.c | 7 ++++--- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/content/content.c b/src/content/content.c index 1136f1af..86062fea 100644 --- a/src/content/content.c +++ b/src/content/content.c @@ -276,12 +276,20 @@ c_submit_data(C_Key key, Arena **data_arena, String8 data) // rjf: push hash into key's history if(key_node) { - if(key_node->hash_history_gen >= C_KEY_HASH_HISTORY_STRONG_REF_COUNT) + U128 last_hash = {0}; + if(key_node->hash_history_gen >= 1) { - key_expired_hash = key_node->hash_history[(key_node->hash_history_gen-C_KEY_HASH_HISTORY_STRONG_REF_COUNT)%ArrayCount(key_node->hash_history)]; + last_hash = key_node->hash_history[(key_node->hash_history_gen-1)%ArrayCount(key_node->hash_history)]; + } + if(!u128_match(last_hash, hash)) + { + if(key_node->hash_history_gen >= C_KEY_HASH_HISTORY_STRONG_REF_COUNT) + { + key_expired_hash = key_node->hash_history[(key_node->hash_history_gen-C_KEY_HASH_HISTORY_STRONG_REF_COUNT)%ArrayCount(key_node->hash_history)]; + } + key_node->hash_history[key_node->hash_history_gen%ArrayCount(key_node->hash_history)] = hash; + key_node->hash_history_gen += 1; } - key_node->hash_history[key_node->hash_history_gen%ArrayCount(key_node->hash_history)] = hash; - key_node->hash_history_gen += 1; } // rjf: key is new -> add this key to the associated root diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index e6a42707..9f5f9c39 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -1352,7 +1352,7 @@ 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) +di_search_item_array_from_target_query(Access *access, RDI_SectionKind target, String8 query, U64 endt_us, B32 *stale_out) { DI_SearchItemArray result = {0}; { @@ -1366,7 +1366,7 @@ di_search_item_array_from_target_query(Access *access, RDI_SectionKind target, S String8 key = str8_list_join(scratch.arena, &key_parts, 0); // rjf: get artifact - AC_Artifact artifact = ac_artifact_from_key(access, key, di_search_artifact_create, di_search_artifact_destroy, endt_us, .gen = di_load_gen(), .flags = AC_Flag_Wide); + AC_Artifact artifact = ac_artifact_from_key(access, key, di_search_artifact_create, di_search_artifact_destroy, endt_us, .gen = di_load_gen(), .flags = AC_Flag_Wide, .stale_out = stale_out); // rjf: unpack artifact result.v = (DI_SearchItem *)artifact.u64[1]; diff --git a/src/dbg_info/dbg_info.h b/src/dbg_info/dbg_info.h index 49ea1341..5af13b45 100644 --- a/src/dbg_info/dbg_info.h +++ b/src/dbg_info/dbg_info.h @@ -308,7 +308,7 @@ internal void di_conversion_completion_signal_receiver_thread_entry_point(void * internal AC_Artifact di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_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); +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 diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index e2d8930e..4de6e60d 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -1661,13 +1661,14 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(debug_info_table) { U64 endt_us = rd_state->frame_eval_memread_endt_us; U128 fuzzy_search_key = {d_hash_from_string(str8_struct(&rd_regs()->view)), (U64)section}; + B32 stale = 0; accel->section = section; - accel->items = di_search_item_array_from_target_query(rd_state->frame_access, section, filter, endt_us); + accel->items = di_search_item_array_from_target_query(rd_state->frame_access, section, filter, endt_us, &stale); RD_ViewState *vs = rd_view_state_from_cfg(rd_cfg_from_id(rd_regs()->view)); - if(accel->items.count == 0) + if(stale) { String8 last_query = str8(vs->last_successful_query_buffer, vs->last_successful_query_string_size); - accel->items = di_search_item_array_from_target_query(rd_state->frame_access, section, last_query, endt_us); + accel->items = di_search_item_array_from_target_query(rd_state->frame_access, section, last_query, endt_us, 0); } else {