Support biased pointers to help memory debuggers

This commit is contained in:
Kp 2015-06-13 22:42:15 +00:00
parent 513e7c05e9
commit 8358dfcd0b
2 changed files with 37 additions and 15 deletions

View file

@ -29,6 +29,13 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
#define MEM_K 1.5 // Dynamic array growth factor
#ifdef DEBUG_BIAS_MEMORY_ALLOCATIONS
#include "compiler-array.h"
#define DXX_DEBUG_BIAS_MEMORY_ALLOCATION (sizeof(array<double, 2>))
#else
#define DXX_DEBUG_BIAS_MEMORY_ALLOCATION (0)
#endif
#ifdef DEBUG_MEMORY_ALLOCATIONS
void mem_init(void);
@ -50,10 +57,32 @@ void mem_validate_heap();
#else
#define mem_malloc(size,var,file,line) ((void)var,(void)file,(void)line,malloc((size)))
#define mem_calloc(nmemb,size,var,file,line) ((void)var,(void)file,(void)line,calloc((nmemb),(size)))
#define mem_realloc(ptr,size,var,file,line) ((void)var,(void)file,(void)line,realloc((ptr),(size)))
#define mem_free free
#ifdef DEBUG_BIAS_MEMORY_ALLOCATIONS
#define bias_malloc(SIZE) ({ \
auto p = malloc((SIZE) + DXX_DEBUG_BIAS_MEMORY_ALLOCATION); \
p ? p + DXX_DEBUG_BIAS_MEMORY_ALLOCATION : p; \
})
/* Bias calloc wastes a bit extra to keep the math simple */
#define bias_calloc(NMEMB,SIZE) ({ \
auto p = calloc((NMEMB), (SIZE) + DXX_DEBUG_BIAS_MEMORY_ALLOCATION); \
p ? p + DXX_DEBUG_BIAS_MEMORY_ALLOCATION : p; \
})
#define bias_realloc(PTR,SIZE) ({ \
auto p = realloc(reinterpret_cast<char *>(PTR) - DXX_DEBUG_BIAS_MEMORY_ALLOCATION, (SIZE) + DXX_DEBUG_BIAS_MEMORY_ALLOCATION); \
p ? p + DXX_DEBUG_BIAS_MEMORY_ALLOCATION : p; \
})
#define bias_free(PTR) free(reinterpret_cast<char *>(PTR) - DXX_DEBUG_BIAS_MEMORY_ALLOCATION)
#else
#define bias_malloc malloc
#define bias_calloc calloc
#define bias_realloc realloc
#define bias_free free
#endif
#define mem_malloc(size,var,file,line) ((void)var,(void)file,(void)line,bias_malloc((size)))
#define mem_calloc(nmemb,size,var,file,line) ((void)var,(void)file,(void)line,bias_calloc((nmemb),(size)))
#define mem_realloc(ptr,size,var,file,line) ((void)var,(void)file,(void)line,bias_realloc((ptr),(size)))
#define mem_free bias_free
static inline void mem_init(void)
{
@ -75,7 +104,6 @@ T *CALLOC(T *&r, std::size_t count, const char *var, const char *file, unsigned
}
#define d_malloc(size) mem_malloc((size),"Unknown", __FILE__,__LINE__ )
#define d_calloc(nmemb,size) mem_calloc((nmemb),(size),"Unknown", __FILE__,__LINE__ )
#define d_realloc(ptr,size) mem_realloc((ptr),(size),"Unknown", __FILE__,__LINE__ )
template <typename T>
static inline void d_free(T *&ptr)

View file

@ -57,10 +57,8 @@ static int free_list[MAX_INDEX];
static int num_blocks = 0;
static int Initialized = 0;
static int LargestIndex = 0;
int out_of_memory = 0;
static int out_of_memory = 0;
void mem_init()
{
@ -130,8 +128,7 @@ void *mem_malloc(size_t size, const char * var, const char * filename, unsigned
//con_printf(CON_CRITICAL, "\tBlock '%s' created in %s, line %d.", Varname[id], Filename[id], LineNum[id] );
Error( "MEM_OUT_OF_SLOTS" );
}
ptr = malloc( size+CHECKSIZE );
ptr = malloc(size + DXX_DEBUG_BIAS_MEMORY_ALLOCATION + CHECKSIZE);
if (ptr==NULL)
{
@ -140,7 +137,7 @@ void *mem_malloc(size_t size, const char * var, const char * filename, unsigned
con_printf(CON_CRITICAL, "\tBlock '%s' created in %s, line %d.", Varname[id], Filename[id], LineNum[id] );
Error( "MEM_OUT_OF_MEMORY" );
}
ptr = reinterpret_cast<char *>(ptr) + DXX_DEBUG_BIAS_MEMORY_ALLOCATION;
MallocBase[id] = ptr;
MallocSize[id] = size;
Varname[id] = var;
@ -238,7 +235,6 @@ void mem_free( void * buffer )
Int3();
return;
}
id = mem_find_id( buffer );
if (id==-1 && (!out_of_memory))
@ -253,6 +249,7 @@ void mem_free( void * buffer )
BytesMalloced -= MallocSize[id];
buffer = reinterpret_cast<char *>(buffer) - DXX_DEBUG_BIAS_MEMORY_ALLOCATION;
free( buffer );
Present[id] = 0;
@ -344,9 +341,6 @@ static unsigned int SmallestAddress = 0xFFFFFFF;
static unsigned int LargestAddress = 0x0;
static unsigned int BytesMalloced = 0;
#define CHECKSIZE 16
#define CHECKBYTE 0xFC
void mem_init()
{
Initialized = 1;