diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 10cbdf3f..b15404ae 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -801,6 +801,7 @@ ctrl_entity_release(CTRL_EntityStore *store, CTRL_Entity *entity) // rjf: dec counter store->entity_kind_counts[t->e->kind] -= 1; + store->entity_kind_alloc_gens[t->e->kind] += 1; } scratch_end(scratch); } @@ -4190,7 +4191,8 @@ ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) { done = 1; } - if(event->kind == DMN_EventKind_Halt) + if(event->kind == DMN_EventKind_Null || + event->kind == DMN_EventKind_Error) { done = 1; } diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index 8d7f1769..7b1dbd8c 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -3939,6 +3939,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints) d_state->frame_eval_memread_endt_us = os_now_microseconds() + 5000; d_state->top_regs = &d_state->base_regs; d_regs_copy_contents(d_frame_arena(), &d_state->top_regs->v, &d_state->top_regs->v); + B32 ctrl_running_pre_tick = d_state->ctrl_is_running; ////////////////////////////// //- rjf: sync with ctrl thread @@ -5074,7 +5075,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints) ctrl_msg_list_concat_in_place(&d_state->ctrl_msgs, &msgs_copy); if(d_state->ctrl_msgs.count != 0) { - if(!d_state->ctrl_soft_halt_issued && d_state->ctrl_is_running) + if(!d_state->ctrl_soft_halt_issued && ctrl_running_pre_tick) { d_state->ctrl_soft_halt_issued = 1; ctrl_halt(); diff --git a/src/dbg_frontend/dbg_frontend_core.c b/src/dbg_frontend/dbg_frontend_core.c index cc978981..ccf5451b 100644 --- a/src/dbg_frontend/dbg_frontend_core.c +++ b/src/dbg_frontend/dbg_frontend_core.c @@ -12215,6 +12215,27 @@ df_frame(void) // D_EventList engine_events = d_tick(scratch.arena, &targets, &breakpoints); + ////////////////////////////// + //- rjf: no selected thread? -> try to snap to any existing thread + // + if(ctrl_entity_from_handle(d_state->ctrl_entity_store, df_base_regs()->thread) == &ctrl_entity_nil) + { + CTRL_Entity *process = ctrl_entity_from_handle(d_state->ctrl_entity_store, df_base_regs()->process); + if(process == &ctrl_entity_nil) + { + CTRL_EntityList all_processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + if(all_processes.count != 0) + { + process = all_processes.first->v; + } + } + CTRL_Entity *new_thread = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Thread); + if(new_thread != &ctrl_entity_nil) + { + df_cmd(DF_CmdKind_SelectThread, .thread = new_thread->handle); + } + } + ////////////////////////////// //- rjf: process debug engine events //