mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-05-31 00:30:57 +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 memzone_s memzone_t;
|
||||||
typedef struct memhunk_s memhunk_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);
|
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_Realloc (memzone_t *zone, void *ptr, size_t size);
|
||||||
void Z_Print (memzone_t *zone);
|
void Z_Print (memzone_t *zone);
|
||||||
void Z_CheckHeap (memzone_t *zone);
|
void Z_CheckHeap (memzone_t *zone);
|
||||||
void Z_SetError (memzone_t *zone, void (*err) (void *data, const char *msg),
|
void Z_SetError (memzone_t *zone, zone_err_f err, void *data);
|
||||||
void *data);
|
|
||||||
void Z_CheckPointer (const memzone_t *zone, const void *ptr, size_t size);
|
void Z_CheckPointer (const memzone_t *zone, const void *ptr, size_t size);
|
||||||
int Z_IncRetainCount (memzone_t *zone, void *ptr);
|
int Z_IncRetainCount (memzone_t *zone, void *ptr);
|
||||||
int Z_DecRetainCount (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);
|
Cvar_Register (&snd_mem_size_cvar, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void __attribute__((format(PRINTF,2,3)))
|
||||||
snd_zone_error (void *data, const char *msg)
|
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
|
static void
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
#include "QF/cvar.h"
|
#include "QF/cvar.h"
|
||||||
|
#include "QF/dstring.h"
|
||||||
#include "QF/mathlib.h"
|
#include "QF/mathlib.h"
|
||||||
#include "QF/progs.h"
|
#include "QF/progs.h"
|
||||||
#include "QF/sys.h"
|
#include "QF/sys.h"
|
||||||
|
@ -45,12 +46,17 @@
|
||||||
|
|
||||||
#include "compat.h"
|
#include "compat.h"
|
||||||
|
|
||||||
static void
|
static void __attribute__((format(PRINTF,2,3)))
|
||||||
pr_zone_error (void *_pr, const char *msg)
|
pr_zone_error (void *_pr, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
progs_t *pr = (progs_t *) _pr;
|
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);
|
Z_Print (pr->zone);
|
||||||
PR_RunError (pr, "%s", msg);
|
PR_RunError (pr, "%s", msg->str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -88,7 +88,7 @@ struct memzone_s {
|
||||||
size_t used; // ammount used, including header
|
size_t used; // ammount used, including header
|
||||||
size_t offset;
|
size_t offset;
|
||||||
size_t ele_size;
|
size_t ele_size;
|
||||||
void (*error) (void *, const char *);
|
zone_err_f error;
|
||||||
void *data;
|
void *data;
|
||||||
memblock_t *rover;
|
memblock_t *rover;
|
||||||
memblock_t blocklist; // start / end cap for linked list
|
memblock_t blocklist; // start / end cap for linked list
|
||||||
|
@ -111,8 +111,9 @@ z_offset (memzone_t *zone, memblock_t *block)
|
||||||
static void
|
static void
|
||||||
z_error (memzone_t *zone, const char *msg)
|
z_error (memzone_t *zone, const char *msg)
|
||||||
{
|
{
|
||||||
if (zone->error)
|
if (zone->error) {
|
||||||
zone->error (zone->data, msg);
|
zone->error (zone->data, "%s", msg);
|
||||||
|
}
|
||||||
Sys_Error ("%s", msg);
|
Sys_Error ("%s", msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,42 +155,45 @@ Z_Free (memzone_t *zone, void *ptr)
|
||||||
memblock_t *block, *other;
|
memblock_t *block, *other;
|
||||||
|
|
||||||
if (!ptr) {
|
if (!ptr) {
|
||||||
if (zone->error)
|
if (zone->error) {
|
||||||
zone->error (zone->data, "Z_Free: NULL pointer");
|
zone->error (zone->data, "Z_Free: NULL pointer");
|
||||||
|
}
|
||||||
Sys_Error ("Z_Free: NULL pointer");
|
Sys_Error ("Z_Free: NULL pointer");
|
||||||
}
|
}
|
||||||
|
|
||||||
block = (memblock_t *) ((byte *) ptr - sizeof (memblock_t));
|
block = (memblock_t *) ((byte *) ptr - sizeof (memblock_t));
|
||||||
if (((byte *) block < (byte *) zone)
|
if (((byte *) block < (byte *) zone)
|
||||||
|| (((byte *) block) >= (byte *) zone + zone->size)) {
|
|| (((byte *) block) >= (byte *) zone + zone->size)) {
|
||||||
const char *msg;
|
if (zone->error) {
|
||||||
msg = nva ("Z_Free: freed a pointer outside of the zone: %x",
|
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));
|
z_offset (zone, block));
|
||||||
if (zone->error)
|
|
||||||
zone->error (zone->data, msg);
|
|
||||||
Sys_Error ("%s", msg);
|
|
||||||
}
|
}
|
||||||
if (block->id != ZONEID/* || block->id2 != ZONEID*/) {
|
if (block->id != ZONEID/* || block->id2 != ZONEID*/) {
|
||||||
const char *msg;
|
Sys_Printf ("bad pointer %x", z_offset (zone, block));
|
||||||
msg = nva ("bad pointer %x", z_offset (zone, block));
|
|
||||||
Sys_Printf ("%s\n", msg);
|
|
||||||
Z_Print (zone);
|
Z_Print (zone);
|
||||||
fflush (stdout);
|
fflush (stdout);
|
||||||
if (zone->error)
|
if (zone->error) {
|
||||||
zone->error (zone->data, msg);
|
zone->error (zone->data, "bad pointer %x", z_offset (zone, block));
|
||||||
|
}
|
||||||
Sys_Error ("Z_Free: freed a pointer without ZONEID");
|
Sys_Error ("Z_Free: freed a pointer without ZONEID");
|
||||||
}
|
}
|
||||||
if (block->tag == 0) {
|
if (block->tag == 0) {
|
||||||
if (zone->error)
|
if (zone->error) {
|
||||||
zone->error (zone->data, "Z_Free: freed a freed pointer");
|
zone->error (zone->data, "Z_Free: freed a freed pointer");
|
||||||
|
}
|
||||||
Sys_Error ("Z_Free: freed a freed pointer");
|
Sys_Error ("Z_Free: freed a freed pointer");
|
||||||
}
|
}
|
||||||
if (block->retain) {
|
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);
|
block->retain);
|
||||||
if (zone->error)
|
}
|
||||||
zone->error (zone->data, msg);
|
Sys_Error ("Z_Free: freed a retained pointer: %d", block->retain);
|
||||||
Sys_Error ("%s", msg);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
block->tag = 0; // mark as free
|
block->tag = 0; // mark as free
|
||||||
|
@ -225,11 +229,11 @@ Z_Malloc (memzone_t *zone, size_t size)
|
||||||
|
|
||||||
buf = Z_TagMalloc (zone, size, 1);
|
buf = Z_TagMalloc (zone, size, 1);
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
const char *msg;
|
if (zone->error) {
|
||||||
msg = nva ("Z_Malloc: failed on allocation of %zd bytes", size);
|
zone->error (zone->data,
|
||||||
if (zone->error)
|
"Z_Malloc: failed on allocation of %zd bytes", size);
|
||||||
zone->error (zone->data, msg);
|
}
|
||||||
Sys_Error ("%s", msg);
|
Sys_Error ("Z_Malloc: failed on allocation of %zd bytes", size);
|
||||||
}
|
}
|
||||||
memset (buf, 0, size);
|
memset (buf, 0, size);
|
||||||
|
|
||||||
|
@ -247,8 +251,9 @@ Z_TagMalloc (memzone_t *zone, size_t size, int tag)
|
||||||
Z_CheckHeap (zone); // DEBUG
|
Z_CheckHeap (zone); // DEBUG
|
||||||
|
|
||||||
if (!tag) {
|
if (!tag) {
|
||||||
if (zone->error)
|
if (zone->error) {
|
||||||
zone->error (zone->data, "Z_TagMalloc: tried to use a 0 tag");
|
zone->error (zone->data, "Z_TagMalloc: tried to use a 0 tag");
|
||||||
|
}
|
||||||
Sys_Error ("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));
|
block = (memblock_t *) ((byte *) ptr - sizeof (memblock_t));
|
||||||
if (block->id != ZONEID/* || block->id2 != ZONEID*/) {
|
if (block->id != ZONEID/* || block->id2 != ZONEID*/) {
|
||||||
if (zone->error)
|
if (zone->error) {
|
||||||
zone->error (zone->data,
|
zone->error (zone->data,
|
||||||
"Z_Realloc: realloced a pointer without ZONEID");
|
"Z_Realloc: realloced a pointer without ZONEID: "
|
||||||
Sys_Error ("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 (block->tag == 0) {
|
||||||
if (zone->error)
|
if (zone->error) {
|
||||||
zone->error (zone->data, "Z_Realloc: realloced a freed pointer");
|
zone->error (zone->data, "Z_Realloc: realloced a freed pointer");
|
||||||
|
}
|
||||||
Sys_Error ("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);
|
Z_Free (zone, ptr);
|
||||||
ptr = Z_TagMalloc (zone, size, 1);
|
ptr = Z_TagMalloc (zone, size, 1);
|
||||||
if (!ptr) {
|
if (!ptr) {
|
||||||
const char *msg;
|
if (zone->error) {
|
||||||
msg = nva ("Z_Realloc: failed on allocation of %zd bytes", size);
|
zone->error (zone->data,
|
||||||
if (zone->error)
|
"Z_Realloc: failed on allocation of %zd bytes", size);
|
||||||
zone->error (zone->data, msg);
|
}
|
||||||
Sys_Error ("%s", msg);
|
Sys_Error ("Z_Realloc: failed on allocation of %zd bytes", size);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ptr != old_ptr)
|
if (ptr != old_ptr)
|
||||||
|
@ -414,7 +423,7 @@ Z_CheckHeap (memzone_t *zone)
|
||||||
}
|
}
|
||||||
|
|
||||||
VISIBLE void
|
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->error = err;
|
||||||
zone->data = data;
|
zone->data = data;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue