// Z_zone.c
#include "quakedef.h"
+#include "thread.h"
#ifdef WIN32
#include <windows.h>
+#include <winbase.h>
#else
#include <unistd.h>
#endif
unsigned int sentinel_seed;
qboolean mem_bigendian = false;
+void *mem_mutex = NULL;
// LordHavoc: enables our own low-level allocator (instead of malloc)
#define MEMCLUMPING 0
}
if (pool == NULL)
Sys_Error("Mem_Alloc: pool == NULL (alloc at %s:%i)", filename, fileline);
+ if (mem_mutex)
+ Thread_LockMutex(mem_mutex);
if (developer_memory.integer)
Con_DPrintf("Mem_Alloc: pool %s, file %s:%i, size %i bytes\n", pool->name, filename, fileline, (int)size);
//if (developer.integer > 0 && developer_memorydebug.integer)
if (mem->next)
mem->next->prev = mem;
+ if (mem_mutex)
+ Thread_UnlockMutex(mem_mutex);
+
// copy the shared portion in the case of a realloc, then memset the rest
sharedsize = 0;
remainsize = size;
// unlink memheader from doubly linked list
if ((mem->prev ? mem->prev->next != mem : pool->chain != mem) || (mem->next && mem->next->prev != mem))
Sys_Error("Mem_Free: not allocated or double freed (free at %s:%i)", filename, fileline);
+ if (mem_mutex)
+ Thread_LockMutex(mem_mutex);
if (mem->prev)
mem->prev->next = mem->next;
else
pool->totalsize -= size;
pool->realsize -= realsize;
Clump_FreeBlock(mem->baseaddress, realsize);
+ if (mem_mutex)
+ Thread_UnlockMutex(mem_mutex);
}
void _Mem_Free(void *data, const char *filename, int fileline)
void *Mem_ExpandableArray_AllocRecordAtIndex(memexpandablearray_t *l, size_t index)
{
size_t j;
- if (index == l->numarrays)
+ if (index >= l->numarrays)
{
if (l->numarrays == l->maxarrays)
{
}
}
-void MemList_f(void)
+static void MemList_f(void)
{
switch(Cmd_Argc())
{
}
}
-extern void R_TextureStats_Print(qboolean printeach, qboolean printpool, qboolean printtotal);
-void MemStats_f(void)
+static void MemStats_f(void)
{
Mem_CheckSentinelsGlobal();
R_TextureStats_Print(false, false, true);
char* Mem_strdup (mempool_t *pool, const char* s)
{
char* p;
- size_t sz = strlen (s) + 1;
- if (s == NULL) return NULL;
+ size_t sz;
+ if (s == NULL)
+ return NULL;
+ sz = strlen (s) + 1;
p = (char*)Mem_Alloc (pool, sz);
strlcpy (p, s, sz);
return p;
{
static union {unsigned short s;unsigned char b[2];} u;
u.s = 0x100;
- mem_bigendian = u.b[0];
+ mem_bigendian = u.b[0] != 0;
sentinel_seed = rand();
poolchain = NULL;
tempmempool = Mem_AllocPool("Temporary Memory", POOLFLAG_TEMP, NULL);
zonemempool = Mem_AllocPool("Zone", 0, NULL);
+
+ if (Thread_HasThreads())
+ mem_mutex = Thread_CreateMutex();
}
void Memory_Shutdown (void)
{
// Mem_FreePool (&zonemempool);
// Mem_FreePool (&tempmempool);
+
+ if (mem_mutex)
+ Thread_DestroyMutex(mem_mutex);
+ mem_mutex = NULL;
}
void Memory_Init_Commands (void)
Cvar_RegisterVariable (&sys_memsize_virtual);
#if defined(WIN32)
+#ifdef _WIN64
{
MEMORYSTATUSEX status;
// first guess
- Cvar_SetQuick(&sys_memsize_virtual, (sizeof(void*) == 4) ? 2048 : 8388608);
+ Cvar_SetValueQuick(&sys_memsize_virtual, 8388608);
// then improve
status.dwLength = sizeof(status);
- if(!GlobalMemoryStatusEx(&status))
+ if(GlobalMemoryStatusEx(&status))
{
Cvar_SetValueQuick(&sys_memsize_physical, status.ullTotalPhys / 1048576.0);
Cvar_SetValueQuick(&sys_memsize_virtual, min(sys_memsize_virtual.value, status.ullTotalVirtual / 1048576.0));
}
}
+#else
+ {
+ MEMORYSTATUS status;
+ // first guess
+ Cvar_SetValueQuick(&sys_memsize_virtual, 2048);
+ // then improve
+ status.dwLength = sizeof(status);
+ GlobalMemoryStatus(&status);
+ Cvar_SetValueQuick(&sys_memsize_physical, status.dwTotalPhys / 1048576.0);
+ Cvar_SetValueQuick(&sys_memsize_virtual, min(sys_memsize_virtual.value, status.dwTotalVirtual / 1048576.0));
+ }
+#endif
#else
{
// first guess