/*************************************************************************
* TinyFugue - programmable mud client
* Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2002, 2003, 2004, 2005, 2006-2007 Ken Keys
*
* TinyFugue (aka "tf") is protected under the terms of the GNU
* General Public License. See the file "COPYING" for details.
************************************************************************/
static const char RCSid[] = "$Id: malloc.c,v 35004.22 2007/01/13 23:12:39 kkeys Exp $";
#include "tfconfig.h"
#include "port.h"
#include "signals.h"
#include "malloc.h"
caddr_t mmalloc_base = NULL;
int low_memory_warning = 0;
static char *reserve = NULL;
void init_malloc(void)
{
reserve = MALLOC(1024*16);
}
void *xmalloc(void *md, long unsigned size, const char *file, const int line)
{
void *memory;
if ((long)size <= 0)
core("xmalloc(%ld).", file, line, (long)size);
memory = (void*)dmalloc(md, size, file, line);
if (!memory) {
if (reserve) {
low_memory_warning = 1;
FREE(reserve);
reserve = NULL;
memory = (void*)dmalloc(md, size, file, line);
}
if (!memory)
error_exit("xmalloc(%ld): out of memory.", file, line, (long)size);
}
return memory;
}
void *xrealloc(void *md, void *ptr, long unsigned size,
const char *file, const int line)
{
void *memory;
if ((long)size <= 0)
core("xrealloc(%ld).", file, line, (long)size);
memory = (void*)drealloc(md, ptr, size, file, line);
if (!memory) {
if (reserve) {
low_memory_warning = 1;
FREE(reserve);
reserve = NULL;
memory = (void*)drealloc(md, ptr, size, file, line);
}
if (!memory)
error_exit("xrealloc(%ld): out of memory.", file, line, (long)size);
}
return memory;
}
void *xcalloc(void *md, long unsigned size, const char *file, const int line)
{
void *memory;
if ((memory = xmalloc(md, size, file, line)))
memset(memory, '\0', size);
return memory;
}
void xfree(void *md, void *ptr, const char *file, const int line)
{
dfree(md, ptr, file, line);
if (!reserve)
init_malloc();
}
#if USE_DMALLOC
void free_reserve(void)
{
FREE(reserve);
}
#endif