[zone] Make zone_error be like printf

It's so much nicer being able to just print normally.
This commit is contained in:
Bill Currie 2023-12-20 18:04:19 +09:00
parent 10451fac0d
commit 1266ede2b1
4 changed files with 63 additions and 43 deletions

View file

@ -94,6 +94,7 @@
typedef struct memzone_s memzone_t;
typedef struct memhunk_s memhunk_t;
typedef void (*zone_err_f) (void *data, const char *msg, ...) __attribute__((format(PRINTF,2,3)));
memhunk_t *Memory_Init (void *buf, size_t size);
@ -106,8 +107,7 @@ void *Z_TagMalloc (memzone_t *zone, size_t size, int tag);
void *Z_Realloc (memzone_t *zone, void *ptr, size_t size);
void Z_Print (memzone_t *zone);
void Z_CheckHeap (memzone_t *zone);
void Z_SetError (memzone_t *zone, void (*err) (void *data, const char *msg),
void *data);
void Z_SetError (memzone_t *zone, zone_err_f err, void *data);
void Z_CheckPointer (const memzone_t *zone, const void *ptr, size_t size);
int Z_IncRetainCount (memzone_t *zone, void *ptr);
int Z_DecRetainCount (memzone_t *zone, void *ptr);

View file

@ -67,10 +67,15 @@ SND_Memory_Init_Cvars (void)
Cvar_Register (&snd_mem_size_cvar, 0, 0);
}
static void
snd_zone_error (void *data, const char *msg)
static void __attribute__((format(PRINTF,2,3)))
snd_zone_error (void *data, const char *fmt, ...)
{
Sys_Error ("Sound: %s", msg);
va_list args;
dstring_t *msg = dstring_new ();
va_start (args, fmt);
dvsprintf (msg, fmt, args);
Sys_Error ("Sound: %s", msg->str);
}
static void

View file

@ -38,6 +38,7 @@
#include <stdarg.h>
#include "QF/cvar.h"
#include "QF/dstring.h"
#include "QF/mathlib.h"
#include "QF/progs.h"
#include "QF/sys.h"
@ -45,12 +46,17 @@
#include "compat.h"
static void
pr_zone_error (void *_pr, const char *msg)
static void __attribute__((format(PRINTF,2,3)))
pr_zone_error (void *_pr, const char *fmt, ...)
{
progs_t *pr = (progs_t *) _pr;
va_list args;
dstring_t *msg = dstring_new ();
va_start (args, fmt);
dvsprintf (msg, fmt, args);
Z_Print (pr->zone);
PR_RunError (pr, "%s", msg);
PR_RunError (pr, "%s", msg->str);
}
void

View file

