From 871419de3907903f2da9eb78cb51596357ee694b Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 12 Mar 2024 15:49:36 -0700 Subject: [PATCH] bugfixes in new demon layer; adjust retry mechanism in process memory cache query; ui fixes --- src/ctrl/ctrl_core.c | 26 ++++++++++++++++++++++++-- src/ctrl/ctrl_core.h | 1 + src/demon2/win32/demon2_core_win32.c | 6 +++--- src/df/core/df_core.c | 12 ++++++------ src/ui/ui_core.c | 3 ++- 5 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 75abeeba..a0444c90 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -970,6 +970,7 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle } //- rjf: not good -> create range node if necessary + U64 last_time_requested_us = 0; if(!is_good) { OS_MutexScopeW(process_stripe->rw_mutex) @@ -985,6 +986,7 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle { if(MemoryMatchStruct(&range_n->vaddr_range, &range) && range_n->zero_terminated == zero_terminated) { + last_time_requested_us = range_n->last_time_requested_us; range_node_exists = 1; break; } @@ -1009,9 +1011,29 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_MachineID machine_id, DMN_Handle } //- rjf: not good, or is stale -> submit hash request - if(!is_good || is_stale) + if((!is_good || is_stale) && os_now_microseconds() >= last_time_requested_us+10000) { ctrl_u2ms_enqueue_req(machine_id, process, range, zero_terminated, endt_us); + OS_MutexScopeW(process_stripe->rw_mutex) + { + for(CTRL_ProcessMemoryCacheNode *n = process_slot->first; n != 0; n = n->next) + { + if(n->machine_id == machine_id && ctrl_handle_match(n->process, process)) + { + U64 range_slot_idx = range_hash%n->range_hash_slots_count; + CTRL_ProcessMemoryRangeHashSlot *range_slot = &n->range_hash_slots[range_slot_idx]; + B32 range_node_exists = 0; + for(CTRL_ProcessMemoryRangeHashNode *range_n = range_slot->first; range_n != 0; range_n = range_n->next) + { + if(MemoryMatchStruct(&range_n->vaddr_range, &range) && range_n->zero_terminated == zero_terminated) + { + range_n->last_time_requested_us = os_now_microseconds(); + break; + } + } + } + } + } } //- rjf: out of time? -> exit @@ -3576,7 +3598,7 @@ ctrl_mem_stream_thread__entry_point(void *p) if(got_task && memgen_idx != preexisting_memgen_idx) { range_size = dim_1u64(vaddr_range_clamped); - U64 arena_size = AlignPow2(range_size + ARENA_HEADER_SIZE, KB(64)); + U64 arena_size = AlignPow2(range_size + ARENA_HEADER_SIZE, os_page_size()); range_arena = arena_alloc__sized(range_size+ARENA_HEADER_SIZE, range_size+ARENA_HEADER_SIZE); if(range_arena == 0) { diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index e7ce56e9..b33c59d6 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -377,6 +377,7 @@ struct CTRL_ProcessMemoryRangeHashNode Rng1U64 vaddr_range_clamped; U128 hash; U64 memgen_idx; + U64 last_time_requested_us; B32 is_taken; }; diff --git a/src/demon2/win32/demon2_core_win32.c b/src/demon2/win32/demon2_core_win32.c index c06d2b45..eed84eb6 100644 --- a/src/demon2/win32/demon2_core_win32.c +++ b/src/demon2/win32/demon2_core_win32.c @@ -1198,7 +1198,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) { //- rjf: scan all processes for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; - process != 0; + process != &dmn_w32_entity_nil; process = process->next) { if(process->kind != DMN_W32_EntityKind_Process) {continue;} @@ -1345,7 +1345,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) DEBUG_EVENT evt = {0}; B32 evt_good = 0; { - B32 resume_good = 0; + B32 resume_good = 1; if(dmn_w32_shared->resume_needed) { dmn_w32_shared->resume_needed = 0; @@ -1987,7 +1987,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) { if(process->kind != DMN_W32_EntityKind_Process) { continue; } for(DMN_W32_Entity *thread = process->first; - thread != 0; + thread != &dmn_w32_entity_nil; thread = thread->next) { if(thread->kind != DMN_W32_EntityKind_Thread) { continue; } diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index b73595c3..61008dee 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -2828,7 +2828,7 @@ df_trap_net_from_thread__step_over_inst(Arena *arena, DF_Entity *thread) String8 machine_code = {0}; { Rng1U64 rng = r1u64(ip_vaddr, ip_vaddr+max_instruction_size_from_arch(arch)); - CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, rng, max_U64); + CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, rng, os_now_microseconds()+5000); machine_code = machine_code_slice.data; } @@ -2895,7 +2895,7 @@ df_trap_net_from_thread__step_over_line(Arena *arena, DF_Entity *thread) String8 machine_code = {0}; if(good_line_info) { - CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, line_vaddr_rng, max_U64); + CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, line_vaddr_rng, os_now_microseconds()+5000); machine_code = machine_code_slice.data; } @@ -3020,7 +3020,7 @@ df_trap_net_from_thread__step_into_line(Arena *arena, DF_Entity *thread) String8 machine_code = {0}; if(good_line_info) { - CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, line_vaddr_rng, max_U64); + CTRL_ProcessMemorySlice machine_code_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, line_vaddr_rng, os_now_microseconds()+5000); machine_code = machine_code_slice.data; } @@ -3579,7 +3579,7 @@ df_tls_base_vaddr_from_process_root_rip(DF_Entity *process, U64 root_vaddr, U64 //- rjf: read module's TLS index U64 tls_index = 0; { - CTRL_ProcessMemorySlice tls_index_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, tls_vaddr_range, max_U64); + CTRL_ProcessMemorySlice tls_index_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, tls_vaddr_range, os_now_microseconds()+5000); if(tls_index_slice.data.size >= addr_size) { tls_index = *(U64 *)tls_index_slice.data.str; @@ -3592,13 +3592,13 @@ df_tls_base_vaddr_from_process_root_rip(DF_Entity *process, U64 root_vaddr, U64 U64 thread_info_addr = root_vaddr; U64 tls_addr_off = tls_index*addr_size; U64 tls_addr_array = 0; - CTRL_ProcessMemorySlice tls_addr_array_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(thread_info_addr, thread_info_addr+addr_size), 0); + CTRL_ProcessMemorySlice tls_addr_array_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(thread_info_addr, thread_info_addr+addr_size), os_now_microseconds()+5000); String8 tls_addr_array_data = tls_addr_array_slice.data; if(tls_addr_array_data.size >= 8) { MemoryCopy(&tls_addr_array, tls_addr_array_data.str, sizeof(U64)); } - CTRL_ProcessMemorySlice result_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(tls_addr_array + tls_addr_off, tls_addr_array + tls_addr_off + addr_size), 0); + CTRL_ProcessMemorySlice result_slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, process->ctrl_machine_id, process->ctrl_handle, r1u64(tls_addr_array + tls_addr_off, tls_addr_array + tls_addr_off + addr_size), os_now_microseconds()+5000); String8 result_data = result_slice.data; if(result_data.size >= 8) { diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index 863b92a2..714ce9ef 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -2635,7 +2635,8 @@ ui_signal_from_box(UI_Box *box) //- rjf: mouse is over this box's rect, no other hot key? -> set hot key, mark hovering // { - if(contains_2f32(rect, ui_state->mouse) && + if(box->flags & UI_BoxFlag_MouseClickable && + contains_2f32(rect, ui_state->mouse) && !contains_2f32(blacklist_rect, ui_state->mouse) && (ui_key_match(ui_state->hot_box_key, ui_key_zero()) || ui_key_match(ui_state->hot_box_key, box->key)) && (ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], ui_key_zero()) || ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], box->key)) &&