#define MEMHEADER_SENTINEL_FOR_ADDRESS(p) ((sentinel_seed ^ (unsigned int) (uintptr_t) (p)) + sentinel_seed)
unsigned int sentinel_seed;
+qboolean mem_bigendian = false;
+
// LordHavoc: enables our own low-level allocator (instead of malloc)
#define MEMCLUMPING 0
#define MEMCLUMPING_FREECLUMPS 0
// smallest unit we care about is this many bytes
#define MEMUNIT 128
// try to do 32MB clumps, but overhead eats into this
-#define MEMWANTCLUMPSIZE (1<<29)
+#define MEMWANTCLUMPSIZE (1<<27)
// give malloc padding so we can't waste most of a page at the end
#define MEMCLUMPSIZE (MEMWANTCLUMPSIZE - MEMWANTCLUMPSIZE/MEMUNIT/32 - 128)
#define MEMBITS (MEMCLUMPSIZE / MEMUNIT)
static mempool_t *poolchain = NULL;
+void Mem_PrintStats(void);
+void Mem_PrintList(size_t minallocationsize);
+
#if MEMCLUMPING != 2
// some platforms have a malloc that returns NULL but succeeds later
// (Windows growing its swapfile for example)
}
if (pool == NULL)
Sys_Error("Mem_Alloc: pool == NULL (alloc at %s:%i)", filename, fileline);
- if (developer.integer && developer_memory.integer)
- Con_Printf("Mem_Alloc: pool %s, file %s:%i, size %i bytes\n", pool->name, filename, fileline, (int)size);
+ if (developer_memory.integer)
+ Con_DPrintf("Mem_Alloc: pool %s, file %s:%i, size %i bytes\n", pool->name, filename, fileline, (int)size);
//if (developer.integer && developer_memorydebug.integer)
// _Mem_CheckSentinelsGlobal(filename, fileline);
pool->totalsize += size;
pool->realsize += realsize;
base = (unsigned char *)Clump_AllocBlock(realsize);
if (base== NULL)
+ {
+ Mem_PrintList(0);
+ Mem_PrintStats();
+ Mem_PrintList(1<<30);
+ Mem_PrintStats();
Sys_Error("Mem_Alloc: out of memory (alloc at %s:%i)", filename, fileline);
+ }
// calculate address that aligns the end of the memheader_t to the specified alignment
mem = (memheader_t*)((((size_t)base + sizeof(memheader_t) + (alignment-1)) & ~(alignment-1)) - sizeof(memheader_t));
mem->baseaddress = (void*)base;
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)
- Con_Printf("Mem_Free: pool %s, alloc %s:%i, free %s:%i, size %i bytes\n", pool->name, mem->filename, mem->fileline, filename, fileline, (int)(mem->size));
+ if (developer_memory.integer)
+ Con_DPrintf("Mem_Free: pool %s, alloc %s:%i, free %s:%i, size %i bytes\n", pool->name, mem->filename, mem->fileline, filename, fileline, (int)(mem->size));
// unlink memheader from doubly linked list
if ((mem->prev ? mem->prev->next != mem : pool->chain != mem) || (mem->next && mem->next->prev != mem))
Sys_Error("Mem_Free: not allocated or double freed (free at %s:%i)", filename, fileline);
return;
}
- if (developer.integer && developer_memorydebug.integer)
+ if (developer_memorydebug.integer)
{
//_Mem_CheckSentinelsGlobal(filename, fileline);
if (!Mem_IsAllocated(NULL, data))
mempool_t *_Mem_AllocPool(const char *name, int flags, mempool_t *parent, const char *filename, int fileline)
{
mempool_t *pool;
- //if (developer.integer && developer_memorydebug.integer)
- // _Mem_CheckSentinelsGlobal(filename, fileline);
+ if (developer_memorydebug.integer)
+ _Mem_CheckSentinelsGlobal(filename, fileline);
pool = (mempool_t *)Clump_AllocBlock(sizeof(mempool_t));
if (pool == NULL)
+ {
+ Mem_PrintList(0);
+ Mem_PrintStats();
+ Mem_PrintList(1<<30);
+ Mem_PrintStats();
Sys_Error("Mem_AllocPool: out of memory (allocpool at %s:%i)", filename, fileline);
+ }
memset(pool, 0, sizeof(mempool_t));
pool->sentinel1 = MEMHEADER_SENTINEL_FOR_ADDRESS(&pool->sentinel1);
pool->sentinel2 = MEMHEADER_SENTINEL_FOR_ADDRESS(&pool->sentinel2);
mempool_t *pool = *poolpointer;
mempool_t **chainaddress, *iter, *temp;
- //if (developer.integer && developer_memorydebug.integer)
- // _Mem_CheckSentinelsGlobal(filename, fileline);
+ if (developer_memorydebug.integer)
+ _Mem_CheckSentinelsGlobal(filename, fileline);
if (pool)
{
// unlink pool from chain
{
mempool_t *chainaddress;
- if (developer.integer && developer_memorydebug.integer)
+ if (developer_memorydebug.integer)
{
//_Mem_CheckSentinelsGlobal(filename, fileline);
// check if this pool is in the poolchain
"size name\n");
for (pool = poolchain;pool;pool = pool->next)
{
- Con_Printf("%10luk (%10luk actual) %s (%+li byte change) %s\n", (unsigned long) ((pool->totalsize + 1023) / 1024), (unsigned long)((pool->realsize + 1023) / 1024), pool->name, (long)pool->totalsize - pool->lastchecksize, (pool->flags & POOLFLAG_TEMP) ? "TEMP" : "");
+ Con_Printf("%10luk (%10luk actual) %s (%+li byte change) %s\n", (unsigned long) ((pool->totalsize + 1023) / 1024), (unsigned long)((pool->realsize + 1023) / 1024), pool->name, (long)(pool->totalsize - pool->lastchecksize), (pool->flags & POOLFLAG_TEMP) ? "TEMP" : "");
pool->lastchecksize = pool->totalsize;
for (mem = pool->chain;mem;mem = mem->next)
if (mem->size >= minallocationsize)
*/
void Memory_Init (void)
{
+ static union {unsigned short s;unsigned char b[2];} u;
+ u.s = 0x100;
+ mem_bigendian = u.b[0];
+
sentinel_seed = rand();
poolchain = NULL;
tempmempool = Mem_AllocPool("Temporary Memory", POOLFLAG_TEMP, NULL);