FIx dangling pointer in thread context when using detached threads
This commit is contained in:
@@ -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,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
@@ -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)
|
||||||
|
|||||||
@@ -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];
|
||||||
|
|||||||
Reference in New Issue
Block a user