mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-06-02 15:47:31 +08:00
SDL_test: use mutex based on SDL_atomic_t in memory tracking
SDL_Mutex or SDL_SpinLock cannot be used as these use SDL_malloc internally.
Backport of c7a1876536
This commit is contained in:
committed by
Anonymous Maarten
parent
4eac44bed4
commit
1260ada519
@@ -20,6 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
#include "SDL_config.h"
|
#include "SDL_config.h"
|
||||||
#include "SDL_assert.h"
|
#include "SDL_assert.h"
|
||||||
|
#include "SDL_atomic.h"
|
||||||
#include "SDL_stdinc.h"
|
#include "SDL_stdinc.h"
|
||||||
#include "SDL_log.h"
|
#include "SDL_log.h"
|
||||||
#include "SDL_test_crc32.h"
|
#include "SDL_test_crc32.h"
|
||||||
@@ -53,6 +54,16 @@ static SDL_realloc_func SDL_realloc_orig = NULL;
|
|||||||
static SDL_free_func SDL_free_orig = NULL;
|
static SDL_free_func SDL_free_orig = NULL;
|
||||||
static int s_previous_allocations = 0;
|
static int s_previous_allocations = 0;
|
||||||
static SDL_tracked_allocation *s_tracked_allocations[256];
|
static SDL_tracked_allocation *s_tracked_allocations[256];
|
||||||
|
static SDL_atomic_t s_lock;
|
||||||
|
|
||||||
|
#define LOCK_ALLOCATOR() \
|
||||||
|
do { \
|
||||||
|
if (SDL_AtomicCAS(&s_lock, 0, 1)) { \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
SDL_CPUPauseInstruction(); \
|
||||||
|
} while (SDL_TRUE)
|
||||||
|
#define UNLOCK_ALLOCATOR() do { SDL_AtomicSet(&s_lock, 0); } while (0)
|
||||||
|
|
||||||
static unsigned int get_allocation_bucket(void *mem)
|
static unsigned int get_allocation_bucket(void *mem)
|
||||||
{
|
{
|
||||||
@@ -66,12 +77,17 @@ static unsigned int get_allocation_bucket(void *mem)
|
|||||||
static SDL_bool SDL_IsAllocationTracked(void *mem)
|
static SDL_bool SDL_IsAllocationTracked(void *mem)
|
||||||
{
|
{
|
||||||
SDL_tracked_allocation *entry;
|
SDL_tracked_allocation *entry;
|
||||||
int index = get_allocation_bucket(mem);
|
int index;
|
||||||
|
|
||||||
|
LOCK_ALLOCATOR();
|
||||||
|
index = get_allocation_bucket(mem);
|
||||||
for (entry = s_tracked_allocations[index]; entry; entry = entry->next) {
|
for (entry = s_tracked_allocations[index]; entry; entry = entry->next) {
|
||||||
if (mem == entry->mem) {
|
if (mem == entry->mem) {
|
||||||
|
UNLOCK_ALLOCATOR();
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
UNLOCK_ALLOCATOR();
|
||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,8 +99,10 @@ static void SDL_TrackAllocation(void *mem, size_t size)
|
|||||||
if (SDL_IsAllocationTracked(mem)) {
|
if (SDL_IsAllocationTracked(mem)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
LOCK_ALLOCATOR();
|
||||||
entry = (SDL_tracked_allocation *)SDL_malloc_orig(sizeof(*entry));
|
entry = (SDL_tracked_allocation *)SDL_malloc_orig(sizeof(*entry));
|
||||||
if (!entry) {
|
if (!entry) {
|
||||||
|
UNLOCK_ALLOCATOR();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
entry->mem = mem;
|
entry->mem = mem;
|
||||||
@@ -123,6 +141,7 @@ static void SDL_TrackAllocation(void *mem, size_t size)
|
|||||||
|
|
||||||
entry->next = s_tracked_allocations[index];
|
entry->next = s_tracked_allocations[index];
|
||||||
s_tracked_allocations[index] = entry;
|
s_tracked_allocations[index] = entry;
|
||||||
|
UNLOCK_ALLOCATOR();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SDL_UntrackAllocation(void *mem)
|
static void SDL_UntrackAllocation(void *mem)
|
||||||
@@ -130,6 +149,7 @@ static void SDL_UntrackAllocation(void *mem)
|
|||||||
SDL_tracked_allocation *entry, *prev;
|
SDL_tracked_allocation *entry, *prev;
|
||||||
int index = get_allocation_bucket(mem);
|
int index = get_allocation_bucket(mem);
|
||||||
|
|
||||||
|
LOCK_ALLOCATOR();
|
||||||
prev = NULL;
|
prev = NULL;
|
||||||
for (entry = s_tracked_allocations[index]; entry; entry = entry->next) {
|
for (entry = s_tracked_allocations[index]; entry; entry = entry->next) {
|
||||||
if (mem == entry->mem) {
|
if (mem == entry->mem) {
|
||||||
@@ -139,10 +159,12 @@ static void SDL_UntrackAllocation(void *mem)
|
|||||||
s_tracked_allocations[index] = entry->next;
|
s_tracked_allocations[index] = entry->next;
|
||||||
}
|
}
|
||||||
SDL_free_orig(entry);
|
SDL_free_orig(entry);
|
||||||
|
UNLOCK_ALLOCATOR();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
prev = entry;
|
prev = entry;
|
||||||
}
|
}
|
||||||
|
UNLOCK_ALLOCATOR();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *SDLCALL SDLTest_TrackedMalloc(size_t size)
|
static void *SDLCALL SDLTest_TrackedMalloc(size_t size)
|
||||||
|
|||||||
Reference in New Issue
Block a user