FIx dangling pointer in thread context when using detached threads

This commit is contained in:
2026-07-15 22:53:01 +10:00
parent a718c600b9
commit 6a822ad080
4 changed files with 34 additions and 32 deletions
+17 -8
View File
@@ -1,4 +1,4 @@
// Generated by the DN single header generator 2026-07-15 21:41:33
// Generated by the DN single header generator 2026-07-15 22:47:49
// DN: Single header generator commented out => #if defined(_CLANGD)
// #define DN_WITH_TESTS 1
@@ -2176,15 +2176,24 @@ DN_API DN_TCInitArgs DN_TCInitArgsDefault()
DN_API void DN_TCInitFromHeap(DN_TCCore *tc, DN_U64 thread_id, DN_TCInitArgs args, DN_Heap heap)
{
DN_Assert(args.temp_count <= DN_ArrayCountU(tc->temp_arenas));
tc->main_arena_mem_ = DN_MemListFromHeap(args.main_reserve, args.main_commit, DN_MemFlags_AllocCanLeak | DN_MemFlags_NoAllocTrack, heap);
DN_MemList main_mem_stack = DN_MemListFromHeap(args.main_reserve, args.main_commit, DN_MemFlags_AllocCanLeak | DN_MemFlags_NoAllocTrack, heap);
DN_MemList *main_mem = DN_MemListNewCopy(&main_mem_stack, DN_MemList, &main_mem_stack);
DN_Arena *main_arena = DN_MemListNewZ(main_mem, DN_Arena);
*main_arena = DN_ArenaFromMemList(main_mem);
DN_Arena *temp_arenas = DN_MemListNewArrayZ(main_mem, DN_Arena, args.temp_count);
for (DN_ForIndexU(index, args.temp_count)) {
tc->temp_arena_mems_[index] = DN_MemListFromHeap(args.temp_reserve, args.temp_commit, DN_MemFlags_AllocCanLeak | DN_MemFlags_NoAllocTrack, heap);
tc->temp_arenas_[index] = DN_ArenaFromMemList(&tc->temp_arena_mems_[index]);
DN_MemList temp_mem_stack = DN_MemListFromHeap(args.temp_reserve, args.temp_commit, DN_MemFlags_AllocCanLeak | DN_MemFlags_NoAllocTrack, heap);
DN_MemList *temp_mem = DN_MemListNewCopy(main_mem, DN_MemList, &temp_mem_stack);
temp_arenas[index] = DN_ArenaFromMemList(temp_mem);
}
tc->err_sink_arena_mem_ = DN_MemListFromHeap(args.err_sink_reserve, args.err_sink_commit, DN_MemFlags_AllocCanLeak | DN_MemFlags_NoAllocTrack, heap);
tc->main_arena_ = DN_ArenaFromMemList(&tc->main_arena_mem_);
tc->err_sink_arena_ = DN_ArenaFromMemList(&tc->err_sink_arena_mem_);
DN_TCInit(tc, thread_id, &tc->main_arena_, tc->temp_arenas_, args.temp_count, &tc->err_sink_arena_);
DN_MemList err_sink_mem_stack = DN_MemListFromHeap(args.err_sink_reserve, args.err_sink_commit, DN_MemFlags_AllocCanLeak | DN_MemFlags_NoAllocTrack, heap);
DN_MemList *err_sink_mem = DN_MemListNewCopy(main_mem, DN_MemList, &err_sink_mem_stack);
DN_Arena *err_sink_arena = DN_MemListNewZ(main_mem, DN_Arena);
*err_sink_arena = DN_ArenaFromMemList(err_sink_mem);
DN_TCInit(tc, thread_id, main_arena, temp_arenas, args.temp_count, err_sink_arena);
}
DN_API void DN_TCDeinit(DN_TCCore *tc, DN_TCDeinitArenas deinit_arenas)