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