[zone] Be more consistent with pointer to block conversion

Most importantly, the error checking is consistent.
This commit is contained in:
Bill Currie 2023-12-20 18:37:47 +09:00
parent 1266ede2b1
commit de7293c16a

View file

@ -108,6 +108,31 @@ z_offset (memzone_t *zone, memblock_t *block)
return offset / zone->ele_size + zone->offset;
}
static memblock_t *
_z_ptr_block (memzone_t *zone, void *ptr, const char *func)
{
auto block = (memblock_t *) ptr - 1;
if (((byte *) block < (byte *) zone)
|| (((byte *) block) >= (byte *) zone + zone->size)) {
if (zone->error) {
zone->error (zone->data, "%s: pointer outside of zone: %x", func,
z_offset (zone, block));
}
Sys_Error ("%s: pointer outside of zone: %x", func,
z_offset (zone, block));
}
if (block->id != ZONEID/* || block->id2 != ZONEID*/) {
if (zone->error) {
zone->error (zone->data, "%s: zone without ZONEID: %p (%x)",
func, ptr, z_offset (zone, block));
}
Sys_Error ("%s: zone without ZONEID: %p (%x)",
func, ptr, z_offset (zone, block));
}
return block;
}
#define z_ptr_block(zone, ptr) _z_ptr_block (zone, ptr, __FUNCTION__)
static void
z_error (memzone_t *zone, const char *msg)
{
@ -161,26 +186,7 @@ Z_Free (memzone_t *zone, void *ptr)
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)) {
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 (block->id != ZONEID/* || block->id2 != ZONEID*/) {
Sys_Printf ("bad pointer %x", z_offset (zone, block));
Z_Print (zone);
fflush (stdout);
if (zone->error) {
zone->error (zone->data, "bad pointer %x", z_offset (zone, block));
}
Sys_Error ("Z_Free: freed a pointer without ZONEID");
}
block = z_ptr_block (zone, ptr);
if (block->tag == 0) {
if (zone->error) {
zone->error (zone->data, "Z_Free: freed a freed pointer");
@ -321,16 +327,7 @@ Z_Realloc (memzone_t *zone, void *ptr, size_t size)
if (developer & SYS_zone)
Z_CheckHeap (zone); // DEBUG
block = (memblock_t *) ((byte *) ptr - sizeof (memblock_t));
if (block->id != ZONEID/* || block->id2 != ZONEID*/) {
if (zone->error) {
zone->error (zone->data,
"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));
}
block = z_ptr_block (zone, ptr);
if (block->tag == 0) {
if (zone->error) {
zone->error (zone->data, "Z_Realloc: realloced a freed pointer");
@ -455,7 +452,7 @@ Z_CheckPointer (const memzone_t *zone, const void *ptr, size_t size)
VISIBLE int
Z_IncRetainCount (memzone_t *zone, void *ptr)
{
memblock_t *block = (memblock_t *) ((byte *) ptr - sizeof (memblock_t));
memblock_t *block = z_ptr_block (zone, ptr);
if (!++block->retain) {
z_error (zone, "inc retain count wrapped to 0");
}
@ -465,7 +462,7 @@ Z_IncRetainCount (memzone_t *zone, void *ptr)
VISIBLE int
Z_DecRetainCount (memzone_t *zone, void *ptr)
{
memblock_t *block = (memblock_t *) ((byte *) ptr - sizeof (memblock_t));
memblock_t *block = z_ptr_block (zone, ptr);
if (--block->retain == -1) {
z_error (zone, "dec retain count wrapped past 0");
}
@ -475,14 +472,14 @@ Z_DecRetainCount (memzone_t *zone, void *ptr)
VISIBLE int
Z_GetRetainCount (memzone_t *zone, void *ptr)
{
memblock_t *block = (memblock_t *) ((byte *) ptr - sizeof (memblock_t));
memblock_t *block = z_ptr_block (zone, ptr);
return block->retain;
}
VISIBLE int
Z_GetTag (memzone_t *zone, void *ptr)
{
memblock_t *block = (memblock_t *) ((byte *) ptr - sizeof (memblock_t));
memblock_t *block = z_ptr_block (zone, ptr);
return block->tag;
}
@ -492,7 +489,7 @@ Z_SetTag (memzone_t *zone, void *ptr, int tag)
if (!tag) {
z_error (zone, "Attept to set tag to 0");
}
memblock_t *block = (memblock_t *) ((byte *) ptr - sizeof (memblock_t));
memblock_t *block = z_ptr_block (zone, ptr);
block->tag = tag;
}
VISIBLE void