From ce3be9028e11deb62fc4998791a02ed6b1f92895 Mon Sep 17 00:00:00 2001 From: havoc Date: Mon, 29 Jul 2002 07:06:52 +0000 Subject: [PATCH] disabled memory clumping, which surprisingly improves memory use, rather than hinders it (at least in Linux... hopefully same in windows) and massively speeds up loading of complicated maps git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@2110 d7cf8633-e32d-0410-b094-e92efae38249 --- zone.c | 20 ++++++++++++++++++++ zone.h | 13 ++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/zone.c b/zone.c index 57cedf6b..f5fdf73c 100644 --- a/zone.c +++ b/zone.c @@ -25,8 +25,10 @@ mempool_t *poolchain = NULL; void *_Mem_Alloc(mempool_t *pool, int size, char *filename, int fileline) { +#if MEMCLUMPING int i, j, k, needed, endbit, largest; memclump_t *clump, **clumpchainpointer; +#endif memheader_t *mem; if (size <= 0) return NULL; @@ -34,6 +36,7 @@ void *_Mem_Alloc(mempool_t *pool, int size, char *filename, int fileline) Sys_Error("Mem_Alloc: pool == NULL (alloc at %s:%i)", filename, fileline); Con_DPrintf("Mem_Alloc: pool %s, file %s:%i, size %i bytes\n", pool->name, filename, fileline, size); pool->totalsize += size; +#if MEMCLUMPING if (size < 4096) { // clumping @@ -90,12 +93,15 @@ choseclump: else { // big allocations are not clumped +#endif pool->realsize += sizeof(memheader_t) + size + sizeof(int); mem = malloc(sizeof(memheader_t) + size + sizeof(int)); if (mem == NULL) Sys_Error("Mem_Alloc: out of memory (alloc at %s:%i)", filename, fileline); +#if MEMCLUMPING mem->clump = NULL; } +#endif mem->filename = filename; mem->fileline = fileline; mem->size = size; @@ -112,8 +118,10 @@ choseclump: void _Mem_Free(void *data, char *filename, int fileline) { +#if MEMCLUMPING int i, firstblock, endblock; memclump_t *clump, **clumpchainpointer; +#endif memheader_t *mem, **memchainpointer; mempool_t *pool; if (data == NULL) @@ -133,6 +141,7 @@ void _Mem_Free(void *data, char *filename, int fileline) { *memchainpointer = mem->chain; pool->totalsize -= mem->size; +#if MEMCLUMPING if ((clump = mem->clump)) { if (clump->sentinel1 != MEMCLUMP_SENTINEL) @@ -172,10 +181,13 @@ void _Mem_Free(void *data, char *filename, int fileline) } else { +#endif pool->realsize -= sizeof(memheader_t) + mem->size + sizeof(int); memset(mem, 0xBF, sizeof(memheader_t) + mem->size + sizeof(int)); free(mem); +#if MEMCLUMPING } +#endif return; } } @@ -244,6 +256,7 @@ void _Mem_CheckSentinels(void *data, char *filename, int fileline) Sys_Error("Mem_CheckSentinels: trashed header sentinel 2 (block allocated at %s:%i, sentinel check at %s:%i)", mem->filename, mem->fileline, filename, fileline); } +#if MEMCLUMPING static void _Mem_CheckClumpSentinels(memclump_t *clump, char *filename, int fileline) { // this isn't really very useful @@ -252,19 +265,26 @@ static void _Mem_CheckClumpSentinels(memclump_t *clump, char *filename, int file if (clump->sentinel2 != MEMCLUMP_SENTINEL) Sys_Error("Mem_CheckClumpSentinels: trashed sentinel 2 (sentinel check at %s:%i)", filename, fileline); } +#endif void _Mem_CheckSentinelsGlobal(char *filename, int fileline) { memheader_t *mem; +#if MEMCLUMPING memclump_t *clump; +#endif mempool_t *pool; for (pool = poolchain;pool;pool = pool->next) +#if MEMCLUMPING { +#endif for (mem = pool->chain;mem;mem = mem->chain) _Mem_CheckSentinels((void *)((qbyte *) mem + sizeof(memheader_t)), filename, fileline); +#if MEMCLUMPING for (clump = pool->clumpchain;clump;clump = clump->chain) _Mem_CheckClumpSentinels(clump, filename, fileline); } +#endif } // used for temporary memory allocations around the engine, not for longterm diff --git a/zone.h b/zone.h index d50265fb..9cdd9ff9 100644 --- a/zone.h +++ b/zone.h @@ -21,17 +21,22 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef ZONE_H #define ZONE_H +// LordHavoc: this is pointless with a good C library +//#define MEMCLUMPING + #define POOLNAMESIZE 128 +#if MEMCLUMPING // give malloc padding so we can't waste most of a page at the end #define MEMCLUMPSIZE (65536 - 1536) // smallest unit we care about is this many bytes #define MEMUNIT 8 #define MEMBITS (MEMCLUMPSIZE / MEMUNIT) #define MEMBITINTS (MEMBITS / 32) +#define MEMCLUMP_SENTINEL 0xABADCAFE +#endif #define MEMHEADER_SENTINEL1 0xDEADF00D #define MEMHEADER_SENTINEL2 0xDF -#define MEMCLUMP_SENTINEL 0xABADCAFE typedef struct memheader_s { @@ -39,8 +44,10 @@ typedef struct memheader_s struct memheader_s *chain; // pool this memheader belongs to struct mempool_s *pool; +#if MEMCLUMPING // clump this memheader lives in, NULL if not in a clump struct memclump_s *clump; +#endif // size of the memory after the header (excluding header and sentinel2) int size; // file name and line where Mem_Alloc was called @@ -52,6 +59,7 @@ typedef struct memheader_s } memheader_t; +#if MEMCLUMPING typedef struct memclump_s { // contents of the clump @@ -72,13 +80,16 @@ typedef struct memclump_s struct memclump_s *chain; } memclump_t; +#endif typedef struct mempool_s { // chain of individual memory allocations struct memheader_s *chain; +#if MEMCLUMPING // chain of clumps (if any) struct memclump_s *clumpchain; +#endif // total memory allocated in this pool (inside memheaders) int totalsize; // total memory allocated in this pool (actual malloc total) -- 2.39.2