#include "quakedef.h"
-cvar_t developer_memory = {0, "developer_memory", "0"};
-cvar_t developer_memorydebug = {0, "developer_memorydebug", "0"};
+cvar_t developer_memory = {0, "developer_memory", "0", "prints debugging information about memory allocations"};
+cvar_t developer_memorydebug = {0, "developer_memorydebug", "0", "enables memory corruption checks (very slow)"};
mempool_t *poolchain = NULL;
clump->largestavailable = MEMBITS - needed;
j = 0;
choseclump:
- mem = (memheader_t *)((qbyte *) clump->block + j * MEMUNIT);
+ mem = (memheader_t *)((unsigned char *) clump->block + j * MEMUNIT);
mem->clump = clump;
clump->blocksinuse += needed;
for (i = j + needed;j < i;j++)
mem->pool = pool;
mem->sentinel1 = MEMHEADER_SENTINEL1;
// we have to use only a single byte for this sentinel, because it may not be aligned, and some platforms can't use unaligned accesses
- *((qbyte *) mem + sizeof(memheader_t) + mem->size) = MEMHEADER_SENTINEL2;
+ *((unsigned char *) mem + sizeof(memheader_t) + mem->size) = MEMHEADER_SENTINEL2;
// append to head of list
mem->next = pool->chain;
mem->prev = NULL;
pool->chain = mem;
if (mem->next)
mem->next->prev = mem;
- memset((void *)((qbyte *) mem + sizeof(memheader_t)), 0, mem->size);
- return (void *)((qbyte *) mem + sizeof(memheader_t));
+ memset((void *)((unsigned char *) mem + sizeof(memheader_t)), 0, mem->size);
+ return (void *)((unsigned char *) mem + sizeof(memheader_t));
}
void _Mem_Free(void *data, const char *filename, int fileline)
Sys_Error("Mem_Free: data is not allocated (called at %s:%i)", filename, fileline);
}
- mem = (memheader_t *)((qbyte *) data - sizeof(memheader_t));
+ mem = (memheader_t *)((unsigned char *) data - sizeof(memheader_t));
if (mem->sentinel1 != MEMHEADER_SENTINEL1)
Sys_Error("Mem_Free: trashed header sentinel 1 (alloc at %s:%i, free at %s:%i)", mem->filename, mem->fileline, filename, fileline);
- if (*((qbyte *) mem + sizeof(memheader_t) + mem->size) != MEMHEADER_SENTINEL2)
+ if (*((unsigned char *) mem + sizeof(memheader_t) + mem->size) != MEMHEADER_SENTINEL2)
Sys_Error("Mem_Free: trashed header sentinel 2 (alloc at %s:%i, free at %s:%i)", mem->filename, mem->fileline, filename, fileline);
pool = mem->pool;
if (developer.integer && developer_memory.integer)
Sys_Error("Mem_Free: trashed clump sentinel 1 (free at %s:%i)", filename, fileline);
if (clump->sentinel2 != MEMCLUMP_SENTINEL)
Sys_Error("Mem_Free: trashed clump sentinel 2 (free at %s:%i)", filename, fileline);
- firstblock = ((qbyte *) mem - (qbyte *) clump->block);
+ firstblock = ((unsigned char *) mem - (unsigned char *) clump->block);
if (firstblock & (MEMUNIT - 1))
Sys_Error("Mem_Free: address not valid in clump (free at %s:%i)", filename, fileline);
firstblock /= MEMUNIT;
// free memory owned by the pool
while ((*pool)->chain)
- _Mem_Free((void *)((qbyte *) (*pool)->chain + sizeof(memheader_t)), filename, fileline);
+ _Mem_Free((void *)((unsigned char *) (*pool)->chain + sizeof(memheader_t)), filename, fileline);
// free child pools, too
for(iter = poolchain; iter; temp = iter = iter->next)
// free memory owned by the pool
while (pool->chain)
- _Mem_Free((void *)((qbyte *) pool->chain + sizeof(memheader_t)), filename, fileline);
+ _Mem_Free((void *)((unsigned char *) pool->chain + sizeof(memheader_t)), filename, fileline);
// empty child pools, too
for(chainaddress = poolchain; chainaddress; chainaddress = chainaddress->next)
if (data == NULL)
Sys_Error("Mem_CheckSentinels: data == NULL (sentinel check at %s:%i)", filename, fileline);
- mem = (memheader_t *)((qbyte *) data - sizeof(memheader_t));
+ mem = (memheader_t *)((unsigned char *) data - sizeof(memheader_t));
if (mem->sentinel1 != MEMHEADER_SENTINEL1)
Sys_Error("Mem_CheckSentinels: trashed header sentinel 1 (block allocated at %s:%i, sentinel check at %s:%i)", mem->filename, mem->fileline, filename, fileline);
- if (*((qbyte *) mem + sizeof(memheader_t) + mem->size) != MEMHEADER_SENTINEL2)
+ if (*((unsigned char *) mem + sizeof(memheader_t) + mem->size) != MEMHEADER_SENTINEL2)
Sys_Error("Mem_CheckSentinels: trashed header sentinel 2 (block allocated at %s:%i, sentinel check at %s:%i)", mem->filename, mem->fileline, filename, fileline);
}
}
for (pool = poolchain;pool;pool = pool->next)
for (mem = pool->chain;mem;mem = mem->next)
- _Mem_CheckSentinels((void *)((qbyte *) mem + sizeof(memheader_t)), filename, fileline);
+ _Mem_CheckSentinels((void *)((unsigned char *) mem + sizeof(memheader_t)), filename, fileline);
#if MEMCLUMPING
for (pool = poolchain;pool;pool = pool->next)
for (clump = pool->clumpchain;clump;clump = clump->chain)
if (pool)
{
// search only one pool
- target = (memheader_t *)((qbyte *) data - sizeof(memheader_t));
+ target = (memheader_t *)((unsigned char *) data - sizeof(memheader_t));
for( header = pool->chain ; header ; header = header->next )
if( header == target )
return true;
void Memory_Init_Commands (void)
{
- Cmd_AddCommand ("memstats", MemStats_f);
- Cmd_AddCommand ("memlist", MemList_f);
+ Cmd_AddCommand ("memstats", MemStats_f, "prints memory system statistics");
+ Cmd_AddCommand ("memlist", MemList_f, "prints memory pool information (and individual allocations if used as memlist all)");
Cvar_RegisterVariable (&developer_memory);
Cvar_RegisterVariable (&developer_memorydebug);
}