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) // DN: Single header generator commented out => #if defined(_CLANGD)
// #define DN_WITH_TESTS 1 // #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_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)); 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)) { 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); DN_MemList temp_mem_stack = 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 = 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_); DN_MemList err_sink_mem_stack = DN_MemListFromHeap(args.err_sink_reserve, args.err_sink_commit, DN_MemFlags_AllocCanLeak | DN_MemFlags_NoAllocTrack, heap);
tc->err_sink_arena_ = DN_ArenaFromMemList(&tc->err_sink_arena_mem_); DN_MemList *err_sink_mem = DN_MemListNewCopy(main_mem, DN_MemList, &err_sink_mem_stack);
DN_TCInit(tc, thread_id, &tc->main_arena_, tc->temp_arenas_, args.temp_count, &tc->err_sink_arena_); 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) DN_API void DN_TCDeinit(DN_TCCore *tc, DN_TCDeinitArenas deinit_arenas)
+1 -9
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
#if !defined(DN_H) #if !defined(DN_H)
#define DN_H #define DN_H
@@ -1714,14 +1714,6 @@ struct DN_TCCore // (T)hread (C)ontext sitting in thread-local storage
char lane_opaque[sizeof(DN_U64) * 4]; char lane_opaque[sizeof(DN_U64) * 4];
void* user_context; void* user_context;
DN_MemList main_arena_mem_;
DN_MemList temp_arena_mems_[4];
DN_MemList err_sink_arena_mem_;
DN_Arena main_arena_;
DN_Arena temp_arenas_[4];
DN_Arena err_sink_arena_;
DN_Arena* main_arena; DN_Arena* main_arena;
DN_Pool main_pool; DN_Pool main_pool;
DN_Arena* temp_arenas[4]; DN_Arena* temp_arenas[4];
+16 -7
View File
@@ -2174,15 +2174,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_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)); 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)) { 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); DN_MemList temp_mem_stack = 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 = 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_); DN_MemList err_sink_mem_stack = DN_MemListFromHeap(args.err_sink_reserve, args.err_sink_commit, DN_MemFlags_AllocCanLeak | DN_MemFlags_NoAllocTrack, heap);
tc->err_sink_arena_ = DN_ArenaFromMemList(&tc->err_sink_arena_mem_); DN_MemList *err_sink_mem = DN_MemListNewCopy(main_mem, DN_MemList, &err_sink_mem_stack);
DN_TCInit(tc, thread_id, &tc->main_arena_, tc->temp_arenas_, args.temp_count, &tc->err_sink_arena_); 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) DN_API void DN_TCDeinit(DN_TCCore *tc, DN_TCDeinitArenas deinit_arenas)
-8
View File
@@ -1712,14 +1712,6 @@ struct DN_TCCore // (T)hread (C)ontext sitting in thread-local storage
char lane_opaque[sizeof(DN_U64) * 4]; char lane_opaque[sizeof(DN_U64) * 4];
void* user_context; void* user_context;
DN_MemList main_arena_mem_;
DN_MemList temp_arena_mems_[4];
DN_MemList err_sink_arena_mem_;
DN_Arena main_arena_;
DN_Arena temp_arenas_[4];
DN_Arena err_sink_arena_;
DN_Arena* main_arena; DN_Arena* main_arena;
DN_Pool main_pool; DN_Pool main_pool;
DN_Arena* temp_arenas[4]; DN_Arena* temp_arenas[4];