// Z_zone.c
#include "quakedef.h"
+#include "thread.h"
#ifdef WIN32
#include <windows.h>
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)
u.s = 0x100;
mem_bigendian = u.b[0] != 0;
+ if (Thread_HasThreads())
+ mem_mutex = Thread_CreateMutex();
+
sentinel_seed = rand();
poolchain = NULL;
tempmempool = Mem_AllocPool("Temporary Memory", POOLFLAG_TEMP, NULL);
{
// Mem_FreePool (&zonemempool);
// Mem_FreePool (&tempmempool);
+
+ if (mem_mutex)
+ Thread_DestroyMutex(mem_mutex);
+ mem_mutex = NULL;
}
void Memory_Init_Commands (void)