From fa06dd40f48b20d738b6bd604758c81defd76cfd Mon Sep 17 00:00:00 2001 From: bones_was_here Date: Thu, 25 Jan 2024 16:25:48 +1000 Subject: [PATCH] Update and micro-optimise memory allocation The max alignment requirement no longer needs to be hard-coded. We were allocating slightly more than necessary for alignment padding. Makes a (currently unused) macro more useful and robust. Fixes bitfield data type. Signed-off-by: bones_was_here --- zone.c | 7 ++++--- zone.h | 12 +++++++----- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/zone.c b/zone.c index 81525e4a..f2888895 100644 --- a/zone.c +++ b/zone.c @@ -397,7 +397,8 @@ void *_Mem_Alloc(mempool_t *pool, void *olddata, size_t size, size_t alignment, //if (developer.integer > 0 && developer_memorydebug.integer) // _Mem_CheckSentinelsGlobal(filename, fileline); pool->totalsize += size; - realsize = alignment + sizeof(memheader_t) + size + sizeof(sentinel2); + // calculate the smallest realsize that is a multiple of alignment + realsize = (sizeof(memheader_t) + size + sizeof(sentinel2) + (alignment-1)) & ~(alignment-1); pool->realsize += realsize; base = (unsigned char *)Clump_AllocBlock(realsize); if (base == NULL) @@ -497,7 +498,7 @@ void _Mem_Free(void *data, const char *filename, int fileline) _Mem_FreeBlock((memheader_t *)((unsigned char *) data - sizeof(memheader_t)), filename, fileline); } -mempool_t *_Mem_AllocPool(const char *name, int flags, mempool_t *parent, const char *filename, int fileline) +mempool_t *_Mem_AllocPool(const char *name, unsigned flags, mempool_t *parent, const char *filename, int fileline) { mempool_t *pool; if (developer_memorydebug.integer) @@ -813,7 +814,7 @@ void Mem_PrintStats(void) { if ((pool->flags & POOLFLAG_TEMP) && !List_Is_Empty(&pool->chain)) { - Con_Printf("Memory pool %p has sprung a leak totalling %lu bytes (%.3fMB)! Listing contents...\n", (void *)pool, (unsigned long)pool->totalsize, pool->totalsize / 1048576.0); + Con_Printf(CON_WARN "Memory pool %p has sprung a leak totalling %lu bytes (%.3fMB)! Listing contents...\n", (void *)pool, (unsigned long)pool->totalsize, pool->totalsize / 1048576.0); List_For_Each_Entry(mem, &pool->chain, memheader_t, list) Con_Printf("%10lu bytes allocated at %s:%i\n", (unsigned long)mem->size, mem->filename, mem->fileline); } diff --git a/zone.h b/zone.h index 3dec0b62..12216f96 100644 --- a/zone.h +++ b/zone.h @@ -22,6 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define ZONE_H #include +#include #include "qtypes.h" #include "qdefs.h" #include "com_list.h" @@ -61,7 +62,7 @@ typedef struct mempool_s // chain of individual memory allocations struct llist_s chain; // POOLFLAG_* - int flags; + unsigned flags; // total memory allocated in this pool (inside memheaders) size_t totalsize; // total memory allocated in this pool (actual malloc total) @@ -82,9 +83,10 @@ typedef struct mempool_s } mempool_t; -#define Mem_Alloc(pool,size) _Mem_Alloc(pool, NULL, size, 16, __FILE__, __LINE__) -#define Mem_Memalign(pool,alignment,size) _Mem_Alloc(pool, NULL, size, alignment, __FILE__, __LINE__) -#define Mem_Realloc(pool,data,size) _Mem_Alloc(pool, data, size, 16, __FILE__, __LINE__) +#define Mem_Alloc(pool,size) _Mem_Alloc(pool, NULL, size, alignof(max_align_t), __FILE__, __LINE__) +#define Mem_AllocType(pool,type,size) (type *)_Mem_Alloc(pool, NULL, size, alignof(type), __FILE__, __LINE__) +#define Mem_Realloc(pool,data,size) _Mem_Alloc(pool, data, size, alignof(max_align_t), __FILE__, __LINE__) +#define Mem_ReallocType(pool,data,type,size) (type *)_Mem_Alloc(pool, data, size, alignof(type), __FILE__, __LINE__) #define Mem_Free(mem) _Mem_Free(mem, __FILE__, __LINE__) #define Mem_strdup(pool, s) _Mem_strdup(pool, s, __FILE__, __LINE__) #define Mem_CheckSentinels(data) _Mem_CheckSentinels(data, __FILE__, __LINE__) @@ -99,7 +101,7 @@ mempool_t; void *_Mem_Alloc(mempool_t *pool, void *data, size_t size, size_t alignment, const char *filename, int fileline); void _Mem_Free(void *data, const char *filename, int fileline); -mempool_t *_Mem_AllocPool(const char *name, int flags, mempool_t *parent, const char *filename, int fileline); +mempool_t *_Mem_AllocPool(const char *name, unsigned flags, mempool_t *parent, const char *filename, int fileline); void _Mem_FreePool(mempool_t **pool, const char *filename, int fileline); void _Mem_EmptyPool(mempool_t *pool, const char *filename, int fileline); void _Mem_CheckSentinels(void *data, const char *filename, int fileline); -- 2.39.2