SDL: SDL_GetNumAllocations returns -1 when allocation counting is disabled

From f8d8bf8066cbc5223b950999baa84ff6715a46d9 Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Sat, 21 Dec 2024 20:25:06 +0100
Subject: [PATCH] SDL_GetNumAllocations returns -1 when allocation counting is
 disabled

---
 include/SDL3/SDL_stdinc.h  |  3 ++-
 src/stdlib/SDL_malloc.c    |  8 ++++++--
 src/test/SDL_test_memory.c | 23 +++++++----------------
 3 files changed, 15 insertions(+), 19 deletions(-)

diff --git a/include/SDL3/SDL_stdinc.h b/include/SDL3/SDL_stdinc.h
index ab1fb595875a3..a70052fbc9240 100644
--- a/include/SDL3/SDL_stdinc.h
+++ b/include/SDL3/SDL_stdinc.h
@@ -1542,7 +1542,8 @@ extern SDL_DECLSPEC void SDLCALL SDL_aligned_free(void *mem);
 /**
  * Get the number of outstanding (unfreed) allocations.
  *
- * \returns the number of allocations.
+ * \returns the number of allocations or
+ *          -1 if allocation counting is disabled.
  *
  * \threadsafety It is safe to call this function from any thread.
  *
diff --git a/src/stdlib/SDL_malloc.c b/src/stdlib/SDL_malloc.c
index 72e5354c90459..d3fc367e56908 100644
--- a/src/stdlib/SDL_malloc.c
+++ b/src/stdlib/SDL_malloc.c
@@ -6353,8 +6353,8 @@ static struct
 };
 
 // Define this if you want to track the number of allocations active
-// #define TRACK_ALLOCATION_COUNT
-#ifdef TRACK_ALLOCATION_COUNT
+// #define SDL_TRACK_ALLOCATION_COUNT
+#ifdef SDL_TRACK_ALLOCATION_COUNT
 #define INCREMENT_ALLOCATION_COUNT()    (void)SDL_AtomicIncRef(&s_mem.num_allocations)
 #define DECREMENT_ALLOCATION_COUNT()    (void)SDL_AtomicDecRef(&s_mem.num_allocations)
 #else
@@ -6428,7 +6428,11 @@ bool SDL_SetMemoryFunctions(SDL_malloc_func malloc_func,
 
 int SDL_GetNumAllocations(void)
 {
+#ifdef SDL_TRACK_ALLOCATION_COUNT
     return SDL_GetAtomicInt(&s_mem.num_allocations);
+#else
+    return -1;
+#endif
 }
 
 void *SDL_malloc(size_t size)
diff --git a/src/test/SDL_test_memory.c b/src/test/SDL_test_memory.c
index a28dec9ebf9bd..594acb3d6b88a 100644
--- a/src/test/SDL_test_memory.c
+++ b/src/test/SDL_test_memory.c
@@ -71,11 +71,8 @@ static SDL_malloc_func SDL_malloc_orig = NULL;
 static SDL_calloc_func SDL_calloc_orig = NULL;
 static SDL_realloc_func SDL_realloc_orig = NULL;
 static SDL_free_func SDL_free_orig = NULL;
-#ifdef TRACK_ALLOCATION_COUNT
 static int s_previous_allocations = 0;
-#else
 static int s_unknown_frees = 0;
-#endif
 static SDL_tracked_allocation *s_tracked_allocations[256];
 static bool s_randfill_allocations = false;
 static SDL_AtomicInt s_lock;
@@ -215,9 +212,9 @@ static void SDL_UntrackAllocation(void *mem)
         }
         prev = entry;
     }
-#ifndef TRACK_ALLOCATION_COUNT
-    s_unknown_frees += 1;
-#endif
+    if (s_tracked_allocations < 0) {
+        s_unknown_frees += 1;
+    }
     UNLOCK_ALLOCATOR();
 }
 
@@ -284,11 +281,9 @@ static void SDLCALL SDLTest_TrackedFree(void *ptr)
         return;
     }
 
-#ifdef TRACK_ALLOCATION_COUNT
-    if (!s_previous_allocations) {
+    if (s_previous_allocations == 0) {
         SDL_assert(SDL_IsAllocationTracked(ptr));
     }
-#endif
     SDL_UntrackAllocation(ptr);
     SDL_free_orig(ptr);
 }
@@ -301,14 +296,12 @@ void SDLTest_TrackAllocations(void)
 
     SDLTest_Crc32Init(&s_crc32_context);
 
-#ifdef TRACK_ALLOCATION_COUNT
     s_previous_allocations = SDL_GetNumAllocations();
-    if (s_previous_allocations != 0) {
+    if (s_previous_allocations < 0) {
+        SDL_Log("SDL was built without allocation count support, disabling free() validation");
+    } else if (s_previous_allocations != 0) {
         SDL_Log("SDLTest_TrackAllocations(): There are %d previous allocations, disabling free() validation", s_previous_allocations);
     }
-#else
-    SDL_Log("SDL was built without allocation count support, disabling free() validation");
-#endif
 #ifdef SDLTEST_UNWIND_NO_PROC_NAME_BY_IP
     do {
         /* Don't use SDL_GetHint: SDL_malloc is off limits. */
@@ -454,12 +447,10 @@ void SDLTest_LogAllocations(void)
     }
     (void)SDL_snprintf(line, sizeof(line), "Total: %.2f Kb in %d allocations", total_allocated / 1024.0, count);
     ADD_LINE();
-#ifndef TRACK_ALLOCATION_COUNT
     if (s_unknown_frees != 0) {
         (void)SDL_snprintf(line, sizeof(line), ", %d unknown frees", s_unknown_frees);
         ADD_LINE();
     }
-#endif
     (void)SDL_snprintf(line, sizeof(line), "\n");
     ADD_LINE();
 #undef ADD_LINE