More build fixes

This commit is contained in:
doylet 2025-11-09 17:10:08 +11:00
parent ea7cd4638c
commit d4dcead4f2
9 changed files with 129 additions and 117 deletions

View File

@ -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 #define DN_BASE_INC_CPP
@ -827,7 +827,7 @@ static DN_ArenaBlock *DN_ArenaBlockFromMemFuncs_(DN_U64 reserve, DN_U64 commit,
} }
if (track_alloc && result) 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; 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_API DN_FmtAppendResult DN_FmtVAppend(char *buf, DN_USize *buf_size, DN_USize buf_max, char const *fmt, va_list args)
{ {
DN_FmtAppendResult result = {}; DN_FmtAppendResult result = {};
result.size_req = DN_VSNPrintF(buf + *buf_size, DN_Cast(int)(buf_max - *buf_size), fmt, args); DN_USize starting_size = *buf_size;
*buf_size += result.size_req; 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)) if (*buf_size >= (buf_max - 1))
*buf_size = buf_max - 1; *buf_size = buf_max - 1;
DN_Assert(*buf_size <= (buf_max - 1)); DN_Assert(*buf_size <= (buf_max - 1));
result.str8 = DN_Str8FromPtr(buf, *buf_size); 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; return result;
} }
@ -10277,8 +10278,9 @@ enum DN_InitFlags_
{ {
DN_InitFlags_Nil = 0, DN_InitFlags_Nil = 0,
DN_InitFlags_OS = 1 << 0, DN_InitFlags_OS = 1 << 0,
DN_InitFlags_LogLibFeatures = 1 << 1, DN_InitFlags_OSLeakTracker = 1 << 1,
DN_InitFlags_LogCPUFeatures = 1 << 2, DN_InitFlags_LogLibFeatures = 1 << 2,
DN_InitFlags_LogCPUFeatures = 1 << 3,
DN_InitFlags_LogAllFeatures = DN_InitFlags_LogLibFeatures | DN_InitFlags_LogCPUFeatures, 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; g_dn_ = dn;
#if defined(DN_OS_H) && defined(DN_OS_CPP) if (flags & DN_InitFlags_OS) {
DN_InitOS_(&dn->os, args); #if defined(DN_OS_H) && defined(DN_OS_CPP)
#endif DN_InitOS_(&dn->os, args);
if (flags & DN_InitFlags_OSLeakTracker) {
// NOTE Initialise fields // NOTE: Setup the allocation table with allocation tracking turned off on
#if defined(DN_LEAK_TRACKING) // the arena we're using to initialise the table.
// NOTE: Setup the allocation table with allocation tracking turned off on dn->leak.alloc_table_arena = DN_ArenaFromVMem(DN_Megabytes(1), DN_Kilobytes(512), DN_ArenaFlags_NoAllocTrack | DN_ArenaFlags_AllocCanLeak);
// the arena we're using to initialise the table. dn->leak.alloc_table = DN_DSMap_Init<DN_LeakAlloc>(&dn->leak.alloc_table_arena, 4096, DN_DSMapFlags_Nil);
core->alloc_table_arena = DN_ArenaFromVMem(DN_Megabytes(1), DN_Kilobytes(512), DN_ArenaFlags_NoAllocTrack | DN_ArenaFlags_AllocCanLeak); }
core->alloc_table = DN_DSMap_Init<DN_DebugAlloc>(&core->alloc_table_arena, 4096, DN_DSMapFlags_Nil); #endif
#endif }
// NOTE: Print out init features // NOTE: Print out init features
DN_OSTLSTMem tmem = DN_OS_TLSPushTMem(nullptr); char buf[4096];
DN_Str8Builder builder = DN_Str8BuilderFromArena(tmem.arena); DN_USize buf_size = 0;
if (flags & DN_InitFlags_LogLibFeatures) { 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) #if defined(DN_OS_CPP)
DN_F32 page_size_kib = dn->os.page_size / 1024.0f; DN_F32 page_size_kib = dn->os.page_size / 1024.0f;
DN_F32 alloc_granularity_kib = dn->os.alloc_granularity / 1024.0f; DN_F32 alloc_granularity_kib = dn->os.alloc_granularity / 1024.0f;
DN_Str8BuilderAppendF(&builder, DN_FmtAppendTruncate(buf,
" OS Page Size/Alloc Granularity: %.1f/%.1fKiB\n" &buf_size,
" Logical Processor Count: %u\n", sizeof(buf),
page_size_kib, DN_Str8Lit("..."),
alloc_granularity_kib, " OS Page Size/Alloc Granularity: %.1f/%.1fKiB\n"
dn->os.logical_processor_count); " Logical Processor Count: %u\n",
page_size_kib,
alloc_granularity_kib,
dn->os.logical_processor_count);
#endif #endif
#if DN_HAS_FEATURE(address_sanitizer) || defined(__SANITIZE_ADDRESS__) #if DN_HAS_FEATURE(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
if (DN_ASAN_POISON) { if (DN_ASAN_POISON) {
DN_Str8BuilderAppendF( DN_FmtAppendTruncate(buf, &buf_size, sizeof(buf), DN_Str8Lit("..."), " ASAN manual poisoning%s\n", DN_ASAN_VET_POISON ? " (+vet sanity checks)" : "");
&builder, " 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);
DN_Str8BuilderAppendF(&builder, " ASAN poison guard size: %u\n", DN_ASAN_POISON_GUARD_SIZE);
} }
#endif #endif
#if defined(DN_LEAK_TRACKING) #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 #endif
#if defined(DN_PLATFORM_EMSCRIPTEN) || defined(DN_PLATFORM_POSIX) #if defined(DN_PLATFORM_EMSCRIPTEN) || defined(DN_PLATFORM_POSIX)
DN_POSIXCore *posix = DN_Cast(DN_POSIXCore *)g_dn_->os.platform_context; 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 #endif
// TODO(doyle): Add stacktrace feature log // 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_Str8 brand = DN_Str8TrimWhitespaceAround(DN_Str8FromPtr(report->brand, sizeof(report->brand) - 1));
DN_MSVC_WARNING_PUSH 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_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_MSVC_WARNING_POP
DN_USize longest_feature_name = 0; 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)) { for (DN_ForIndexU(feature_index, DN_CPUFeature_Count)) {
DN_CPUFeatureDecl feature_decl = g_dn_cpu_feature_decl[feature_index]; DN_CPUFeatureDecl feature_decl = g_dn_cpu_feature_decl[feature_index];
bool has_feature = DN_CPUHasFeature(report, feature_decl.value); bool has_feature = DN_CPUHasFeature(report, feature_decl.value);
DN_Str8BuilderAppendF(&builder, DN_FmtAppendTruncate(buf,
" %.*s:%*s%s\n", &buf_size,
DN_Str8PrintFmt(feature_decl.label), sizeof(buf),
DN_Cast(int)(longest_feature_name - feature_decl.label.size), DN_Str8Lit("..."),
"", " %.*s:%*s%s\n",
has_feature ? "available" : "not available"); 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 (buf_size)
if (info_log.size) DN_LOG_DebugF("%.*s", DN_Cast(int)buf_size, buf);
DN_LOG_DebugF("%.*s", DN_Str8PrintFmt(info_log));
} }
DN_API void DN_BeginFrame() DN_API void DN_BeginFrame()

View File

@ -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) #if !defined(DN_BASE_INC_H)
#define 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) #if defined(DN_LEAK_TRACKING)
#define DN_LeakTrackAlloc(leak, ptr, size, alloc_can_leak) DN_LeakTrackAlloc_(leak, ptr, size, alloc_can_leak) #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_LeakTrackDealloc(leak, ptr) DN_LeakTrackDealloc_(leak, ptr)
#define DN_LeakDump(leak) DN_LeakDump(leak); #define DN_LeakDump(leak) DN_LeakDump_(leak)
#else #else
#define DN_LeakTrackAlloc(leak, ptr, size, alloc_can_leak) do { (void)ptr; (void)size; (void)alloc_can_leak; } while (0) #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) #define DN_LeakTrackDealloc(leak, ptr) do { (void)ptr; } while (0)
@ -6330,8 +6330,9 @@ enum DN_InitFlags_
{ {
DN_InitFlags_Nil = 0, DN_InitFlags_Nil = 0,
DN_InitFlags_OS = 1 << 0, DN_InitFlags_OS = 1 << 0,
DN_InitFlags_LogLibFeatures = 1 << 1, DN_InitFlags_OSLeakTracker = 1 << 1,
DN_InitFlags_LogCPUFeatures = 1 << 2, DN_InitFlags_LogLibFeatures = 1 << 2,
DN_InitFlags_LogCPUFeatures = 1 << 3,
DN_InitFlags_LogAllFeatures = DN_InitFlags_LogLibFeatures | DN_InitFlags_LogCPUFeatures, DN_InitFlags_LogAllFeatures = DN_InitFlags_LogLibFeatures | DN_InitFlags_LogCPUFeatures,
}; };

View File

@ -822,7 +822,7 @@ static DN_ArenaBlock *DN_ArenaBlockFromMemFuncs_(DN_U64 reserve, DN_U64 commit,
} }
if (track_alloc && result) 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; 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_API DN_FmtAppendResult DN_FmtVAppend(char *buf, DN_USize *buf_size, DN_USize buf_max, char const *fmt, va_list args)
{ {
DN_FmtAppendResult result = {}; DN_FmtAppendResult result = {};
result.size_req = DN_VSNPrintF(buf + *buf_size, DN_Cast(int)(buf_max - *buf_size), fmt, args); DN_USize starting_size = *buf_size;
*buf_size += result.size_req; 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)) if (*buf_size >= (buf_max - 1))
*buf_size = buf_max - 1; *buf_size = buf_max - 1;
DN_Assert(*buf_size <= (buf_max - 1)); DN_Assert(*buf_size <= (buf_max - 1));
result.str8 = DN_Str8FromPtr(buf, *buf_size); 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; return result;
} }

