From a694a77eba10490389f2be835c9ffd991ad6c300 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 21 Mar 2024 16:49:34 -0700 Subject: [PATCH] fix halting, unattached running, and caching generations in demon2 --- src/demon2/win32/demon2_core_win32.c | 34 +++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/demon2/win32/demon2_core_win32.c b/src/demon2/win32/demon2_core_win32.c index 6dc81a1d..aa37f3f3 100644 --- a/src/demon2/win32/demon2_core_win32.c +++ b/src/demon2/win32/demon2_core_win32.c @@ -1144,6 +1144,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) // typedef enum DMN_W32_EventGenPath { + DMN_W32_EventGenPath_NotAttached, DMN_W32_EventGenPath_Run, DMN_W32_EventGenPath_DetachProcesses, } @@ -1153,12 +1154,41 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) { event_gen_path = DMN_W32_EventGenPath_DetachProcesses; } + else + { + B32 any_processes_live = dmn_w32_shared->new_process_pending; + if(!any_processes_live) + { + for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first; process != &dmn_w32_entity_nil; process = process->next) + { + if(process->kind == DMN_W32_EntityKind_Process) + { + any_processes_live = 1; + break; + } + } + } + if(!any_processes_live) + { + event_gen_path = DMN_W32_EventGenPath_NotAttached; + } + } ////////////////////////////// //- rjf: produce debug events // switch(event_gen_path) { + //////////////////////////// + //- rjf: produce not-attached error events + // + case DMN_W32_EventGenPath_NotAttached: + { + DMN_Event *e = dmn_event_list_push(arena, &events); + e->kind = DMN_EventKind_Error; + e->error_kind = DMN_ErrorKind_NotAttached; + }break; + //////////////////////////// //- rjf: produce debug events from regular running // @@ -1394,6 +1424,8 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) dmn_w32_shared->resume_tid = evt.dwThreadId; } ins_atomic_u64_inc_eval(&dmn_w32_shared->run_gen); + ins_atomic_u64_inc_eval(&dmn_w32_shared->mem_gen); + ins_atomic_u64_inc_eval(&dmn_w32_shared->reg_gen); } } @@ -2166,7 +2198,7 @@ dmn_run(Arena *arena, DMN_RunCtrls *ctrls) internal void dmn_halt(U64 code, U64 user_data) { - if(!dmn_handle_match(dmn_handle_zero(), dmn_w32_shared->halter_process)) + if(dmn_handle_match(dmn_handle_zero(), dmn_w32_shared->halter_process)) { DMN_W32_Entity *process = &dmn_w32_entity_nil; for(DMN_W32_Entity *entity = dmn_w32_shared->entities_base->first;