mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-17 17:42:22 -07:00
jank reduction & flow fix pass, after all of the last month's changes
This commit is contained in:
+27
-19
@@ -1313,6 +1313,7 @@ ctrl_calc_hash_store_key_from_process_vaddr_range(CTRL_Handle process, Rng1U64 r
|
||||
internal U128
|
||||
ctrl_stored_hash_from_process_vaddr_range(CTRL_Handle process, Rng1U64 range, B32 zero_terminated, B32 *out_is_stale, U64 endt_us)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
U128 result = {0};
|
||||
U64 size = dim_1u64(range);
|
||||
U64 pre_mem_gen = dmn_mem_gen();
|
||||
@@ -1465,6 +1466,7 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_Handle process, Rng1U64 range, B3
|
||||
{
|
||||
out_is_stale[0] = 1;
|
||||
}
|
||||
ProfEnd();
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -1483,6 +1485,7 @@ ctrl_hash_store_key_from_process_vaddr_range(CTRL_Handle process, Rng1U64 range,
|
||||
internal CTRL_ProcessMemorySlice
|
||||
ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_Handle process, Rng1U64 range, U64 endt_us)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
CTRL_ProcessMemorySlice result = {0};
|
||||
if(range.max > range.min &&
|
||||
dim_1u64(range) <= MB(256) &&
|
||||
@@ -1501,16 +1504,19 @@ ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_Handle proces
|
||||
U128 *page_last_hashes = push_array(scratch.arena, U128, page_count);
|
||||
|
||||
//- rjf: gather hashes & last-hashes for each page
|
||||
for(U64 page_idx = 0; page_idx < page_count; page_idx += 1)
|
||||
ProfScope("gather hashes & last-hashes for each page")
|
||||
{
|
||||
U64 page_base_vaddr = page_range.min + page_idx*page_size;
|
||||
U128 page_key = ctrl_calc_hash_store_key_from_process_vaddr_range(process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0);
|
||||
B32 page_is_stale = 0;
|
||||
U128 page_hash = ctrl_stored_hash_from_process_vaddr_range(process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0, &page_is_stale, endt_us);
|
||||
U128 page_last_hash = hs_hash_from_key(page_key, 1);
|
||||
result.stale = (result.stale || page_is_stale);
|
||||
page_hashes[page_idx] = page_hash;
|
||||
page_last_hashes[page_idx] = page_last_hash;
|
||||
for(U64 page_idx = 0; page_idx < page_count; page_idx += 1)
|
||||
{
|
||||
U64 page_base_vaddr = page_range.min + page_idx*page_size;
|
||||
U128 page_key = ctrl_calc_hash_store_key_from_process_vaddr_range(process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0);
|
||||
B32 page_is_stale = 0;
|
||||
U128 page_hash = ctrl_stored_hash_from_process_vaddr_range(process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0, &page_is_stale, endt_us);
|
||||
U128 page_last_hash = hs_hash_from_key(page_key, 1);
|
||||
result.stale = (result.stale || page_is_stale);
|
||||
page_hashes[page_idx] = page_hash;
|
||||
page_last_hashes[page_idx] = page_last_hash;
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: setup output buffers
|
||||
@@ -1519,6 +1525,7 @@ ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_Handle proces
|
||||
U64 *byte_changed_flags = push_array(arena, U64, (dim_1u64(range)+63)/64);
|
||||
|
||||
//- rjf: iterate pages, fill output
|
||||
ProfScope("iterate pages, fill output")
|
||||
{
|
||||
U64 write_off = 0;
|
||||
for(U64 page_idx = 0; page_idx < page_count; page_idx += 1)
|
||||
@@ -1543,23 +1550,22 @@ ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_Handle proces
|
||||
|
||||
// rjf; if this page's data doesn't fill the entire range, mark
|
||||
// missing bytes as bad
|
||||
if(data.size < page_size)
|
||||
if(data.size < page_size) ProfScope("mark missing bytes as bad")
|
||||
{
|
||||
for(U64 invalid_vaddr = data_vaddr_range.min+data.size;
|
||||
invalid_vaddr < data_vaddr_range.min + page_size;
|
||||
Rng1U64 invalid_range = r1u64(data_vaddr_range.min+data.size, data_vaddr_range.min + page_size);
|
||||
Rng1U64 in_range_invalid_range = intersect_1u64(invalid_range, range);
|
||||
for(U64 invalid_vaddr = in_range_invalid_range.min;
|
||||
invalid_vaddr < in_range_invalid_range.max;
|
||||
invalid_vaddr += 1)
|
||||
{
|
||||
if(contains_1u64(range, invalid_vaddr))
|
||||
{
|
||||
U64 idx_in_range = invalid_vaddr-range.min;
|
||||
byte_bad_flags[idx_in_range/64] |= (1ull<<(idx_in_range%64));
|
||||
}
|
||||
U64 idx_in_range = invalid_vaddr - range.min;
|
||||
byte_bad_flags[idx_in_range/64] |= (1ull<<(idx_in_range%64));
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: if this page's hash & last_hash don't match, diff each byte &
|
||||
// fill out changed flags
|
||||
if(!u128_match(page_hashes[page_idx], page_last_hashes[page_idx]))
|
||||
if(!u128_match(page_hashes[page_idx], page_last_hashes[page_idx])) ProfScope("hashes don't match; diff each byte")
|
||||
{
|
||||
String8 last_data = hs_data_from_hash(scope, page_last_hashes[page_idx]);
|
||||
String8 in_range_last_data = last_data;
|
||||
@@ -1616,6 +1622,7 @@ ctrl_query_cached_data_from_process_vaddr_range(Arena *arena, CTRL_Handle proces
|
||||
hs_scope_close(scope);
|
||||
scratch_end(scratch);
|
||||
}
|
||||
ProfEnd();
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -5602,7 +5609,8 @@ ctrl_mem_stream_thread__entry_point(void *p)
|
||||
range_base = push_array_no_zero(range_arena, U8, range_size);
|
||||
U64 bytes_read = 0;
|
||||
U64 retry_count = 0;
|
||||
for(Rng1U64 vaddr_range_clamped_retry = vaddr_range_clamped; retry_count < 64; retry_count += 1)
|
||||
U64 retry_limit = (zero_terminated ? 64 : 0);
|
||||
for(Rng1U64 vaddr_range_clamped_retry = vaddr_range_clamped; retry_count <= retry_limit; retry_count += 1)
|
||||
{
|
||||
bytes_read = dmn_process_read(process.dmn_handle, vaddr_range_clamped_retry, range_base);
|
||||
if(bytes_read == 0 && vaddr_range_clamped_retry.max > vaddr_range_clamped_retry.min)
|
||||
|
||||
@@ -1661,6 +1661,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P
|
||||
switch(event->cause)
|
||||
{
|
||||
default:{}break;
|
||||
case CTRL_EventCause_InterruptedByHalt:{cause = D_EventCause_Halt;}break;
|
||||
case CTRL_EventCause_UserBreakpoint:{cause = D_EventCause_UserBreakpoint;}break;
|
||||
}
|
||||
D_EventNode *n = push_array(arena, D_EventNode, 1);
|
||||
|
||||
@@ -71,6 +71,7 @@ typedef enum D_EventCause
|
||||
{
|
||||
D_EventCause_Null,
|
||||
D_EventCause_UserBreakpoint,
|
||||
D_EventCause_Halt,
|
||||
D_EventCause_COUNT
|
||||
}
|
||||
D_EventCause;
|
||||
|
||||
+6
-5
@@ -535,18 +535,19 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
|
||||
E_Type *type = e_type_from_key(scratch.arena, check_type_key);
|
||||
if(type->enum_vals != 0)
|
||||
{
|
||||
String8 lookup_string = exprr->string;
|
||||
String8 lookup_string_append_1 = push_str8f(scratch.arena, "%S_%S", type->name, lookup_string);
|
||||
String8 lookup_string_append_2 = push_str8f(scratch.arena, "%S%S", type->name, lookup_string);
|
||||
E_EnumVal *enum_val_match = 0;
|
||||
for EachIndex(idx, type->count)
|
||||
{
|
||||
if(str8_match(type->enum_vals[idx].name, exprr->string, 0))
|
||||
if(str8_match(type->enum_vals[idx].name, lookup_string, 0) ||
|
||||
str8_match(type->enum_vals[idx].name, lookup_string_append_1, 0) ||
|
||||
str8_match(type->enum_vals[idx].name, lookup_string_append_2, 0))
|
||||
{
|
||||
enum_val_match = &type->enum_vals[idx];
|
||||
break;
|
||||
}
|
||||
else if(str8_match(type->enum_vals[idx].name, exprr->string, StringMatchFlag_CaseInsensitive))
|
||||
{
|
||||
enum_val_match = &type->enum_vals[idx];
|
||||
}
|
||||
}
|
||||
if(enum_val_match != 0)
|
||||
{
|
||||
|
||||
@@ -271,6 +271,7 @@ hs_hash_from_key(U128 key, U64 rewind_count)
|
||||
internal String8
|
||||
hs_data_from_hash(HS_Scope *scope, U128 hash)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
String8 result = {0};
|
||||
U64 slot_idx = hash.u64[1]%hs_shared->slots_count;
|
||||
U64 stripe_idx = slot_idx%hs_shared->stripes_count;
|
||||
@@ -288,6 +289,7 @@ hs_data_from_hash(HS_Scope *scope, U128 hash)
|
||||
}
|
||||
}
|
||||
}
|
||||
ProfEnd();
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
+111
-12
@@ -2416,7 +2416,7 @@ rd_commit_eval_value_string(E_Eval dst_eval, String8 string)
|
||||
if(type_kind == E_TypeKind_Ptr &&
|
||||
(e_type_kind_is_pointer_or_ref(src_eval_value_type_kind) ||
|
||||
e_type_kind_is_integer(src_eval_value_type_kind)) &&
|
||||
src_eval_value.value.u64 != 0 && src_eval_value.mode == E_Mode_Value)
|
||||
src_eval_value.mode == E_Mode_Value)
|
||||
{
|
||||
commit_data = push_str8_copy(scratch.arena, str8_struct(&src_eval.value));
|
||||
commit_data.size = Min(commit_data.size, e_type_byte_size_from_key(type_key));
|
||||
@@ -3443,10 +3443,13 @@ rd_window_frame(RD_Window *ws)
|
||||
// rjf: unwind
|
||||
if(ctrl_entity->kind == CTRL_EntityKind_Thread)
|
||||
{
|
||||
ui_spacer(ui_em(1.5f, 1.f));
|
||||
CTRL_Entity *process = ctrl_entity_ancestor_from_kind(ctrl_entity, CTRL_EntityKind_Process);
|
||||
CTRL_Unwind base_unwind = d_query_cached_unwind_from_thread(ctrl_entity);
|
||||
D_Unwind rich_unwind = d_unwind_from_ctrl_unwind(scratch.arena, di_scope, process, &base_unwind);
|
||||
if(rich_unwind.frames.concrete_frame_count != 0)
|
||||
{
|
||||
ui_spacer(ui_em(1.5f, 1.f));
|
||||
}
|
||||
for(U64 idx = 0; idx < rich_unwind.frames.concrete_frame_count; idx += 1)
|
||||
{
|
||||
D_UnwindFrame *f = &rich_unwind.frames.v[idx];
|
||||
@@ -4717,6 +4720,86 @@ rd_window_frame(RD_Window *ws)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: gather files
|
||||
if(0)
|
||||
{
|
||||
if(ws->autocomp_lister_params.flags & RD_AutoCompListerFlag_Files)
|
||||
{
|
||||
// rjf: find containing directory in query
|
||||
String8 dir_str_in_input = {0};
|
||||
for(U64 i = 0; i < query.size; i += 1)
|
||||
{
|
||||
String8 substr1 = str8_substr(query, r1u64(i, i+1));
|
||||
String8 substr2 = str8_substr(query, r1u64(i, i+2));
|
||||
String8 substr3 = str8_substr(query, r1u64(i, i+3));
|
||||
if(str8_match(substr1, str8_lit("/"), StringMatchFlag_SlashInsensitive))
|
||||
{
|
||||
dir_str_in_input = str8_substr(query, r1u64(i, query.size));
|
||||
}
|
||||
else if(i != 0 && str8_match(substr2, str8_lit(":/"), StringMatchFlag_SlashInsensitive))
|
||||
{
|
||||
dir_str_in_input = str8_substr(query, r1u64(i-1, query.size));
|
||||
}
|
||||
else if(str8_match(substr2, str8_lit("./"), StringMatchFlag_SlashInsensitive))
|
||||
{
|
||||
dir_str_in_input = str8_substr(query, r1u64(i, query.size));
|
||||
}
|
||||
else if(str8_match(substr3, str8_lit("../"), StringMatchFlag_SlashInsensitive))
|
||||
{
|
||||
dir_str_in_input = str8_substr(query, r1u64(i, query.size));
|
||||
}
|
||||
if(dir_str_in_input.size != 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: use query string to form various parts of search space
|
||||
String8 prefix = {0};
|
||||
String8 path = {0};
|
||||
String8 search = {0};
|
||||
if(dir_str_in_input.size != 0)
|
||||
{
|
||||
String8 dir = dir_str_in_input;
|
||||
String8 search = {0};
|
||||
U64 one_past_last_slash = dir.size;
|
||||
for(U64 i = 0; i < dir_str_in_input.size; i += 1)
|
||||
{
|
||||
if(dir_str_in_input.str[i] == '/' || dir_str_in_input.str[i] == '\\')
|
||||
{
|
||||
one_past_last_slash = i+1;
|
||||
}
|
||||
}
|
||||
dir.size = one_past_last_slash;
|
||||
search = str8_substr(dir_str_in_input, r1u64(one_past_last_slash, dir_str_in_input.size));
|
||||
path = dir;
|
||||
search = search;
|
||||
prefix = str8_substr(query, r1u64(0, path.str - query.str));
|
||||
}
|
||||
|
||||
// rjf: get current files, filtered
|
||||
B32 dir_selection = 1;
|
||||
OS_FileIter *it = os_file_iter_begin(scratch.arena, path, 0);
|
||||
for(OS_FileInfo info = {0}; os_file_iter_next(scratch.arena, it, &info);)
|
||||
{
|
||||
FuzzyMatchRangeList match_ranges = fuzzy_match_find(scratch.arena, search, info.name);
|
||||
B32 fits_search = (search.size == 0 || match_ranges.count == match_ranges.needle_part_count);
|
||||
B32 fits_dir_only = !!(info.props.flags & FilePropertyFlag_IsFolder) || !dir_selection;
|
||||
if(fits_search && fits_dir_only)
|
||||
{
|
||||
RD_AutoCompListerItem item = {0};
|
||||
{
|
||||
item.string = info.name;
|
||||
item.kind_string = str8_lit("File");
|
||||
item.matches = match_ranges;
|
||||
}
|
||||
rd_autocomp_lister_item_chunk_list_push(scratch.arena, &item_list, 256, &item);
|
||||
}
|
||||
}
|
||||
os_file_iter_end(it);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: lister item list -> sorted array
|
||||
@@ -5297,7 +5380,7 @@ rd_window_frame(RD_Window *ws)
|
||||
RD_EntityList processes = rd_query_cached_entity_list_with_kind(RD_EntityKind_Process);
|
||||
B32 have_targets = targets.count != 0;
|
||||
B32 can_send_signal = !d_ctrl_targets_running();
|
||||
B32 can_play = (have_targets && (can_send_signal || d_ctrl_last_run_frame_idx()+4 > rd_state->frame_index));
|
||||
B32 can_play = (have_targets && (can_send_signal || d_ctrl_last_run_frame_idx()+4 > d_frame_index()));
|
||||
B32 can_pause = (!can_send_signal);
|
||||
B32 can_stop = (processes.count != 0);
|
||||
B32 can_step = (processes.count != 0 && can_send_signal);
|
||||
@@ -5619,7 +5702,7 @@ rd_window_frame(RD_Window *ws)
|
||||
//
|
||||
ProfScope("build bottom bar")
|
||||
{
|
||||
B32 is_running = d_ctrl_targets_running() && d_ctrl_last_run_frame_idx() < rd_state->frame_index;
|
||||
B32 is_running = d_ctrl_targets_running() && d_ctrl_last_run_frame_idx() < d_frame_index();
|
||||
CTRL_Event stop_event = d_ctrl_last_stop_event();
|
||||
UI_Palette *positive_scheme = rd_palette_from_code(RD_PaletteCode_PositivePopButton);
|
||||
UI_Palette *running_scheme = rd_palette_from_code(RD_PaletteCode_NeutralPopButton);
|
||||
@@ -11025,6 +11108,7 @@ rd_frame(void)
|
||||
//////////////////////////////
|
||||
//- rjf: loop - consume events in core, tick engine, and repeat
|
||||
//
|
||||
CTRL_Handle find_thread_retry = {0};
|
||||
for(U64 cmd_process_loop_idx = 0; cmd_process_loop_idx < 3; cmd_process_loop_idx += 1)
|
||||
{
|
||||
////////////////////////////
|
||||
@@ -13703,10 +13787,9 @@ rd_frame(void)
|
||||
}
|
||||
|
||||
// rjf: retry on stopped, pending debug info
|
||||
// TODO(rjf): CANNOT RETRY IN THIS WAY, NEED TO DEFER TO NEXT FRAME
|
||||
if(!d_ctrl_targets_running() && (dbgi_pending || missing_rip))
|
||||
{
|
||||
rd_cmd(RD_CmdKind_FindThread, .thread = thread->handle);
|
||||
find_thread_retry = thread->handle;
|
||||
}
|
||||
}
|
||||
di_scope_close(scope);
|
||||
@@ -14678,7 +14761,7 @@ rd_frame(void)
|
||||
rd_state->base_regs.v.module = module->handle;
|
||||
rd_state->base_regs.v.process = process->handle;
|
||||
rd_state->base_regs.v.machine = machine->handle;
|
||||
rd_cmd(RD_CmdKind_FindThread, .thread = thread->handle);
|
||||
rd_cmd(RD_CmdKind_FindThread, .thread = thread->handle, .unwind_count = 0, .inline_depth = 0);
|
||||
}break;
|
||||
case RD_CmdKind_SelectUnwind:
|
||||
{
|
||||
@@ -14700,7 +14783,7 @@ rd_frame(void)
|
||||
rd_state->base_regs.v.inline_depth = rd_regs()->inline_depth;
|
||||
}
|
||||
}
|
||||
rd_cmd(RD_CmdKind_FindThread, .thread = thread->handle);
|
||||
rd_cmd(RD_CmdKind_FindThread, .thread = thread->handle, .unwind_count = rd_state->base_regs.v.unwind_count, .inline_depth = rd_state->base_regs.v.inline_depth);
|
||||
di_scope_close(di_scope);
|
||||
}break;
|
||||
case RD_CmdKind_UpOneFrame:
|
||||
@@ -15302,19 +15385,27 @@ rd_frame(void)
|
||||
CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr);
|
||||
DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);
|
||||
U64 voff = ctrl_voff_from_vaddr(module, vaddr);
|
||||
U64 test_cached_vaddr = ctrl_query_cached_rip_from_thread(d_state->ctrl_entity_store, thread->handle);
|
||||
|
||||
// rjf: valid stop thread? -> select & snap
|
||||
if(thread != &ctrl_entity_nil)
|
||||
if(thread != &ctrl_entity_nil && evt->cause != D_EventCause_Halt)
|
||||
{
|
||||
rd_cmd(RD_CmdKind_SelectThread, .thread = thread->handle);
|
||||
rd_cmd(RD_CmdKind_FindThread, .thread = thread->handle);
|
||||
}
|
||||
|
||||
// rjf: no stop-causing thread, but have selected thread? -> snap to selected
|
||||
CTRL_Entity *selected_thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_base_regs()->thread);
|
||||
if(thread == &ctrl_entity_nil && selected_thread != &ctrl_entity_nil)
|
||||
if((evt->cause == D_EventCause_Halt || thread == &ctrl_entity_nil) && selected_thread != &ctrl_entity_nil)
|
||||
{
|
||||
rd_cmd(RD_CmdKind_FindThread);
|
||||
rd_cmd(RD_CmdKind_SelectThread, .thread = selected_thread->handle);
|
||||
}
|
||||
|
||||
// rjf: no stop-causing thread, but don't have selected thread? -> snap to first available thread
|
||||
if(thread == &ctrl_entity_nil && selected_thread == &ctrl_entity_nil)
|
||||
{
|
||||
CTRL_EntityList threads = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Thread);
|
||||
CTRL_Entity *first_available_thread = ctrl_entity_list_first(&threads);
|
||||
rd_cmd(RD_CmdKind_SelectThread, .thread = first_available_thread->handle);
|
||||
}
|
||||
|
||||
// rjf: increment breakpoint hit counts
|
||||
@@ -15389,6 +15480,14 @@ rd_frame(void)
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////
|
||||
//- rjf: retry find-thread
|
||||
//
|
||||
if(!ctrl_handle_match(ctrl_handle_zero(), find_thread_retry))
|
||||
{
|
||||
rd_cmd(RD_CmdKind_FindThread, .thread = find_thread_retry);
|
||||
}
|
||||
|
||||
//////////////////////////////
|
||||
//- rjf: animate confirmation
|
||||
//
|
||||
|
||||
@@ -585,6 +585,7 @@ enum
|
||||
RD_AutoCompListerFlag_Languages = (1<<9),
|
||||
RD_AutoCompListerFlag_Architectures = (1<<10),
|
||||
RD_AutoCompListerFlag_Tex2DFormats = (1<<11),
|
||||
RD_AutoCompListerFlag_Files = (1<<12),
|
||||
};
|
||||
|
||||
typedef struct RD_AutoCompListerItem RD_AutoCompListerItem;
|
||||
|
||||
@@ -2745,7 +2745,8 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
|
||||
RD_AutoCompListerFlag_Procedures|
|
||||
RD_AutoCompListerFlag_Globals|
|
||||
RD_AutoCompListerFlag_ThreadLocals|
|
||||
RD_AutoCompListerFlag_Types);
|
||||
RD_AutoCompListerFlag_Types|
|
||||
RD_AutoCompListerFlag_Files);
|
||||
if(row->member != 0 && row->member->inheritance_key_chain.first != 0)
|
||||
{
|
||||
String8List inheritance_chain_type_names = {0};
|
||||
@@ -2799,7 +2800,8 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
|
||||
RD_AutoCompListerFlag_Procedures|
|
||||
RD_AutoCompListerFlag_Globals|
|
||||
RD_AutoCompListerFlag_ThreadLocals|
|
||||
RD_AutoCompListerFlag_Types);
|
||||
RD_AutoCompListerFlag_Types|
|
||||
RD_AutoCompListerFlag_Files);
|
||||
if(ui_view_rule_info->flags & RD_ViewRuleInfoFlag_CanFillValueCell)
|
||||
{
|
||||
cell_ui_hook = ui_view_rule_info->ui;
|
||||
|
||||
@@ -984,7 +984,9 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
|
||||
CTRL_Entity *selected_thread_process = ctrl_entity_ancestor_from_kind(selected_thread, CTRL_EntityKind_Process);
|
||||
U64 selected_thread_rip_unwind_vaddr = d_query_cached_rip_from_thread_unwind(selected_thread, rd_regs()->unwind_count);
|
||||
CTRL_Entity *selected_thread_module = ctrl_module_from_process_vaddr(selected_thread_process, selected_thread_rip_unwind_vaddr);
|
||||
F32 selected_thread_module_alive_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "###module_alive_t_%p", selected_thread_module), 1.f);
|
||||
F32 selected_thread_alive_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "###selected_thread_alive_t_%p", selected_thread), 1.f);
|
||||
F32 selected_thread_module_alive_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "###selected_thread_module_alive_t_%p", selected_thread_module), 1.f);
|
||||
F32 selected_thread_arch_alive_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "###selected_thread_arch_alive_t_%i", selected_thread->arch), 1.f);
|
||||
CTRL_Event stop_event = d_ctrl_last_stop_event();
|
||||
CTRL_Entity *stopper_thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, stop_event.entity);
|
||||
B32 is_focused = ui_is_focus_active();
|
||||
@@ -1104,7 +1106,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
|
||||
{
|
||||
color = rd_rgba_from_theme_color(RD_ThemeColor_ThreadError);
|
||||
}
|
||||
if(d_ctrl_targets_running() && d_ctrl_last_run_frame_idx() < rd_state->frame_index)
|
||||
if(d_ctrl_targets_running() && d_ctrl_last_run_frame_idx() < d_frame_index())
|
||||
{
|
||||
color.w *= 0.5f;
|
||||
}
|
||||
@@ -1252,7 +1254,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
|
||||
{
|
||||
color = rd_rgba_from_theme_color(RD_ThemeColor_ThreadError);
|
||||
}
|
||||
if(d_ctrl_targets_running() && d_ctrl_last_run_frame_idx() < rd_state->frame_index)
|
||||
if(d_ctrl_targets_running() && d_ctrl_last_run_frame_idx() < d_frame_index())
|
||||
{
|
||||
color.w *= 0.5f;
|
||||
}
|
||||
@@ -1516,7 +1518,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
|
||||
{
|
||||
U64 best_stamp = 0;
|
||||
S64 line_info_line_num = 0;
|
||||
F32 line_info_t = selected_thread_module_alive_t;
|
||||
F32 line_info_t = 0;
|
||||
D_LineList *lines = ¶ms->line_infos[line_idx];
|
||||
for(D_LineNode *n = lines->first; n != 0; n = n->next)
|
||||
{
|
||||
@@ -1525,6 +1527,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
|
||||
has_line_info = (n->v.pt.line == line_num || params->line_vaddrs[line_idx] != 0);
|
||||
line_info_line_num = n->v.pt.line;
|
||||
best_stamp = n->v.dbgi_key.min_timestamp;
|
||||
line_info_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "dbgi_alive_t_%S", n->v.dbgi_key.path), 1.f);
|
||||
}
|
||||
}
|
||||
if(has_line_info)
|
||||
@@ -2145,6 +2148,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
|
||||
for(DI_KeyNode *n = params->relevant_dbgi_keys.first; n != 0; n = n->next)
|
||||
{
|
||||
DI_Key dbgi_key = n->v;
|
||||
UI_Key dbgi_anim_key = ui_key_from_stringf(ui_key_zero(), "###dbgi_alive_t_%S", dbgi_key.path);
|
||||
if(!mapped_special && token->kind == TXT_TokenKind_Identifier)
|
||||
{
|
||||
U64 voff = d_voff_from_dbgi_key_symbol_name(&dbgi_key, token_string);
|
||||
@@ -2152,7 +2156,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
|
||||
{
|
||||
mapped_special = 1;
|
||||
new_color_kind = RD_ThemeColor_CodeSymbol;
|
||||
mix_t = selected_thread_module_alive_t;
|
||||
mix_t = ui_anim(dbgi_anim_key, 1.f);
|
||||
}
|
||||
}
|
||||
if(!mapped_special && token->kind == TXT_TokenKind_Identifier)
|
||||
@@ -2162,7 +2166,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
|
||||
{
|
||||
mapped_special = 1;
|
||||
new_color_kind = RD_ThemeColor_CodeType;
|
||||
mix_t = selected_thread_module_alive_t;
|
||||
mix_t = ui_anim(dbgi_anim_key, 1.f);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -2194,7 +2198,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
|
||||
{
|
||||
mapped_special = 1;
|
||||
new_color_kind = RD_ThemeColor_CodeRegister;
|
||||
mix_t = selected_thread_module_alive_t;
|
||||
mix_t = selected_thread_arch_alive_t;
|
||||
}
|
||||
}
|
||||
if(!mapped_special)
|
||||
@@ -2204,7 +2208,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
|
||||
{
|
||||
mapped_special = 1;
|
||||
new_color_kind = RD_ThemeColor_CodeRegister;
|
||||
mix_t = selected_thread_module_alive_t;
|
||||
mix_t = selected_thread_arch_alive_t;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user