mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-04-07 01:42:04 +00:00
[zone] Make zone_error be like printf
It's so much nicer being able to just print normally.
This commit is contained in:
parent
10451fac0d
commit
1266ede2b1
4 changed files with 63 additions and 43 deletions
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue