demon/linux: launching events/entity builds; access synchronization

This commit is contained in:
Ryan Fleury
2025-07-17 14:31:57 -07:00
parent 0610d5ae13
commit 2db6b826a1
2 changed files with 75 additions and 1 deletions
+66 -1
View File
@@ -479,6 +479,7 @@ dmn_init(void)
dmn_lnx_state->entities_arena = arena_alloc(.reserve_size = GB(32), .commit_size = KB(64), .flags = ArenaFlag_NoChain);
dmn_lnx_state->entities_base = push_array(dmn_lnx_state->entities_arena, DMN_LNX_Entity, 0);
dmn_lnx_state->root_entity = dmn_lnx_entity_alloc(&dmn_lnx_nil_entity, DMN_LNX_EntityKind_Root);
dmn_lnx_state->access_mutex = os_mutex_alloc();
}
////////////////////////////////
@@ -488,17 +489,26 @@ internal DMN_CtrlCtx *
dmn_ctrl_begin(void)
{
DMN_CtrlCtx *ctx = (DMN_CtrlCtx *)1;
dmn_lnx_ctrl_thread = 1;
return ctx;
}
internal void
dmn_ctrl_exclusive_access_begin(void)
{
OS_MutexScope(dmn_lnx_state->access_mutex)
{
dmn_lnx_state->access_run_state = 1;
}
}
internal void
dmn_ctrl_exclusive_access_end(void)
{
OS_MutexScope(dmn_lnx_state->access_mutex)
{
dmn_lnx_state->access_run_state = 1;
}
}
internal U32
@@ -633,16 +643,57 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params)
//- rjf: build initial process/thread/modules entities
DMN_LNX_Entity *process = &dmn_lnx_nil_entity;
DMN_LNX_Entity *main_thread = &dmn_lnx_nil_entity;
{
// rjf: build process
process = dmn_lnx_entity_alloc(dmn_lnx_state->root_entity, DMN_LNX_EntityKind_Process);
process->arch = dmn_lnx_arch_from_pid(pid);
process->id = pid;
process->fd = open((char*)str8f(scratch.arena, "/proc/%d/mem", pid).str, O_RDWR);
{
DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events);
e->kind = DMN_EventKind_CreateProcess;
e->process = dmn_lnx_handle_from_entity(process);
}
// rjf: build thread
{
DMN_LNX_Entity *thread = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Thread);
thread->id = pid;
thread->arch = process->arch;
{
DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events);
e->kind = DMN_EventKind_CreateThread;
e->process = dmn_lnx_handle_from_entity(process);
e->thread = dmn_lnx_handle_from_entity(thread);
}
main_thread = thread;
}
// rjf: gather all process module infos
DMN_LNX_ModuleInfoList module_infos = dmn_lnx_module_info_list_from_process(scratch.arena, process);
for(DMN_LNX_ModuleInfoNode *n = module_infos.first; n != 0; n = n->next)
{
DMN_LNX_Entity *module = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Module);
module->id = n->v.name;
{
DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events);
e->kind = DMN_EventKind_LoadModule;
e->process = dmn_lnx_handle_from_entity(process);
e->thread = dmn_lnx_handle_from_entity(main_thread);
e->module = dmn_lnx_handle_from_entity(module);
e->address = n->v.vaddr_range.min;
e->size = dim_1u64(n->v.vaddr_range);
}
}
// rjf: handshake event
{
DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events);
e->kind = DMN_EventKind_HandshakeComplete;
e->process = dmn_lnx_handle_from_entity(process);
e->thread = dmn_lnx_handle_from_entity(main_thread);
}
}
}break;
}
@@ -707,12 +758,26 @@ dmn_halt(U64 code, U64 user_data)
internal B32
dmn_access_open(void)
{
return 0;
B32 result = 0;
if(dmn_lnx_ctrl_thread)
{
result = 1;
}
else
{
os_mutex_take(dmn_lnx_state->access_mutex);
result = !dmn_lnx_state->access_run_state;
}
return result;
}
internal void
dmn_access_close(void)
{
if(!dmn_lnx_ctrl_thread)
{
os_mutex_drop(dmn_lnx_state->access_mutex);
}
}
//- rjf: processes
+9
View File
@@ -87,8 +87,16 @@ typedef struct DMN_LNX_State DMN_LNX_State;
struct DMN_LNX_State
{
Arena *arena;
// rjf: access locking mechanism
OS_Handle access_mutex;
B32 access_run_state;
// rjf: deferred events
Arena *deferred_events_arena;
DMN_EventList deferred_events;
// rjf: entity storage
Arena *entities_arena;
DMN_LNX_Entity *entities_base;
U64 entities_count;
@@ -98,6 +106,7 @@ struct DMN_LNX_State
read_only global DMN_LNX_Entity dmn_lnx_nil_entity = {&dmn_lnx_nil_entity, &dmn_lnx_nil_entity, &dmn_lnx_nil_entity, &dmn_lnx_nil_entity, &dmn_lnx_nil_entity};
global DMN_LNX_State *dmn_lnx_state = 0;
thread_static B32 dmn_lnx_ctrl_thread = 0;
////////////////////////////////
//~ rjf: Helpers