From dd9bdab8dcf79bdf7bedd204530bb70ce73f1ce9 Mon Sep 17 00:00:00 2001 From: Spoike Date: Tue, 8 Mar 2022 05:30:30 +0000 Subject: [PATCH] Add ZG_Free function for zonegroup memory. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@6208 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/common/zone.c | 36 +++++++++++++++++++++++++++++++++++- engine/common/zone.h | 3 ++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/engine/common/zone.c b/engine/common/zone.c index cf84b6d1..af974267 100644 --- a/engine/common/zone.c +++ b/engine/common/zone.c @@ -540,7 +540,16 @@ typedef struct zonegroupblock_s { union { - struct zonegroupblock_s *next; + struct + { + struct zonegroupblock_s *next; + struct zonegroupblock_s *prev; +#ifdef _DEBUG + #define ZONEGROUP_SENTINAL 0x709ef00d + unsigned int sentinal; + unsigned int size; +#endif + }; vec4_t align16; }; } zonegroupblock_t; @@ -561,11 +570,36 @@ void *QDECL ZG_Malloc(zonegroup_t *ctx, size_t size) newm = Z_Malloc(size); #endif + newm->prev = NULL; + if (ctx->first) + ((zonegroupblock_t*)ctx->first)->prev = newm; newm->next = ctx->first; ctx->first = newm; ctx->totalbytes += size; + +#ifdef _DEBUG + newm->sentinal = ZONEGROUP_SENTINAL; + newm->size = size; +#endif return(void*)(newm+1); } +void ZG_Free(zonegroup_t *ctx, void *ptr) +{ + zonegroupblock_t *mem = (zonegroupblock_t*)ptr-1; + if (mem->prev) + mem->prev->next = mem->next; + else + ctx->first = mem->next; + if (mem->next) + mem->next->prev = mem->prev; + +#ifdef _DEBUG + if (mem->sentinal != ZONEGROUP_SENTINAL) + Sys_Error("Corrupt memory"); + ctx->totalbytes -= mem->size; +#endif + BZ_Free(mem); +} void ZG_FreeGroup(zonegroup_t *ctx) { zonegroupblock_t *old; diff --git a/engine/common/zone.h b/engine/common/zone.h index a3de3148..25decbd1 100644 --- a/engine/common/zone.h +++ b/engine/common/zone.h @@ -133,7 +133,8 @@ typedef struct zonegroup_s } zonegroup_t; void *QDECL ZG_Malloc(zonegroup_t *ctx, size_t size); void *ZG_MallocNamed(zonegroup_t *ctx, size_t size, char *file, int line); -void ZG_FreeGroup(zonegroup_t *ctx); +void QDECL ZG_Free(zonegroup_t *ctx, void *ptr); +void QDECL ZG_FreeGroup(zonegroup_t *ctx); #ifdef USE_MSVCRT_DEBUG #define BZ_Malloc(size) BZ_MallocNamed(size, __FILE__, __LINE__)