|
|
@ -15,8 +15,8 @@ GNU General Public License for more details. |
|
|
|
|
|
|
|
|
|
|
|
#include "common.h" |
|
|
|
#include "common.h" |
|
|
|
|
|
|
|
|
|
|
|
#define MEMHEADER_SENTINEL1 0xDEADF00D |
|
|
|
#define MEMHEADER_SENTINEL1 0xDEADF00DU |
|
|
|
#define MEMHEADER_SENTINEL2 0xDF |
|
|
|
#define MEMHEADER_SENTINEL2 0xDFU |
|
|
|
|
|
|
|
|
|
|
|
#ifdef XASH_CUSTOM_SWAP |
|
|
|
#ifdef XASH_CUSTOM_SWAP |
|
|
|
#include "platform/swap/swap.h" |
|
|
|
#include "platform/swap/swap.h" |
|
|
@ -34,18 +34,18 @@ typedef struct memheader_s |
|
|
|
struct mempool_s *pool; // pool this memheader belongs to
|
|
|
|
struct mempool_s *pool; // pool this memheader belongs to
|
|
|
|
size_t size; // size of the memory after the header (excluding header and sentinel2)
|
|
|
|
size_t size; // size of the memory after the header (excluding header and sentinel2)
|
|
|
|
const char *filename; // file name and line where Mem_Alloc was called
|
|
|
|
const char *filename; // file name and line where Mem_Alloc was called
|
|
|
|
uint fileline; |
|
|
|
int fileline; |
|
|
|
#if !XASH_64BIT |
|
|
|
#if !XASH_64BIT |
|
|
|
uint pad0; // doesn't have value, only to make Mem_Alloc return aligned addresses on ILP32
|
|
|
|
uint32_t pad0; // doesn't have value, only to make Mem_Alloc return aligned addresses on ILP32
|
|
|
|
#endif |
|
|
|
#endif |
|
|
|
uint sentinel1; // should always be MEMHEADER_SENTINEL1
|
|
|
|
uint32_t sentinel1; // should always be MEMHEADER_SENTINEL1
|
|
|
|
|
|
|
|
|
|
|
|
// immediately followed by data, which is followed by a MEMHEADER_SENTINEL2 byte
|
|
|
|
// immediately followed by data, which is followed by a MEMHEADER_SENTINEL2 byte
|
|
|
|
} memheader_t; |
|
|
|
} memheader_t; |
|
|
|
|
|
|
|
|
|
|
|
typedef struct mempool_s |
|
|
|
typedef struct mempool_s |
|
|
|
{ |
|
|
|
{ |
|
|
|
uint sentinel1; // should always be MEMHEADER_SENTINEL1
|
|
|
|
uint32_t sentinel1; // should always be MEMHEADER_SENTINEL1
|
|
|
|
struct memheader_s *chain; // chain of individual memory allocations
|
|
|
|
struct memheader_s *chain; // chain of individual memory allocations
|
|
|
|
size_t totalsize; // total memory allocated in this pool (inside memheaders)
|
|
|
|
size_t totalsize; // total memory allocated in this pool (inside memheaders)
|
|
|
|
size_t realsize; // total memory allocated in this pool (actual malloc total)
|
|
|
|
size_t realsize; // total memory allocated in this pool (actual malloc total)
|
|
|
@ -57,7 +57,7 @@ typedef struct mempool_s |
|
|
|
poolhandle_t idx; |
|
|
|
poolhandle_t idx; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
char name[64]; // name of the pool
|
|
|
|
char name[64]; // name of the pool
|
|
|
|
uint sentinel2; // should always be MEMHEADER_SENTINEL1
|
|
|
|
uint32_t sentinel2; // should always be MEMHEADER_SENTINEL1
|
|
|
|
} mempool_t; |
|
|
|
} mempool_t; |
|
|
|
|
|
|
|
|
|
|
|
static mempool_t *poolchain = NULL; // critical stuff
|
|
|
|
static mempool_t *poolchain = NULL; // critical stuff
|
|
|
@ -67,7 +67,7 @@ static mempool_t *poolchain = NULL; // critical stuff |
|
|
|
// which makes engine incompatible with 64-bit pointers I changed mempool type
|
|
|
|
// which makes engine incompatible with 64-bit pointers I changed mempool type
|
|
|
|
// from pointer to 32-bit handle, thankfully mempool structure is private
|
|
|
|
// from pointer to 32-bit handle, thankfully mempool structure is private
|
|
|
|
// But! Mempools are handled through linked list so we can't index them safely
|
|
|
|
// But! Mempools are handled through linked list so we can't index them safely
|
|
|
|
static uint lastidx = 0; |
|
|
|
static poolhandle_t lastidx = 0; |
|
|
|
|
|
|
|
|
|
|
|
static mempool_t *Mem_FindPool( poolhandle_t poolptr ) |
|
|
|
static mempool_t *Mem_FindPool( poolhandle_t poolptr ) |
|
|
|
{ |
|
|
|
{ |
|
|
|