diff --git a/src/dbg_info/dbg_info.c b/src/dbg_info/dbg_info.c index 9f5f9c39..a259646e 100644 --- a/src/dbg_info/dbg_info.c +++ b/src/dbg_info/dbg_info.c @@ -96,6 +96,8 @@ di_init(CmdLine *cmdline) di_shared->conversion_completion_shared_memory_base = (U64 *)os_shared_memory_view_open(di_shared->conversion_completion_shared_memory, r1u64(0, KB(4))); di_shared->completion_mutex = mutex_alloc(); di_shared->completion_arena = arena_alloc(); + di_shared->event_mutex = mutex_alloc(); + di_shared->event_arena = arena_alloc(); } //////////////////////////////// @@ -486,6 +488,29 @@ di_rdi_from_key(Access *access, DI_Key key, B32 high_priority, U64 endt_us) return rdi; } +//////////////////////////////// +//~ rjf: Events + +internal DI_EventList +di_get_events(Arena *arena) +{ + DI_EventList dst = {0}; + MutexScope(di_shared->event_mutex) + { + for EachNode(src_n, DI_EventNode, di_shared->events.first) + { + DI_EventNode *dst_n = push_array(arena, DI_EventNode, 1); + MemoryCopyStruct(&dst_n->v, &src_n->v); + dst_n->v.string = str8_copy(arena, dst_n->v.string); + SLLQueuePush(dst.first, dst.last, dst_n); + dst.count += 1; + } + MemoryZeroStruct(&di_shared->events); + arena_clear(di_shared->event_arena); + } + return dst; +} + //////////////////////////////// //~ rjf: Asynchronous Tick @@ -738,6 +763,16 @@ di_async_tick(void) t->status = DI_LoadTaskStatus_Active; di_shared->conversion_process_count += 1; di_shared->conversion_thread_count += t->thread_count; + + // rjf: send event + MutexScope(di_shared->event_mutex) + { + DI_EventNode *n = push_array(di_shared->event_arena, DI_EventNode, 1); + SLLQueuePush(di_shared->events.first, di_shared->events.last, n); + di_shared->events.count += 1; + n->v.kind = DI_EventKind_ConversionStarted; + n->v.string = str8_copy(di_shared->event_arena, rdi_path); + } } //- rjf: if active & process has completed, mark as done @@ -785,6 +820,14 @@ di_async_tick(void) //- rjf: if task is done, retire & recycle task; gather path to load if(t->status == DI_LoadTaskStatus_Done) { + if(!os_handle_match(t->process, os_handle_zero())) MutexScope(di_shared->event_mutex) + { + DI_EventNode *n = push_array(di_shared->event_arena, DI_EventNode, 1); + SLLQueuePush(di_shared->events.first, di_shared->events.last, n); + di_shared->events.count += 1; + n->v.kind = DI_EventKind_ConversionEnded; + n->v.string = str8_copy(di_shared->event_arena, rdi_path); + } DLLRemove(di_shared->first_load_task, di_shared->last_load_task, t); SLLStackPush(di_shared->free_load_task, t); ParseTaskNode *n = push_array(scratch.arena, ParseTaskNode, 1); diff --git a/src/dbg_info/dbg_info.h b/src/dbg_info/dbg_info.h index 5af13b45..5e2dbbb3 100644 --- a/src/dbg_info/dbg_info.h +++ b/src/dbg_info/dbg_info.h @@ -204,6 +204,40 @@ struct DI_Match U32 idx; }; +//////////////////////////////// +//~ rjf: Events + +typedef enum DI_EventKind +{ + DI_EventKind_Null, + DI_EventKind_ConversionStarted, + DI_EventKind_ConversionEnded, + DI_EventKind_COUNT +} +DI_EventKind; + +typedef struct DI_Event DI_Event; +struct DI_Event +{ + DI_EventKind kind; + String8 string; +}; + +typedef struct DI_EventNode DI_EventNode; +struct DI_EventNode +{ + DI_EventNode *next; + DI_Event v; +}; + +typedef struct DI_EventList DI_EventList; +struct DI_EventList +{ + DI_EventNode *first; + DI_EventNode *last; + U64 count; +}; + //////////////////////////////// //~ rjf: Shared State @@ -254,6 +288,11 @@ struct DI_Shared Arena *completion_arena; DI_LoadCompletion *first_completion; DI_LoadCompletion *last_completion; + + // rjf: events + Mutex event_mutex; + Arena *event_arena; + DI_EventList events; }; //////////////////////////////// @@ -292,6 +331,11 @@ internal U64 di_load_gen(void); internal DI_KeyArray di_push_all_loaded_keys(Arena *arena); internal RDI_Parsed *di_rdi_from_key(Access *access, DI_Key key, B32 high_priority, U64 endt_us); +//////////////////////////////// +//~ rjf: Events + +internal DI_EventList di_get_events(Arena *arena); + //////////////////////////////// //~ rjf: Asynchronous Tick diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 05683584..57911805 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -11399,10 +11399,9 @@ rd_frame(void) ////////////////////////////// //- rjf: sync with di parsers // -#if 0 // TODO(rjf): @dbgi2 ProfScope("sync with di parsers") { - DI_EventList events = di_p2u_pop_events(scratch.arena, 0); + DI_EventList events = di_get_events(scratch.arena); for(DI_EventNode *n = events.first; n != 0; n = n->next) { DI_Event *event = &n->v; @@ -11430,7 +11429,6 @@ rd_frame(void) } } } -#endif ////////////////////////////// //- rjf: animate all views