diff --git a/Single-Header/dn_single_header.cpp b/Single-Header/dn_single_header.cpp index a4e1e76..9ffdd21 100644 --- a/Single-Header/dn_single_header.cpp +++ b/Single-Header/dn_single_header.cpp @@ -1,4 +1,4 @@ -// Generated by the DN single header generator 2025-11-09 15:37:40 +// Generated by the DN single header generator 2025-11-09 17:09:52 #define DN_BASE_INC_CPP @@ -827,7 +827,7 @@ static DN_ArenaBlock *DN_ArenaBlockFromMemFuncs_(DN_U64 reserve, DN_U64 commit, } if (track_alloc && result) - DN_LeakTrackAlloc(dn->leak, result, result->reserve, alloc_can_leak); + DN_LeakTrackAlloc(&g_dn_->leak, result, result->reserve, alloc_can_leak); return result; } @@ -1512,14 +1512,15 @@ DN_API DN_I64 DN_I64FromPtrUnsafe(void const *data, DN_USize size, char separato DN_API DN_FmtAppendResult DN_FmtVAppend(char *buf, DN_USize *buf_size, DN_USize buf_max, char const *fmt, va_list args) { - DN_FmtAppendResult result = {}; - result.size_req = DN_VSNPrintF(buf + *buf_size, DN_Cast(int)(buf_max - *buf_size), fmt, args); - *buf_size += result.size_req; + DN_FmtAppendResult result = {}; + DN_USize starting_size = *buf_size; + result.size_req = DN_VSNPrintF(buf + *buf_size, DN_Cast(int)(buf_max - *buf_size), fmt, args); + *buf_size += result.size_req; if (*buf_size >= (buf_max - 1)) *buf_size = buf_max - 1; DN_Assert(*buf_size <= (buf_max - 1)); result.str8 = DN_Str8FromPtr(buf, *buf_size); - result.truncated = result.str8.size != result.size_req; + result.truncated = result.str8.size != (starting_size + result.size_req); return result; } @@ -10277,8 +10278,9 @@ enum DN_InitFlags_ { DN_InitFlags_Nil = 0, DN_InitFlags_OS = 1 << 0, - DN_InitFlags_LogLibFeatures = 1 << 1, - DN_InitFlags_LogCPUFeatures = 1 << 2, + DN_InitFlags_OSLeakTracker = 1 << 1, + DN_InitFlags_LogLibFeatures = 1 << 2, + DN_InitFlags_LogCPUFeatures = 1 << 3, DN_InitFlags_LogAllFeatures = DN_InitFlags_LogLibFeatures | DN_InitFlags_LogCPUFeatures, }; @@ -10382,49 +10384,51 @@ DN_API void DN_Init(DN_Core *dn, DN_InitFlags flags, DN_InitArgs *args) { g_dn_ = dn; - #if defined(DN_OS_H) && defined(DN_OS_CPP) - DN_InitOS_(&dn->os, args); - #endif - - // NOTE Initialise fields - #if defined(DN_LEAK_TRACKING) - // NOTE: Setup the allocation table with allocation tracking turned off on - // the arena we're using to initialise the table. - core->alloc_table_arena = DN_ArenaFromVMem(DN_Megabytes(1), DN_Kilobytes(512), DN_ArenaFlags_NoAllocTrack | DN_ArenaFlags_AllocCanLeak); - core->alloc_table = DN_DSMap_Init(&core->alloc_table_arena, 4096, DN_DSMapFlags_Nil); - #endif + if (flags & DN_InitFlags_OS) { + #if defined(DN_OS_H) && defined(DN_OS_CPP) + DN_InitOS_(&dn->os, args); + if (flags & DN_InitFlags_OSLeakTracker) { + // NOTE: Setup the allocation table with allocation tracking turned off on + // the arena we're using to initialise the table. + dn->leak.alloc_table_arena = DN_ArenaFromVMem(DN_Megabytes(1), DN_Kilobytes(512), DN_ArenaFlags_NoAllocTrack | DN_ArenaFlags_AllocCanLeak); + dn->leak.alloc_table = DN_DSMap_Init(&dn->leak.alloc_table_arena, 4096, DN_DSMapFlags_Nil); + } + #endif + } // NOTE: Print out init features - DN_OSTLSTMem tmem = DN_OS_TLSPushTMem(nullptr); - DN_Str8Builder builder = DN_Str8BuilderFromArena(tmem.arena); + char buf[4096]; + DN_USize buf_size = 0; if (flags & DN_InitFlags_LogLibFeatures) { - DN_Str8BuilderAppendRef(&builder, DN_Str8Lit("DN initialised:\n")); + DN_FmtAppendTruncate(buf, &buf_size, sizeof(buf), DN_Str8Lit("..."), "DN initialised:\n"); #if defined(DN_OS_CPP) - DN_F32 page_size_kib = dn->os.page_size / 1024.0f; - DN_F32 alloc_granularity_kib = dn->os.alloc_granularity / 1024.0f; - DN_Str8BuilderAppendF(&builder, - " OS Page Size/Alloc Granularity: %.1f/%.1fKiB\n" - " Logical Processor Count: %u\n", - page_size_kib, - alloc_granularity_kib, - dn->os.logical_processor_count); + DN_F32 page_size_kib = dn->os.page_size / 1024.0f; + DN_F32 alloc_granularity_kib = dn->os.alloc_granularity / 1024.0f; + DN_FmtAppendTruncate(buf, + &buf_size, + sizeof(buf), + DN_Str8Lit("..."), + " OS Page Size/Alloc Granularity: %.1f/%.1fKiB\n" + " Logical Processor Count: %u\n", + page_size_kib, + alloc_granularity_kib, + dn->os.logical_processor_count); #endif #if DN_HAS_FEATURE(address_sanitizer) || defined(__SANITIZE_ADDRESS__) if (DN_ASAN_POISON) { - DN_Str8BuilderAppendF( - &builder, " ASAN manual poisoning%s\n", DN_ASAN_VET_POISON ? " (+vet sanity checks)" : ""); - DN_Str8BuilderAppendF(&builder, " ASAN poison guard size: %u\n", DN_ASAN_POISON_GUARD_SIZE); + DN_FmtAppendTruncate(buf, &buf_size, sizeof(buf), DN_Str8Lit("..."), " ASAN manual poisoning%s\n", DN_ASAN_VET_POISON ? " (+vet sanity checks)" : ""); + DN_FmtAppendTruncate(buf, &buf_size, sizeof(buf), DN_Str8Lit("..."), " ASAN poison guard size: %u\n", DN_ASAN_POISON_GUARD_SIZE); } #endif #if defined(DN_LEAK_TRACKING) - DN_Str8BuilderAppendRef(&builder, DN_Str8Lit(" Allocation leak tracing\n")); + DN_FmtAppendTruncate(buf, &buf_size, sizeof(buf), DN_Str8Lit("..."), " Allocation leak tracing\n"); #endif #if defined(DN_PLATFORM_EMSCRIPTEN) || defined(DN_PLATFORM_POSIX) DN_POSIXCore *posix = DN_Cast(DN_POSIXCore *)g_dn_->os.platform_context; - DN_Str8BuilderAppendF(&builder, " Clock GetTime: %S\n", posix->clock_monotonic_raw ? DN_Str8Lit("CLOCK_MONOTONIC_RAW") : DN_Str8Lit("CLOCK_MONOTONIC")); + DN_FmtAppendTruncate(buf, &buf_size, sizeof(buf), DN_Str8Lit("..."), " Clock GetTime: %S\n", posix->clock_monotonic_raw ? DN_Str8Lit("CLOCK_MONOTONIC_RAW") : DN_Str8Lit("CLOCK_MONOTONIC")); #endif // TODO(doyle): Add stacktrace feature log } @@ -10434,7 +10438,7 @@ DN_API void DN_Init(DN_Core *dn, DN_InitFlags flags, DN_InitArgs *args) DN_Str8 brand = DN_Str8TrimWhitespaceAround(DN_Str8FromPtr(report->brand, sizeof(report->brand) - 1)); DN_MSVC_WARNING_PUSH DN_MSVC_WARNING_DISABLE(6284) // Object passed as _Param_(3) when a string is required in call to 'DN_Str8BuilderAppendF' Actual type: 'struct DN_Str8'. - DN_Str8BuilderAppendF(&builder, " CPU '%S' from '%s' detected:\n", brand, report->vendor); + DN_FmtAppendTruncate(buf, &buf_size, sizeof(buf), DN_Str8Lit("..."), " CPU '%S' from '%s' detected:\n", brand, report->vendor); DN_MSVC_WARNING_POP DN_USize longest_feature_name = 0; @@ -10446,19 +10450,20 @@ DN_API void DN_Init(DN_Core *dn, DN_InitFlags flags, DN_InitArgs *args) for (DN_ForIndexU(feature_index, DN_CPUFeature_Count)) { DN_CPUFeatureDecl feature_decl = g_dn_cpu_feature_decl[feature_index]; bool has_feature = DN_CPUHasFeature(report, feature_decl.value); - DN_Str8BuilderAppendF(&builder, - " %.*s:%*s%s\n", - DN_Str8PrintFmt(feature_decl.label), - DN_Cast(int)(longest_feature_name - feature_decl.label.size), - "", - has_feature ? "available" : "not available"); + DN_FmtAppendTruncate(buf, + &buf_size, + sizeof(buf), + DN_Str8Lit("..."), + " %.*s:%*s%s\n", + DN_Str8PrintFmt(feature_decl.label), + DN_Cast(int)(longest_feature_name - feature_decl.label.size), + "", + has_feature ? "available" : "not available"); } } - DN_Str8 info_log = DN_Str8BuilderBuild(&builder, tmem.arena); - if (info_log.size) - DN_LOG_DebugF("%.*s", DN_Str8PrintFmt(info_log)); - + if (buf_size) + DN_LOG_DebugF("%.*s", DN_Cast(int)buf_size, buf); } DN_API void DN_BeginFrame() diff --git a/Single-Header/dn_single_header.h b/Single-Header/dn_single_header.h index 579fb35..4d248a9 100644 --- a/Single-Header/dn_single_header.h +++ b/Single-Header/dn_single_header.h @@ -1,4 +1,4 @@ -// Generated by the DN single header generator 2025-11-09 15:37:40 +// Generated by the DN single header generator 2025-11-09 17:09:52 #if !defined(DN_BASE_INC_H) #define DN_BASE_INC_H @@ -4015,7 +4015,7 @@ DN_API void DN_LeakDump_ (DN_LeakTracker *leak); #if defined(DN_LEAK_TRACKING) #define DN_LeakTrackAlloc(leak, ptr, size, alloc_can_leak) DN_LeakTrackAlloc_(leak, ptr, size, alloc_can_leak) #define DN_LeakTrackDealloc(leak, ptr) DN_LeakTrackDealloc_(leak, ptr) -#define DN_LeakDump(leak) DN_LeakDump(leak); +#define DN_LeakDump(leak) DN_LeakDump_(leak) #else #define DN_LeakTrackAlloc(leak, ptr, size, alloc_can_leak) do { (void)ptr; (void)size; (void)alloc_can_leak; } while (0) #define DN_LeakTrackDealloc(leak, ptr) do { (void)ptr; } while (0) @@ -6330,8 +6330,9 @@ enum DN_InitFlags_ { DN_InitFlags_Nil = 0, DN_InitFlags_OS = 1 << 0, - DN_InitFlags_LogLibFeatures = 1 << 1, - DN_InitFlags_LogCPUFeatures = 1 << 2, + DN_InitFlags_OSLeakTracker = 1 << 1, + DN_InitFlags_LogLibFeatures = 1 << 2, + DN_InitFlags_LogCPUFeatures = 1 << 3, DN_InitFlags_LogAllFeatures = DN_InitFlags_LogLibFeatures | DN_InitFlags_LogCPUFeatures, }; diff --git a/Source/Base/dn_base.cpp b/Source/Base/dn_base.cpp index d2ce5b9..90d02dd 100644 --- a/Source/Base/dn_base.cpp +++ b/Source/Base/dn_base.cpp @@ -822,7 +822,7 @@ static DN_ArenaBlock *DN_ArenaBlockFromMemFuncs_(DN_U64 reserve, DN_U64 commit, } if (track_alloc && result) - DN_LeakTrackAlloc(dn->leak, result, result->reserve, alloc_can_leak); + DN_LeakTrackAlloc(&g_dn_->leak, result, result->reserve, alloc_can_leak); return result; } @@ -1507,14 +1507,15 @@ DN_API DN_I64 DN_I64FromPtrUnsafe(void const *data, DN_USize size, char separato DN_API DN_FmtAppendResult DN_FmtVAppend(char *buf, DN_USize *buf_size, DN_USize buf_max, char const *fmt, va_list args) { - DN_FmtAppendResult result = {}; - result.size_req = DN_VSNPrintF(buf + *buf_size, DN_Cast(int)(buf_max - *buf_size), fmt, args); - *buf_size += result.size_req; + DN_FmtAppendResult result = {}; + DN_USize starting_size = *buf_size; + result.size_req = DN_VSNPrintF(buf + *buf_size, DN_Cast(int)(buf_max - *buf_size), fmt, args); + *buf_size += result.size_req; if (*buf_size >= (buf_max - 1)) *buf_size = buf_max - 1; DN_Assert(*buf_size <= (buf_max - 1)); result.str8 = DN_Str8FromPtr(buf, *buf_size); - result.truncated = result.str8.size != result.size_req; + result.truncated = result.str8.size != (starting_size + result.size_req); return result; } diff --git a/Source/Base/dn_base_leak.h b/Source/Base/dn_base_leak.h index a97f75c..98b5cba 100644 --- a/Source/Base/dn_base_leak.h +++ b/Source/Base/dn_base_leak.h @@ -35,7 +35,7 @@ DN_API void DN_LeakDump_ (DN_LeakTracker *leak); #if defined(DN_LEAK_TRACKING) #define DN_LeakTrackAlloc(leak, ptr, size, alloc_can_leak) DN_LeakTrackAlloc_(leak, ptr, size, alloc_can_leak) #define DN_LeakTrackDealloc(leak, ptr) DN_LeakTrackDealloc_(leak, ptr) -#define DN_LeakDump(leak) DN_LeakDump(leak); +#define DN_LeakDump(leak) DN_LeakDump_(leak) #else #define DN_LeakTrackAlloc(leak, ptr, size, alloc_can_leak) do { (void)ptr; (void)size; (void)alloc_can_leak; } while (0) #define DN_LeakTrackDealloc(leak, ptr) do { (void)ptr; } while (0) diff --git a/Source/Extra/dn_net_curl.cpp b/Source/Extra/dn_net_curl.cpp index 969f06f..463599d 100644 --- a/Source/Extra/dn_net_curl.cpp +++ b/Source/Extra/dn_net_curl.cpp @@ -27,26 +27,6 @@ struct DN_NETCurlRingEvent DN_NETWSSend ws_send; }; -struct DN_NETCurlCore -{ - // NOTE: Shared w/ user and networking thread - DN_Ring ring; - DN_OSMutex ring_mutex; - bool kill_thread; - - DN_OSMutex list_mutex; // Lock for request, response, deinit, free list - DN_NETRequest *request_list; // Current requests submitted by the user thread awaiting to move into the thread request list - DN_NETRequest *response_list; // Finished requests that are to be deqeued by the user via wait for response - DN_NETRequest *deinit_list; // Requests that are finished and are awaiting to be de-initialised by the CURL thread - DN_NETRequest *free_list; // Request pool that new requests will use before allocating - - // NOTE: Networking thread only - DN_NETRequest *thread_request_list; // Current requests being executed by the CURL thread. - // This list is exclusively owned by the CURL thread so no locking is needed - DN_OSThread thread; - void *thread_curlm; -}; - static DN_NETCurlRequest *DN_NET_CurlRequestFromRequest_(DN_NETRequest *req) { DN_NETCurlRequest *result = req ? DN_Cast(DN_NETCurlRequest *) req->context[0] : 0; diff --git a/Source/Extra/dn_net_curl.h b/Source/Extra/dn_net_curl.h index a87721e..c300209 100644 --- a/Source/Extra/dn_net_curl.h +++ b/Source/Extra/dn_net_curl.h @@ -3,6 +3,27 @@ #include "dn_net.h" +struct DN_NETCurlCore +{ + // NOTE: Shared w/ user and networking thread + DN_Ring ring; + DN_OSMutex ring_mutex; + bool kill_thread; + + DN_OSMutex list_mutex; // Lock for request, response, deinit, free list + DN_NETRequest *request_list; // Current requests submitted by the user thread awaiting to move into the thread request list + DN_NETRequest *response_list; // Finished requests that are to be deqeued by the user via wait for response + DN_NETRequest *deinit_list; // Requests that are finished and are awaiting to be de-initialised by the CURL thread + DN_NETRequest *free_list; // Request pool that new requests will use before allocating + + // NOTE: Networking thread only + DN_NETRequest *thread_request_list; // Current requests being executed by the CURL thread. + // This list is exclusively owned by the CURL thread so no locking is needed + DN_OSThread thread; + void *thread_curlm; +}; + +#define DN_NET_CurlCoreFromNet(net) ((net) ? (DN_Cast(DN_NETCurlCore *)(net)->context) : nullptr); DN_NETInterface DN_NET_CurlInterface (); void DN_NET_CurlInit (DN_NETCore *net, char *base, DN_U64 base_size); void DN_NET_CurlDeinit (DN_NETCore *net); diff --git a/Source/Extra/dn_tests.cpp b/Source/Extra/dn_tests.cpp index 305dc0a..be9f90b 100644 --- a/Source/Extra/dn_tests.cpp +++ b/Source/Extra/dn_tests.cpp @@ -2119,7 +2119,7 @@ static DN_UTCore DN_Tests_Str8() DN_UT_AssertF(&result, size == 5, "size=%zu", size); } - char arena_base[256]; + char arena_base[512]; for (DN_UT_Test(&result, "Str8 format from arena")) { DN_Arena arena = DN_ArenaFromBuffer(arena_base, sizeof(arena_base), DN_ArenaFlags_Nil); DN_Str8 str8 = DN_Str8FromFmtArena(&arena, "Foo Bar %d", 5); diff --git a/Source/dn_inc.cpp b/Source/dn_inc.cpp index 4be9803..a8dfd65 100644 --- a/Source/dn_inc.cpp +++ b/Source/dn_inc.cpp @@ -95,49 +95,51 @@ DN_API void DN_Init(DN_Core *dn, DN_InitFlags flags, DN_InitArgs *args) { g_dn_ = dn; - #if defined(DN_OS_H) && defined(DN_OS_CPP) - DN_InitOS_(&dn->os, args); - #endif - - // NOTE Initialise fields - #if defined(DN_LEAK_TRACKING) - // NOTE: Setup the allocation table with allocation tracking turned off on - // the arena we're using to initialise the table. - core->alloc_table_arena = DN_ArenaFromVMem(DN_Megabytes(1), DN_Kilobytes(512), DN_ArenaFlags_NoAllocTrack | DN_ArenaFlags_AllocCanLeak); - core->alloc_table = DN_DSMap_Init(&core->alloc_table_arena, 4096, DN_DSMapFlags_Nil); - #endif + if (flags & DN_InitFlags_OS) { + #if defined(DN_OS_H) && defined(DN_OS_CPP) + DN_InitOS_(&dn->os, args); + if (flags & DN_InitFlags_OSLeakTracker) { + // NOTE: Setup the allocation table with allocation tracking turned off on + // the arena we're using to initialise the table. + dn->leak.alloc_table_arena = DN_ArenaFromVMem(DN_Megabytes(1), DN_Kilobytes(512), DN_ArenaFlags_NoAllocTrack | DN_ArenaFlags_AllocCanLeak); + dn->leak.alloc_table = DN_DSMap_Init(&dn->leak.alloc_table_arena, 4096, DN_DSMapFlags_Nil); + } + #endif + } // NOTE: Print out init features - DN_OSTLSTMem tmem = DN_OS_TLSPushTMem(nullptr); - DN_Str8Builder builder = DN_Str8BuilderFromArena(tmem.arena); + char buf[4096]; + DN_USize buf_size = 0; if (flags & DN_InitFlags_LogLibFeatures) { - DN_Str8BuilderAppendRef(&builder, DN_Str8Lit("DN initialised:\n")); + DN_FmtAppendTruncate(buf, &buf_size, sizeof(buf), DN_Str8Lit("..."), "DN initialised:\n"); #if defined(DN_OS_CPP) - DN_F32 page_size_kib = dn->os.page_size / 1024.0f; - DN_F32 alloc_granularity_kib = dn->os.alloc_granularity / 1024.0f; - DN_Str8BuilderAppendF(&builder, - " OS Page Size/Alloc Granularity: %.1f/%.1fKiB\n" - " Logical Processor Count: %u\n", - page_size_kib, - alloc_granularity_kib, - dn->os.logical_processor_count); + DN_F32 page_size_kib = dn->os.page_size / 1024.0f; + DN_F32 alloc_granularity_kib = dn->os.alloc_granularity / 1024.0f; + DN_FmtAppendTruncate(buf, + &buf_size, + sizeof(buf), + DN_Str8Lit("..."), + " OS Page Size/Alloc Granularity: %.1f/%.1fKiB\n" + " Logical Processor Count: %u\n", + page_size_kib, + alloc_granularity_kib, + dn->os.logical_processor_count); #endif #if DN_HAS_FEATURE(address_sanitizer) || defined(__SANITIZE_ADDRESS__) if (DN_ASAN_POISON) { - DN_Str8BuilderAppendF( - &builder, " ASAN manual poisoning%s\n", DN_ASAN_VET_POISON ? " (+vet sanity checks)" : ""); - DN_Str8BuilderAppendF(&builder, " ASAN poison guard size: %u\n", DN_ASAN_POISON_GUARD_SIZE); + DN_FmtAppendTruncate(buf, &buf_size, sizeof(buf), DN_Str8Lit("..."), " ASAN manual poisoning%s\n", DN_ASAN_VET_POISON ? " (+vet sanity checks)" : ""); + DN_FmtAppendTruncate(buf, &buf_size, sizeof(buf), DN_Str8Lit("..."), " ASAN poison guard size: %u\n", DN_ASAN_POISON_GUARD_SIZE); } #endif #if defined(DN_LEAK_TRACKING) - DN_Str8BuilderAppendRef(&builder, DN_Str8Lit(" Allocation leak tracing\n")); + DN_FmtAppendTruncate(buf, &buf_size, sizeof(buf), DN_Str8Lit("..."), " Allocation leak tracing\n"); #endif #if defined(DN_PLATFORM_EMSCRIPTEN) || defined(DN_PLATFORM_POSIX) DN_POSIXCore *posix = DN_Cast(DN_POSIXCore *)g_dn_->os.platform_context; - DN_Str8BuilderAppendF(&builder, " Clock GetTime: %S\n", posix->clock_monotonic_raw ? DN_Str8Lit("CLOCK_MONOTONIC_RAW") : DN_Str8Lit("CLOCK_MONOTONIC")); + DN_FmtAppendTruncate(buf, &buf_size, sizeof(buf), DN_Str8Lit("..."), " Clock GetTime: %S\n", posix->clock_monotonic_raw ? DN_Str8Lit("CLOCK_MONOTONIC_RAW") : DN_Str8Lit("CLOCK_MONOTONIC")); #endif // TODO(doyle): Add stacktrace feature log } @@ -147,7 +149,7 @@ DN_API void DN_Init(DN_Core *dn, DN_InitFlags flags, DN_InitArgs *args) DN_Str8 brand = DN_Str8TrimWhitespaceAround(DN_Str8FromPtr(report->brand, sizeof(report->brand) - 1)); DN_MSVC_WARNING_PUSH DN_MSVC_WARNING_DISABLE(6284) // Object passed as _Param_(3) when a string is required in call to 'DN_Str8BuilderAppendF' Actual type: 'struct DN_Str8'. - DN_Str8BuilderAppendF(&builder, " CPU '%S' from '%s' detected:\n", brand, report->vendor); + DN_FmtAppendTruncate(buf, &buf_size, sizeof(buf), DN_Str8Lit("..."), " CPU '%S' from '%s' detected:\n", brand, report->vendor); DN_MSVC_WARNING_POP DN_USize longest_feature_name = 0; @@ -159,19 +161,20 @@ DN_API void DN_Init(DN_Core *dn, DN_InitFlags flags, DN_InitArgs *args) for (DN_ForIndexU(feature_index, DN_CPUFeature_Count)) { DN_CPUFeatureDecl feature_decl = g_dn_cpu_feature_decl[feature_index]; bool has_feature = DN_CPUHasFeature(report, feature_decl.value); - DN_Str8BuilderAppendF(&builder, - " %.*s:%*s%s\n", - DN_Str8PrintFmt(feature_decl.label), - DN_Cast(int)(longest_feature_name - feature_decl.label.size), - "", - has_feature ? "available" : "not available"); + DN_FmtAppendTruncate(buf, + &buf_size, + sizeof(buf), + DN_Str8Lit("..."), + " %.*s:%*s%s\n", + DN_Str8PrintFmt(feature_decl.label), + DN_Cast(int)(longest_feature_name - feature_decl.label.size), + "", + has_feature ? "available" : "not available"); } } - DN_Str8 info_log = DN_Str8BuilderBuild(&builder, tmem.arena); - if (info_log.size) - DN_LOG_DebugF("%.*s", DN_Str8PrintFmt(info_log)); - + if (buf_size) + DN_LOG_DebugF("%.*s", DN_Cast(int)buf_size, buf); } DN_API void DN_BeginFrame() diff --git a/Source/dn_inc.h b/Source/dn_inc.h index 785cad9..06b8562 100644 --- a/Source/dn_inc.h +++ b/Source/dn_inc.h @@ -23,8 +23,9 @@ enum DN_InitFlags_ { DN_InitFlags_Nil = 0, DN_InitFlags_OS = 1 << 0, - DN_InitFlags_LogLibFeatures = 1 << 1, - DN_InitFlags_LogCPUFeatures = 1 << 2, + DN_InitFlags_OSLeakTracker = 1 << 1, + DN_InitFlags_LogLibFeatures = 1 << 2, + DN_InitFlags_LogCPUFeatures = 1 << 3, DN_InitFlags_LogAllFeatures = DN_InitFlags_LogLibFeatures | DN_InitFlags_LogCPUFeatures, };