From 9ab9764b7a3ab107cfb3fa2d851dd21bdc8919f9 Mon Sep 17 00:00:00 2001 From: Adam Olsen Date: Wed, 5 Sep 2001 18:23:38 +0000 Subject: [PATCH] - Change QA_alloc to use variable-arguments, allowing for a much more extensible interface. --- include/QF/zone.h | 20 +++++++++++--------- libs/util/zone.c | 42 +++++++++++++++++++++++++++++++----------- 2 files changed, 42 insertions(+), 20 deletions(-) diff --git a/include/QF/zone.h b/include/QF/zone.h index 10cfbb534..1d5d83c0e 100644 --- a/include/QF/zone.h +++ b/include/QF/zone.h @@ -149,19 +149,21 @@ void *Cache_Get (cache_user_t *c); void *Cache_TryGet (cache_user_t *c); void Cache_Release (cache_user_t *c); -/* Modes, pick one */ -#define QA_NOFAIL 1 -#define QA_LATEFAIL 2 -#define QA_EARLYFAIL 3 +/* Flags */ +#define QA_NONE 0 +#define QA_FAILURE 1 +#define QA_PREVIOUS 2 +#define QA_SIZE 4 +#define QA_ZEROED 8 -#define _QA_MODEMASK 3 - -/* Flags, OR them with the mode */ -#define QA_ZEROED 4 +/* Modes used with the QA_FAILURE flag */ +#define QA_NOFAIL 1 +#define QA_LATEFAIL 2 +#define QA_EARLYFAIL 3 extern size_t (*QA_alloc_callback) (size_t size); -void *QA_alloc (void *ptr, size_t size, unsigned modes); +void *QA_alloc (unsigned modes, ...); void *QA_malloc (size_t size); void *QA_calloc (size_t nmemb, size_t size); void *QA_realloc (void *ptr, size_t size); diff --git a/libs/util/zone.c b/libs/util/zone.c index d63c87a55..eaae5416f 100644 --- a/libs/util/zone.c +++ b/libs/util/zone.c @@ -36,6 +36,7 @@ # include #endif +#include #include #undef MMAPPED_CACHE @@ -1047,30 +1048,49 @@ Cache_Release (cache_user_t *c) size_t (*QA_alloc_callback) (size_t size); void * -QA_alloc (void *ptr, size_t size, unsigned modes) +QA_alloc (unsigned flags, ...) { void *mem; + void *ptr = 0; + size_t size = 0; + qboolean zeroed = false; + int failure = QA_NOFAIL; + va_list ap; - if (modes & ~(_QA_MODEMASK | QA_ZEROED)) - Sys_Error ("QA_alloc: bad modes field: %u\n", modes); + if (flags & ~(QA_FAILURE | QA_PREVIOUS | QA_SIZE | QA_ZEROED)) + Sys_Error ("QA_alloc: bad flags: %u\n", flags); + + va_start (ap, flags); + if (flags & QA_PREVIOUS) + ptr = va_arg (ap, void *); + if (flags & QA_SIZE) + size = va_arg (ap, size_t); + if (flags & QA_ZEROED) + zeroed = true; + if (flags & QA_FAILURE) + failure = va_arg (ap, int); + va_end (ap); + + if (failure != QA_NOFAIL && failure != QA_LATEFAIL && failure != QA_EARLYFAIL) + Sys_Error ("QA_alloc: invalid failure type: %u\n", failure); if (size) { do { if (ptr) { - if (modes & QA_ZEROED) + if (zeroed) Sys_Error ("QA_alloc: Zeroing reallocated memory not yet supported\n"); else mem = realloc (ptr, size); } else { - if (modes & QA_ZEROED) + if (zeroed) mem = calloc (size, 1); else mem = malloc (size); } - } while ((modes & _QA_MODEMASK) != QA_EARLYFAIL && !mem + } while (failure != QA_EARLYFAIL && !mem && QA_alloc_callback && QA_alloc_callback (size)); - if (!mem && (modes & _QA_MODEMASK) == QA_NOFAIL) + if (!mem && failure == QA_NOFAIL) Sys_Error ("QA_alloc: could not allocate %d bytes!\n", size); return mem; @@ -1085,25 +1105,25 @@ QA_alloc (void *ptr, size_t size, unsigned modes) void * QA_malloc (size_t size) { - return QA_alloc (0, size, QA_NOFAIL); + return QA_alloc (QA_SIZE, size); } void * QA_calloc (size_t nmemb, size_t size) { - return QA_alloc (0, nmemb * size, QA_NOFAIL | QA_ZEROED); + return QA_alloc (QA_ZEROED | QA_SIZE, nmemb * size); } void * QA_realloc (void *ptr, size_t size) { - return QA_alloc (ptr, size, QA_NOFAIL); + return QA_alloc (QA_PREVIOUS | QA_SIZE, ptr, size); } void QA_free (void *ptr) { - QA_alloc (ptr, 0, QA_NOFAIL); + QA_alloc (QA_PREVIOUS, ptr); } char *