diff --git a/include/QF/zone.h b/include/QF/zone.h index 8845cf299..0cd55c66d 100644 --- a/include/QF/zone.h +++ b/include/QF/zone.h @@ -111,9 +111,12 @@ typedef struct memhunk_s memhunk_t; memhunk_t *Hunk_Init (void *buf, size_t size); void Hunk_Print (memhunk_t *hunk, qboolean all); void Hunk_Check (memhunk_t *hunk); +void *Hunk_RawAlloc (memhunk_t *hunk, size_t size) __attribute__((nonnull(1))); +void *Hunk_RawAllocName (memhunk_t *hunk, size_t size, const char *name) __attribute__((nonnull(1))); void *Hunk_Alloc (memhunk_t *hunk, size_t size); // returns 0 filled memory void *Hunk_AllocName (memhunk_t *hunk, size_t size, const char *name); size_t Hunk_LowMark (memhunk_t *hunk) __attribute__((pure)); +void Hunk_RawFreeToLowMark (memhunk_t *hunk, size_t mark) __attribute__((nonnull(1))); void Hunk_FreeToLowMark (memhunk_t *hunk, size_t mark); void *Hunk_TempAlloc (memhunk_t *hunk, size_t size); diff --git a/libs/util/zone.c b/libs/util/zone.c index f0297f8cd..275948126 100644 --- a/libs/util/zone.c +++ b/libs/util/zone.c @@ -541,6 +541,8 @@ Hunk_FreeToHighMark (memhunk_t *hunk, size_t mark) hunk->tempactive = false; Hunk_FreeToHighMark (hunk, hunk->tempmark); } + if (mark == hunk->high_used) + return; if (mark > hunk->high_used) Sys_Error ("Hunk_FreeToHighMark: bad mark %zd", mark); memset (hunk->base + hunk->size - hunk->high_used, 0, @@ -561,9 +563,8 @@ Hunk_HighMark (memhunk_t *hunk) } VISIBLE void * -Hunk_AllocName (memhunk_t *hunk, size_t size, const char *name) +Hunk_RawAllocName (memhunk_t *hunk, size_t size, const char *name) { - if (!hunk) { hunk = global_hunk; } //FIXME clean up callers hunkblk_t *h; #ifdef PARANOID @@ -592,8 +593,6 @@ Hunk_AllocName (memhunk_t *hunk, size_t size, const char *name) Cache_FreeLow (hunk, hunk->low_used); - memset (h, 0, size); - h->size = size; h->sentinal1 = HUNK_SENTINAL; h->sentinal2 = HUNK_SENTINAL; @@ -603,6 +602,21 @@ Hunk_AllocName (memhunk_t *hunk, size_t size, const char *name) return (void *) (h + 1); } +VISIBLE void * +Hunk_AllocName (memhunk_t *hunk, size_t size, const char *name) +{ + if (!hunk) { hunk = global_hunk; } //FIXME clean up callers + void *mem = Hunk_RawAllocName (hunk, size, name); + memset (mem, 0, size); + return mem; +} + +VISIBLE void * +Hunk_RawAlloc (memhunk_t *hunk, size_t size) +{ + return Hunk_RawAllocName (hunk, size, "unknown"); +} + VISIBLE void * Hunk_Alloc (memhunk_t *hunk, size_t size) { @@ -617,10 +631,22 @@ Hunk_LowMark (memhunk_t *hunk) return hunk->low_used; } +VISIBLE void +Hunk_RawFreeToLowMark (memhunk_t *hunk, size_t mark) +{ + if (mark == hunk->low_used) + return; + if (mark > hunk->low_used) + Sys_Error ("Hunk_FreeToLowMark: bad mark %zd", mark); + hunk->low_used = mark; +} + VISIBLE void Hunk_FreeToLowMark (memhunk_t *hunk, size_t mark) { if (!hunk) { hunk = global_hunk; } //FIXME clean up callers + if (mark == hunk->low_used) + return; if (mark > hunk->low_used) Sys_Error ("Hunk_FreeToLowMark: bad mark %zd", mark); memset (hunk->base + mark, 0, hunk->low_used - mark);