X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=zone.h;h=a78372267114d9a61836774fd566914b674c3d6e;hp=7655ad9c083284c12a9c6ced62b076625d5600eb;hb=8507719df58bf767983c92ecfa32a70090bf501e;hpb=8dcce44300385b12c46d494c06aadcfa35a8bc14 diff --git a/zone.h b/zone.h index 7655ad9c..a7837226 100644 --- a/zone.h +++ b/zone.h @@ -8,7 +8,7 @@ of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. @@ -17,115 +17,139 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* - memory allocation - - -H_??? The hunk manages the entire memory block given to quake. It must be -contiguous. Memory can be allocated from either the low or high end in a -stack fashion. The only way memory is released is by resetting one of the -pointers. - -Hunk allocations should be given a name, so the Hunk_Print () function -can display usage. - -Hunk allocations are guaranteed to be 16 byte aligned. - -The video buffers are allocated high to avoid leaving a hole underneath -server allocations when changing to a higher video mode. - - -Z_??? Zone memory functions used for small, dynamic allocations like text -strings from command input. There is only about 48K for it, allocated at -the very bottom of the hunk. - -Cache_??? Cache memory is for objects that can be dynamically loaded and -can usefully stay persistant between levels. The size of the cache -fluctuates from level to level. - -To allocate a cachable object - - -Temp_??? Temp memory is used for file loading and surface caching. The size -of the cache memory is adjusted so that there is a minimum of 512k remaining -for temp memory. - - ------- Top of Memory ------- - -high hunk allocations - -<--- high hunk reset point held by vid - -video buffer - -z buffer - -surface cache - -<--- high hunk used - -cachable memory - -<--- low hunk used -client and server low hunk allocations +#ifndef ZONE_H +#define ZONE_H -<-- low hunk reset point held by host +#include +#include "qtypes.h" +#include "qdefs.h" -startup hunk allocations +extern qbool mem_bigendian; -Zone block +// div0: heap overflow detection paranoia +#define MEMPARANOIA 0 ------ Bottom of Memory ----- +#define POOLNAMESIZE 128 +// if set this pool will be printed in memlist reports +#define POOLFLAG_TEMP 1 - - -*/ - -void Memory_Init (void *buf, int size); - -void Z_Free (void *ptr); -void *Z_Malloc (int size); // returns 0 filled memory -void *Z_TagMalloc (int size, int tag); - -void Z_DumpHeap (void); -void Z_CheckHeap (void); -int Z_FreeMemory (void); - -void *Hunk_Alloc (int size); // returns 0 filled memory -void *Hunk_AllocName (int size, char *name); - -void *Hunk_HighAllocName (int size, char *name); - -int Hunk_LowMark (void); -void Hunk_FreeToLowMark (int mark); - -int Hunk_HighMark (void); -void Hunk_FreeToHighMark (int mark); - -void *Hunk_TempAlloc (int size); - -void Hunk_Check (void); - -typedef struct cache_user_s +typedef struct memheader_s { - void *data; -} cache_user_t; - -void Cache_Flush (void); - -void *Cache_Check (cache_user_t *c); -// returns the cached data, and moves to the head of the LRU list -// if present, otherwise returns NULL - -void Cache_Free (cache_user_t *c); - -void *Cache_Alloc (cache_user_t *c, int size, char *name); -// Returns NULL if all purgable data was tossed and there still -// wasn't enough room. - -void Cache_Report (void); - + // address returned by Chunk_Alloc (may be significantly before this header to satisify alignment) + void *baseaddress; + // next and previous memheaders in chain belonging to pool + struct memheader_s *next; + struct memheader_s *prev; + // pool this memheader belongs to + struct mempool_s *pool; + // size of the memory after the header (excluding header and sentinel2) + size_t size; + // file name and line where Mem_Alloc was called + const char *filename; + int fileline; + // should always be equal to MEMHEADER_SENTINEL_FOR_ADDRESS() + unsigned int sentinel; + // immediately followed by data, which is followed by another copy of mem_sentinel[] +} +memheader_t; + +typedef struct mempool_s +{ + // should always be MEMPOOL_SENTINEL + unsigned int sentinel1; + // chain of individual memory allocations + struct memheader_s *chain; + // POOLFLAG_* + int flags; + // total memory allocated in this pool (inside memheaders) + size_t totalsize; + // total memory allocated in this pool (actual malloc total) + size_t realsize; + // updated each time the pool is displayed by memlist, shows change from previous time (unless pool was freed) + size_t lastchecksize; + // linked into global mempool list + struct mempool_s *next; + // parent object (used for nested memory pools) + struct mempool_s *parent; + // file name and line where Mem_AllocPool was called + const char *filename; + int fileline; + // name of the pool + char name[POOLNAMESIZE]; + // should always be MEMPOOL_SENTINEL + unsigned int sentinel2; +} +mempool_t; + +#define Mem_Alloc(pool,size) _Mem_Alloc(pool, NULL, size, 16, __FILE__, __LINE__) +#define Mem_Memalign(pool,alignment,size) _Mem_Alloc(pool, NULL, size, alignment, __FILE__, __LINE__) +#define Mem_Realloc(pool,data,size) _Mem_Alloc(pool, data, size, 16, __FILE__, __LINE__) +#define Mem_Free(mem) _Mem_Free(mem, __FILE__, __LINE__) +#define Mem_CheckSentinels(data) _Mem_CheckSentinels(data, __FILE__, __LINE__) +#if MEMPARANOIA +#define Mem_CheckSentinelsGlobal() _Mem_CheckSentinelsGlobal(__FILE__, __LINE__) +#else +#define Mem_CheckSentinelsGlobal() if(developer_memorydebug.integer) { _Mem_CheckSentinelsGlobal(__FILE__, __LINE__); } +#endif +#define Mem_AllocPool(name, flags, parent) _Mem_AllocPool(name, flags, parent, __FILE__, __LINE__) +#define Mem_FreePool(pool) _Mem_FreePool(pool, __FILE__, __LINE__) +#define Mem_EmptyPool(pool) _Mem_EmptyPool(pool, __FILE__, __LINE__) + +void *_Mem_Alloc(mempool_t *pool, void *data, size_t size, size_t alignment, const char *filename, int fileline); +void _Mem_Free(void *data, const char *filename, int fileline); +mempool_t *_Mem_AllocPool(const char *name, int flags, mempool_t *parent, const char *filename, int fileline); +void _Mem_FreePool(mempool_t **pool, const char *filename, int fileline); +void _Mem_EmptyPool(mempool_t *pool, const char *filename, int fileline); +void _Mem_CheckSentinels(void *data, const char *filename, int fileline); +void _Mem_CheckSentinelsGlobal(const char *filename, int fileline); +// if pool is NULL this searches ALL pools for the allocation +qbool Mem_IsAllocated(mempool_t *pool, void *data); + +char* Mem_strdup (mempool_t *pool, const char* s); + +typedef struct memexpandablearray_array_s +{ + unsigned char *data; + unsigned char *allocflags; + size_t numflaggedrecords; +} +memexpandablearray_array_t; +typedef struct memexpandablearray_s +{ + mempool_t *mempool; + size_t recordsize; + size_t numrecordsperarray; + size_t numarrays; + size_t maxarrays; + memexpandablearray_array_t *arrays; +} +memexpandablearray_t; + +void Mem_ExpandableArray_NewArray(memexpandablearray_t *l, mempool_t *mempool, size_t recordsize, int numrecordsperarray); +void Mem_ExpandableArray_FreeArray(memexpandablearray_t *l); +void *Mem_ExpandableArray_AllocRecord(memexpandablearray_t *l); +void Mem_ExpandableArray_FreeRecord(memexpandablearray_t *l, void *record); +size_t Mem_ExpandableArray_IndexRange(const memexpandablearray_t *l) DP_FUNC_PURE; +void *Mem_ExpandableArray_RecordAtIndex(const memexpandablearray_t *l, size_t index) DP_FUNC_PURE; + +// used for temporary allocations +extern mempool_t *tempmempool; + +void Memory_Init (void); +void Memory_Shutdown (void); +void Memory_Init_Commands (void); + +extern mempool_t *zonemempool; +#define Z_Malloc(size) Mem_Alloc(zonemempool, size) +#define Z_Realloc(data, size) Mem_Realloc(zonemempool, data, size) +#define Z_strdup(s) Mem_strdup(zonemempool, s) +#define Z_Free(data) Mem_Free(data) + +extern struct cvar_s developer_memory; +extern struct cvar_s developer_memorydebug; +extern struct cvar_s developer_memoryreportlargerthanmb; + +#endif