1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCopyright (C) 1996-1997 Id Software, Inc. 3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is free software; you can redistribute it and/or 5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmodify it under the terms of the GNU General Public License 6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichas published by the Free Software Foundation; either version 2 7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichof the License, or (at your option) any later version. 8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is distributed in the hope that it will be useful, 10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbut WITHOUT ANY WARRANTY; without even the implied warranty of 11cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSee the GNU General Public License for more details. 14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichYou should have received a copy of the GNU General Public License 16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichalong with this program; if not, write to the Free Software 17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 20cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 21cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich memory allocation 22cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 23cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 24cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichH_??? The hunk manages the entire memory block given to quake. It must be 25cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcontiguous. Memory can be allocated from either the low or high end in a 26cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstack fashion. The only way memory is released is by resetting one of the 27cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichpointers. 28cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 29cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichHunk allocations should be given a name, so the Hunk_Print () function 30cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcan display usage. 31cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 32cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichHunk allocations are guaranteed to be 16 byte aligned. 33cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 34cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThe video buffers are allocated high to avoid leaving a hole underneath 35cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichserver allocations when changing to a higher video mode. 36cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 37cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 38cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichZ_??? Zone memory functions used for small, dynamic allocations like text 39cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstrings from command input. There is only about 48K for it, allocated at 40cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichthe very bottom of the hunk. 41cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 42cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCache_??? Cache memory is for objects that can be dynamically loaded and 43cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcan usefully stay persistant between levels. The size of the cache 44cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichfluctuates from level to level. 45cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 46cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichTo allocate a cachable object 47cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 48cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 49cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichTemp_??? Temp memory is used for file loading and surface caching. The size 50cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichof the cache memory is adjusted so that there is a minimum of 512k remaining 51cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichfor temp memory. 52cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 53cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 54cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich------ Top of Memory ------- 55cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 56cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichhigh hunk allocations 57cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 58cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich<--- high hunk reset point held by vid 59cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 60cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvideo buffer 61cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 62cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichz buffer 63cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 64cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichsurface cache 65cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 66cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich<--- high hunk used 67cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 68cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichcachable memory 69cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 70cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich<--- low hunk used 71cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 72cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichclient and server low hunk allocations 73cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 74cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich<-- low hunk reset point held by host 75cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 76cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstartup hunk allocations 77cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 78cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichZone block 79cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 80cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich----- Bottom of Memory ----- 81cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 82cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 83cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 84cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 85cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 86cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Memory_Init (void *buf, int size); 87cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 88cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Z_Free (void *ptr); 89cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid *Z_Malloc (int size); // returns 0 filled memory 90cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid *Z_TagMalloc (int size, int tag); 91cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 92cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Z_DumpHeap (void); 93cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Z_CheckHeap (void); 94cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint Z_FreeMemory (void); 95cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 96cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid *Hunk_Alloc (int size); // returns 0 filled memory 97cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid *Hunk_AllocName (int size, const char *name); 98cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 99cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid *Hunk_HighAllocName (int size, const char *name); 100cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 101cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint Hunk_LowMark (void); 102cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Hunk_FreeToLowMark (int mark); 103cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 104cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint Hunk_HighMark (void); 105cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Hunk_FreeToHighMark (int mark); 106cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 107cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid *Hunk_TempAlloc (int size); 108cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 109cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Hunk_Check (void); 110cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 111cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct cache_user_s 112cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 113cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich void *data; 114cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} cache_user_t; 115cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 116cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Cache_Flush (void); 117cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 118cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid *Cache_Check (cache_user_t *c); 119cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// returns the cached data, and moves to the head of the LRU list 120cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// if present, otherwise returns NULL 121cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 122cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Cache_Free (cache_user_t *c); 123cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 124cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid *Cache_Alloc (cache_user_t *c, int size, const char *name); 125cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// Returns NULL if all purgable data was tossed and there still 126cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// wasn't enough room. 127cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 128cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Cache_Report (void); 129cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 130cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 131cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 132