oops, fix dbgi search arenas leak!

This commit is contained in:
Ryan Fleury
2025-10-07 16:45:02 -07:00
parent 166b84cf30
commit d2feaa5f56
+30 -13
View File
@@ -1071,8 +1071,16 @@ di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out)
}
lane_sync();
//- rjf: do wide search on all lanes
Arena *arena = arena_alloc();
//- rjf: do wide search on all lanes
Arena *arena = arena_alloc();
Arena **arenas = 0;
U64 arenas_count = lane_count();
if(lane_idx() == 0)
{
arenas = push_array(arena, Arena *, arenas_count);
}
lane_sync_u64(&arenas, 0);
arenas[lane_idx()] = arena;
DI_SearchItemChunkList *lanes_items = 0;
ProfScope("do wide search on all lanes")
{
@@ -1383,9 +1391,10 @@ di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out)
lane_sync();
//- rjf: bundle as artifact
artifact.u64[0] = (U64)arena;
artifact.u64[1] = (U64)items.v;
artifact.u64[2] = items.count;
artifact.u64[0] = (U64)arenas;
artifact.u64[1] = arenas_count;
artifact.u64[2] = (U64)items.v;
artifact.u64[3] = items.count;
}
scratch_end(scratch);
access_close(access);
@@ -1395,12 +1404,20 @@ di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out)
internal void
di_search_artifact_destroy(AC_Artifact artifact)
{
Arena *arena = (Arena *)artifact.u64[0];
if(arena != 0)
{
arena_release(arena);
}
{
Temp scratch = scratch_begin(0, 0);
Arena **arenas = (Arena **)artifact.u64[0];
U64 arenas_count = artifact.u64[1];
Arena **arenas_copy = push_array(scratch.arena, Arena *, arenas_count);
MemoryCopy(arenas_copy, arenas, sizeof(Arena *) * arenas_count);
for EachIndex(idx, arenas_count)
{
if(arenas_copy[idx])
{
arena_release(arenas_copy[idx]);
}
}
scratch_end(scratch);
}
internal DI_SearchItemArray
@@ -1421,8 +1438,8 @@ di_search_item_array_from_target_query(Access *access, RDI_SectionKind target, S
AC_Artifact artifact = ac_artifact_from_key(access, key, di_search_artifact_create, di_search_artifact_destroy, endt_us, .gen = di_load_gen(), .flags = AC_Flag_Wide, .stale_out = stale_out);
// rjf: unpack artifact
result.v = (DI_SearchItem *)artifact.u64[1];
result.count = artifact.u64[2];
result.v = (DI_SearchItem *)artifact.u64[2];
result.count = artifact.u64[3];
scratch_end(scratch);
}