[util] Add raw versions of hunk alloc and free

They do not clear memory and thus are good for situations where speed is
more critical.
This commit is contained in:
Bill Currie 2021-07-29 11:44:10 +09:00
parent ca63c0360a
commit 8f376a48f8
2 changed files with 33 additions and 4 deletions

View file

@ -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);

View file

@ -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);