mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-06 13:58:40 +00:00
oops, fix dbgi search arenas leak!
This commit is contained in:
+25
-8
@@ -1073,6 +1073,14 @@ di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out)
|
|||||||
|
|
||||||
//- rjf: do wide search on all lanes
|
//- rjf: do wide search on all lanes
|
||||||
Arena *arena = arena_alloc();
|
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;
|
DI_SearchItemChunkList *lanes_items = 0;
|
||||||
ProfScope("do wide search on all lanes")
|
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();
|
lane_sync();
|
||||||
|
|
||||||
//- rjf: bundle as artifact
|
//- rjf: bundle as artifact
|
||||||
artifact.u64[0] = (U64)arena;
|
artifact.u64[0] = (U64)arenas;
|
||||||
artifact.u64[1] = (U64)items.v;
|
artifact.u64[1] = arenas_count;
|
||||||
artifact.u64[2] = items.count;
|
artifact.u64[2] = (U64)items.v;
|
||||||
|
artifact.u64[3] = items.count;
|
||||||
}
|
}
|
||||||
scratch_end(scratch);
|
scratch_end(scratch);
|
||||||
access_close(access);
|
access_close(access);
|
||||||
@@ -1396,12 +1405,20 @@ di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out)
|
|||||||
internal void
|
internal void
|
||||||
di_search_artifact_destroy(AC_Artifact artifact)
|
di_search_artifact_destroy(AC_Artifact artifact)
|
||||||
{
|
{
|
||||||
Arena *arena = (Arena *)artifact.u64[0];
|
Temp scratch = scratch_begin(0, 0);
|
||||||
if(arena != 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)
|
||||||
{
|
{
|
||||||
arena_release(arena);
|
if(arenas_copy[idx])
|
||||||
|
{
|
||||||
|
arena_release(arenas_copy[idx]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
scratch_end(scratch);
|
||||||
|
}
|
||||||
|
|
||||||
internal DI_SearchItemArray
|
internal DI_SearchItemArray
|
||||||
di_search_item_array_from_target_query(Access *access, RDI_SectionKind target, String8 query, U64 endt_us, B32 *stale_out)
|
di_search_item_array_from_target_query(Access *access, RDI_SectionKind target, String8 query, U64 endt_us, B32 *stale_out)
|
||||||
@@ -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);
|
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
|
// rjf: unpack artifact
|
||||||
result.v = (DI_SearchItem *)artifact.u64[1];
|
result.v = (DI_SearchItem *)artifact.u64[2];
|
||||||
result.count = artifact.u64[2];
|
result.count = artifact.u64[3];
|
||||||
|
|
||||||
scratch_end(scratch);
|
scratch_end(scratch);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user