// Frees a block of memory... // void Z_Free(void *pvAddress) { zoneHeader_t *pMemory = ((zoneHeader_t *)pvAddress) - 1; if (pMemory->eTag == TAG_STATIC) { return; } #ifdef DETAILED_ZONE_DEBUG_CODE // // check this error *before* barfing on bad magics... // int& iAllocCount = mapAllocatedZones[pMemory]; if (iAllocCount <= 0) { Com_Error(ERR_FATAL, "Z_Free(): Block already-freed, or not allocated through Z_Malloc!"); return; } #endif if (pMemory->iMagic != ZONE_MAGIC) { Com_Error(ERR_FATAL, "Z_Free(): Corrupt zone header!"); return; } if (ZoneTailFromHeader(pMemory)->iMagic != ZONE_MAGIC) { Com_Error(ERR_FATAL, "Z_Free(): Corrupt zone tail!"); return; } Zone_FreeBlock(pMemory); }
// Frees all blocks with the specified tag... // void Z_TagFree(memtag_t eTag) { //#ifdef _DEBUG // int iZoneBlocks = TheZone.Stats.iCount; //#endif zoneHeader_t *pMemory = TheZone.Header.pNext; while (pMemory) { zoneHeader_t *pNext = pMemory->pNext; if ( (eTag == TAG_ALL) || (pMemory->eTag == eTag)) { Zone_FreeBlock(pMemory); } pMemory = pNext; } // these stupid pragmas don't work here???!?!?! // //#ifdef _DEBUG //#pragma warning( disable : 4189) // int iBlocksFreed = iZoneBlocks - TheZone.Stats.iCount; //#pragma warning( default : 4189) //#endif }
// Frees a block of memory... // int Z_Free(void *pvAddress) { if (!TheZone.Stats.iCount) { //Com_Error(ERR_FATAL, "Z_Free(): Zone has been cleard already!"); Com_Printf("Z_Free(%x): Zone has been cleard already!\n",pvAddress); return -1; } zoneHeader_t *pMemory = ((zoneHeader_t *)pvAddress) - 1; #if 1 //debugging double free if (pMemory->iMagic == 'FREE') { Com_Error(ERR_FATAL, "Z_Free(%s): Block already-freed, or not allocated through Z_Malloc!",pvAddress); return -1; } #endif if (pMemory->eTag == TAG_STATIC) { return 0; } #ifdef DETAILED_ZONE_DEBUG_CODE // // check this error *before* barfing on bad magics... // int& iAllocCount = mapAllocatedZones[pMemory]; if (iAllocCount <= 0) { Com_Error(ERR_FATAL, "Z_Free(): Block already-freed, or not allocated through Z_Malloc!"); return -1; } #endif if (pMemory->iMagic != ZONE_MAGIC) { Com_Error(ERR_FATAL, "Z_Free(): Corrupt zone header!"); return -1; } if (ZoneTailFromHeader(pMemory)->iMagic != ZONE_MAGIC) { Com_Error(ERR_FATAL, "Z_Free(): Corrupt zone tail!"); return -1; } return Zone_FreeBlock(pMemory); }
// Frees a block of memory... // void Z_Free(void *pvAddress) { if (pvAddress == NULL) // I've put this in as a safety measure because of some bits of #ifdef BSPC stuff -Ste. { //Com_Error(ERR_FATAL, "Z_Free(): NULL arg"); return; } zoneHeader_t *pMemory = ((zoneHeader_t *)pvAddress) - 1; if (pMemory->eTag == TAG_STATIC) { return; } #ifdef DETAILED_ZONE_DEBUG_CODE // // check this error *before* barfing on bad magics... // int& iAllocCount = mapAllocatedZones[pMemory]; if (iAllocCount <= 0) { Com_Error(ERR_FATAL, "Z_Free(): Block already-freed, or not allocated through Z_Malloc!"); return; } #endif if (pMemory->iMagic != ZONE_MAGIC) { Com_Error(ERR_FATAL, "Z_Free(): Corrupt zone header!"); return; } if (ZoneTailFromHeader(pMemory)->iMagic != ZONE_MAGIC) { Com_Error(ERR_FATAL, "Z_Free(): Corrupt zone tail!"); return; } Zone_FreeBlock(pMemory); }