View File

@ -35,7 +35,7 @@ DN_API void DN_LeakDump_ (DN_LeakTracker *leak);
#if defined(DN_LEAK_TRACKING) #if defined(DN_LEAK_TRACKING)
#define DN_LeakTrackAlloc(leak, ptr, size, alloc_can_leak) DN_LeakTrackAlloc_(leak, ptr, size, alloc_can_leak) #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_LeakTrackDealloc(leak, ptr) DN_LeakTrackDealloc_(leak, ptr)
#define DN_LeakDump(leak) DN_LeakDump(leak); #define DN_LeakDump(leak) DN_LeakDump_(leak)
#else #else
#define DN_LeakTrackAlloc(leak, ptr, size, alloc_can_leak) do { (void)ptr; (void)size; (void)alloc_can_leak; } while (0) #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) #define DN_LeakTrackDealloc(leak, ptr) do { (void)ptr; } while (0)

View File

@ -27,26 +27,6 @@ struct DN_NETCurlRingEvent
DN_NETWSSend ws_send; 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) static DN_NETCurlRequest *DN_NET_CurlRequestFromRequest_(DN_NETRequest *req)
{ {
DN_NETCurlRequest *result = req ? DN_Cast(DN_NETCurlRequest *) req->context[0] : 0; DN_NETCurlRequest *result = req ? DN_Cast(DN_NETCurlRequest *) req->context[0] : 0;

View File

@ -3,6 +3,27 @@
#include "dn_net.h" #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 (); DN_NETInterface DN_NET_CurlInterface ();
void DN_NET_CurlInit (DN_NETCore *net, char *base, DN_U64 base_size); void DN_NET_CurlInit (DN_NETCore *net, char *base, DN_U64 base_size);
void DN_NET_CurlDeinit (DN_NETCore *net); void DN_NET_CurlDeinit (DN_NETCore *net);

View File

@ -2119,7 +2119,7 @@ static DN_UTCore DN_Tests_Str8()
DN_UT_AssertF(&result, size == 5, "size=%zu", size); 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")) { for (DN_UT_Test(&result, "Str8 format from arena")) {
DN_Arena arena = DN_ArenaFromBuffer(arena_base, sizeof(arena_base), DN_ArenaFlags_Nil); DN_Arena arena = DN_ArenaFromBuffer(arena_base, sizeof(arena_base), DN_ArenaFlags_Nil);
DN_Str8 str8 = DN_Str8FromFmtArena(&arena, "Foo Bar %d", 5); DN_Str8 str8 = DN_Str8FromFmtArena(&arena, "Foo Bar %d", 5);

View File

@ -95,49 +95,51 @@ DN_API void DN_Init(DN_Core *dn, DN_InitFlags flags, DN_InitArgs *args)
{ {
g_dn_ = dn; g_dn_ = dn;
#if defined(DN_OS_H) && defined(DN_OS_CPP) if (flags & DN_InitFlags_OS) {
DN_InitOS_(&dn->os, args); #if defined(DN_OS_H) && defined(DN_OS_CPP)
#endif DN_InitOS_(&dn->os, args);
if (flags & DN_InitFlags_OSLeakTracker) {
// NOTE Initialise fields // NOTE: Setup the allocation table with allocation tracking turned off on
#if defined(DN_LEAK_TRACKING) // the arena we're using to initialise the table.
// NOTE: Setup the allocation table with allocation tracking turned off on dn->leak.alloc_table_arena = DN_ArenaFromVMem(DN_Megabytes(1), DN_Kilobytes(512), DN_ArenaFlags_NoAllocTrack | DN_ArenaFlags_AllocCanLeak);
// the arena we're using to initialise the table. dn->leak.alloc_table = DN_DSMap_Init<DN_LeakAlloc>(&dn->leak.alloc_table_arena, 4096, DN_DSMapFlags_Nil);
core->alloc_table_arena = DN_ArenaFromVMem(DN_Megabytes(1), DN_Kilobytes(512), DN_ArenaFlags_NoAllocTrack | DN_ArenaFlags_AllocCanLeak); }
core->alloc_table = DN_DSMap_Init<DN_DebugAlloc>(&core->alloc_table_arena, 4096, DN_DSMapFlags_Nil); #endif
#endif }
// NOTE: Print out init features // NOTE: Print out init features
DN_OSTLSTMem tmem = DN_OS_TLSPushTMem(nullptr); char buf[4096];
DN_Str8Builder builder = DN_Str8BuilderFromArena(tmem.arena); DN_USize buf_size = 0;
if (flags & DN_InitFlags_LogLibFeatures) { 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) #if defined(DN_OS_CPP)
DN_F32 page_size_kib = dn->os.page_size / 1024.0f; DN_F32 page_size_kib = dn->os.page_size / 1024.0f;
DN_F32 alloc_granularity_kib = dn->os.alloc_granularity / 1024.0f; DN_F32 alloc_granularity_kib = dn->os.alloc_granularity / 1024.0f;
DN_Str8BuilderAppendF(&builder, DN_FmtAppendTruncate(buf,
" OS Page Size/Alloc Granularity: %.1f/%.1fKiB\n" &buf_size,
" Logical Processor Count: %u\n", sizeof(buf),
page_size_kib, DN_Str8Lit("..."),
alloc_granularity_kib, " OS Page Size/Alloc Granularity: %.1f/%.1fKiB\n"
dn->os.logical_processor_count); " Logical Processor Count: %u\n",
page_size_kib,
alloc_granularity_kib,
dn->os.logical_processor_count);
#endif #endif
#if DN_HAS_FEATURE(address_sanitizer) || defined(__SANITIZE_ADDRESS__) #if DN_HAS_FEATURE(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
if (DN_ASAN_POISON) { if (DN_ASAN_POISON) {
DN_Str8BuilderAppendF( DN_FmtAppendTruncate(buf, &buf_size, sizeof(buf), DN_Str8Lit("..."), " ASAN manual poisoning%s\n", DN_ASAN_VET_POISON ? " (+vet sanity checks)" : "");
&builder, " 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);
DN_Str8BuilderAppendF(&builder, " ASAN poison guard size: %u\n", DN_ASAN_POISON_GUARD_SIZE);
} }
#endif #endif
#if defined(DN_LEAK_TRACKING) #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 #endif
#if defined(DN_PLATFORM_EMSCRIPTEN) || defined(DN_PLATFORM_POSIX) #if defined(DN_PLATFORM_EMSCRIPTEN) || defined(DN_PLATFORM_POSIX)
DN_POSIXCore *posix = DN_Cast(DN_POSIXCore *)g_dn_->os.platform_context; 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 #endif
// TODO(doyle): Add stacktrace feature log // 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_Str8 brand = DN_Str8TrimWhitespaceAround(DN_Str8FromPtr(report->brand, sizeof(report->brand) - 1));
DN_MSVC_WARNING_PUSH 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_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_MSVC_WARNING_POP
DN_USize longest_feature_name = 0; 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)) { for (DN_ForIndexU(feature_index, DN_CPUFeature_Count)) {
DN_CPUFeatureDecl feature_decl = g_dn_cpu_feature_decl[feature_index]; DN_CPUFeatureDecl feature_decl = g_dn_cpu_feature_decl[feature_index];
bool has_feature = DN_CPUHasFeature(report, feature_decl.value); bool has_feature = DN_CPUHasFeature(report, feature_decl.value);
DN_Str8BuilderAppendF(&builder, DN_FmtAppendTruncate(buf,
" %.*s:%*s%s\n", &buf_size,
DN_Str8PrintFmt(feature_decl.label), sizeof(buf),
DN_Cast(int)(longest_feature_name - feature_decl.label.size), DN_Str8Lit("..."),
"", " %.*s:%*s%s\n",
has_feature ? "available" : "not available"); 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 (buf_size)
if (info_log.size) DN_LOG_DebugF("%.*s", DN_Cast(int)buf_size, buf);
DN_LOG_DebugF("%.*s", DN_Str8PrintFmt(info_log));
} }
DN_API void DN_BeginFrame() DN_API void DN_BeginFrame()

View File

@ -23,8 +23,9 @@ enum DN_InitFlags_
{ {
DN_InitFlags_Nil = 0, DN_InitFlags_Nil = 0,
DN_InitFlags_OS = 1 << 0, DN_InitFlags_OS = 1 << 0,
DN_InitFlags_LogLibFeatures = 1 << 1, DN_InitFlags_OSLeakTracker = 1 << 1,
DN_InitFlags_LogCPUFeatures = 1 << 2, DN_InitFlags_LogLibFeatures = 1 << 2,
DN_InitFlags_LogCPUFeatures = 1 << 3,
DN_InitFlags_LogAllFeatures = DN_InitFlags_LogLibFeatures | DN_InitFlags_LogCPUFeatures, DN_InitFlags_LogAllFeatures = DN_InitFlags_LogLibFeatures | DN_InitFlags_LogCPUFeatures,
}; };