@ -88,7 +88,7 @@ struct memzone_s {
size_t used; // ammount used, including header
size_t offset;
size_t ele_size;
void (*error) (void *, const char *);
zone_err_f error;
void *data;
memblock_t *rover;
memblock_t blocklist; // start / end cap for linked list
@ -111,8 +111,9 @@ z_offset (memzone_t *zone, memblock_t *block)
static void
z_error (memzone_t *zone, const char *msg)
{
if (zone->error)
zone->error (zone->data, msg);
if (zone->error) {
zone->error (zone->data, "%s", msg);
}
Sys_Error ("%s", msg);
}
@ -154,42 +155,45 @@ Z_Free (memzone_t *zone, void *ptr)
memblock_t *block, *other;
if (!ptr) {
if (zone->error)
if (zone->error) {
zone->error (zone->data, "Z_Free: NULL pointer");
}
Sys_Error ("Z_Free: NULL pointer");
}
block = (memblock_t *) ((byte *) ptr - sizeof (memblock_t));
if (((byte *) block < (byte *) zone)
|| (((byte *) block) >= (byte *) zone + zone->size)) {
const char *msg;
msg = nva ("Z_Free: freed a pointer outside of the zone: %x",
if (zone->error) {
zone->error (zone->data,
"Z_Free: freed a pointer outside of the zone: %x",
z_offset (zone, block));
}
Sys_Error ("Z_Free: freed a pointer outside of the zone: %x",
z_offset (zone, block));
if (zone->error)
zone->error (zone->data, msg);
Sys_Error ("%s", msg);
}
if (block->id != ZONEID/* || block->id2 != ZONEID*/) {
const char *msg;
msg = nva ("bad pointer %x", z_offset (zone, block));
Sys_Printf ("%s\n", msg);
Sys_Printf ("bad pointer %x", z_offset (zone, block));
Z_Print (zone);
fflush (stdout);
if (zone->error)
zone->error (zone->data, msg);
if (zone->error) {
zone->error (zone->data, "bad pointer %x", z_offset (zone, block));
}
Sys_Error ("Z_Free: freed a pointer without ZONEID");
}
if (block->tag == 0) {
if (zone->error)
if (zone->error) {
zone->error (zone->data, "Z_Free: freed a freed pointer");
}
Sys_Error ("Z_Free: freed a freed pointer");
}
if (block->retain) {
const char *msg = nva ("Z_Free: freed a retained pointer: %d",
if (zone->error) {
zone->error (zone->data, "Z_Free: freed a retained pointer: %d",
block->retain);
if (zone->error)
zone->error (zone->data, msg);
Sys_Error ("%s", msg);
}
Sys_Error ("Z_Free: freed a retained pointer: %d", block->retain);
}
}
block->tag = 0; // mark as free
@ -225,11 +229,11 @@ Z_Malloc (memzone_t *zone, size_t size)
buf = Z_TagMalloc (zone, size, 1);
if (!buf) {
const char *msg;
msg = nva ("Z_Malloc: failed on allocation of %zd bytes", size);
if (zone->error)
zone->error (zone->data, msg);
Sys_Error ("%s", msg);
if (zone->error) {
zone->error (zone->data,
"Z_Malloc: failed on allocation of %zd bytes", size);
}
Sys_Error ("Z_Malloc: failed on allocation of %zd bytes", size);
}
memset (buf, 0, size);
@ -247,8 +251,9 @@ Z_TagMalloc (memzone_t *zone, size_t size, int tag)
Z_CheckHeap (zone); // DEBUG
if (!tag) {
if (zone->error)
if (zone->error) {
zone->error (zone->data, "Z_TagMalloc: tried to use a 0 tag");
}
Sys_Error ("Z_TagMalloc: tried to use a 0 tag");
}
@ -318,14 +323,18 @@ Z_Realloc (memzone_t *zone, void *ptr, size_t size)
block = (memblock_t *) ((byte *) ptr - sizeof (memblock_t));
if (block->id != ZONEID/* || block->id2 != ZONEID*/) {
if (zone->error)
if (zone->error) {
zone->error (zone->data,
"Z_Realloc: realloced a pointer without ZONEID");
Sys_Error ("Z_Realloc: realloced a pointer without ZONEID");
"Z_Realloc: realloced a pointer without ZONEID: "
"%p (%x)", ptr, z_offset (zone, block));
}
Sys_Error ("Z_Realloc: realloced a pointer without ZONEID: %p (%x)",
ptr, z_offset (zone, block));
}
if (block->tag == 0) {
if (zone->error)
if (zone->error) {
zone->error (zone->data, "Z_Realloc: realloced a freed pointer");
}
Sys_Error ("Z_Realloc: realloced a freed pointer");
}
@ -337,11 +346,11 @@ Z_Realloc (memzone_t *zone, void *ptr, size_t size)
Z_Free (zone, ptr);
ptr = Z_TagMalloc (zone, size, 1);
if (!ptr) {
const char *msg;
msg = nva ("Z_Realloc: failed on allocation of %zd bytes", size);
if (zone->error)
zone->error (zone->data, msg);
Sys_Error ("%s", msg);
if (zone->error) {
zone->error (zone->data,
"Z_Realloc: failed on allocation of %zd bytes", size);
}
Sys_Error ("Z_Realloc: failed on allocation of %zd bytes", size);
}
if (ptr != old_ptr)
@ -414,7 +423,7 @@ Z_CheckHeap (memzone_t *zone)
}
VISIBLE void
Z_SetError (memzone_t *zone, void (*err) (void *, const char *), void *data)
Z_SetError (memzone_t *zone, zone_err_f err, void *data)
{
zone->error = err;
zone->data = data;