mirror of
https://github.com/UberGames/rpgxEF.git
synced 2024-11-14 00:40:34 +00:00
a39565b783
... not quite content with where the project files lie but it is ok for now. ... compiling works fine so far (only tested mingw32 right now)
120 lines
3.3 KiB
C
120 lines
3.3 KiB
C
/*
|
|
** $Id: lmem.c,v 1.79 2010/05/05 18:49:56 roberto Exp $
|
|
** Interface to Memory Manager
|
|
** See Copyright Notice in lua.h
|
|
*/
|
|
|
|
|
|
#include <stddef.h>
|
|
|
|
#define lmem_c
|
|
#define LUA_CORE
|
|
|
|
#include "lua.h"
|
|
|
|
#include "ldebug.h"
|
|
#include "ldo.h"
|
|
#include "lgc.h"
|
|
#include "lmem.h"
|
|
#include "lobject.h"
|
|
#include "lstate.h"
|
|
|
|
|
|
|
|
/*
|
|
** About the realloc function:
|
|
** void * frealloc (void *ud, void *ptr, size_t osize, size_t nsize);
|
|
** (`osize' is the old size, `nsize' is the new size)
|
|
**
|
|
** * frealloc(ud, NULL, x, s) creates a new block of size `s' (no
|
|
** matter 'x').
|
|
**
|
|
** * frealloc(ud, p, x, 0) frees the block `p'
|
|
** (in this specific case, frealloc must return NULL);
|
|
** particularly, frealloc(ud, NULL, 0, 0) does nothing
|
|
** (which is equivalent to free(NULL) in ANSI C)
|
|
**
|
|
** frealloc returns NULL if it cannot create or reallocate the area
|
|
** (any reallocation to an equal or smaller size cannot fail!)
|
|
*/
|
|
|
|
|
|
|
|
#define MINSIZEARRAY 4
|
|
|
|
|
|
void *luaM_growaux_ (lua_State *L, void *block, int *size, size_t size_elems,
|
|
int limit, const char *what) {
|
|
void *newblock;
|
|
int newsize;
|
|
if (*size >= limit/2) { /* cannot double it? */
|
|
if (*size >= limit) /* cannot grow even a little? */
|
|
luaG_runerror(L, "too many %s (limit is %d)", what, limit);
|
|
newsize = limit; /* still have at least one free place */
|
|
}
|
|
else {
|
|
newsize = (*size)*2;
|
|
if (newsize < MINSIZEARRAY)
|
|
newsize = MINSIZEARRAY; /* minimum size */
|
|
}
|
|
newblock = luaM_reallocv(L, block, *size, newsize, size_elems);
|
|
*size = newsize; /* update only when everything else is OK */
|
|
return newblock;
|
|
}
|
|
|
|
|
|
void *luaM_toobig (lua_State *L) {
|
|
luaG_runerror(L, "memory allocation error: block too big");
|
|
return NULL; /* to avoid warnings */
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** generic allocation routine.
|
|
*/
|
|
void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) {
|
|
void *newblock;
|
|
global_State *g = G(L);
|
|
size_t realosize = (block) ? osize : 0;
|
|
lua_assert((realosize == 0) == (block == NULL));
|
|
#if defined(HARDMEMTESTS)
|
|
if (nsize > realosize && !gcstopped(g))
|
|
luaC_fullgc(L, 1); /* force a GC whenever possible */
|
|
#endif
|
|
newblock = (*g->frealloc)(g->ud, block, osize, nsize);
|
|
if (newblock == NULL && nsize > 0) {
|
|
api_check(L, nsize > realosize,
|
|
"realloc cannot fail when shrinking a block");
|
|
if (!gcstopped(g)) {
|
|
luaC_fullgc(L, 1); /* try to free some memory... */
|
|
newblock = (*g->frealloc)(g->ud, block, osize, nsize); /* try again */
|
|
}
|
|
if (newblock == NULL)
|
|
luaD_throw(L, LUA_ERRMEM);
|
|
}
|
|
lua_assert((nsize == 0) == (newblock == NULL));
|
|
g->totalbytes = (g->totalbytes - realosize) + nsize;
|
|
if (!gcstopped(g))
|
|
g->GCdebt += nsize; /* give some credit to garbage collector */
|
|
#if defined(TRACEMEM)
|
|
{ /* auxiliary patch to monitor garbage collection.
|
|
** To plot, gnuplot with following command:
|
|
** plot TRACEMEM using 1:2 with lines, TRACEMEM using 1:3 with lines
|
|
*/
|
|
static unsigned long total = 0; /* our "time" */
|
|
static FILE *f = NULL; /* output file */
|
|
total++; /* "time" always grows */
|
|
if ((total % 200) == 0) {
|
|
if (f == NULL) f = fopen(TRACEMEM, "w");
|
|
fprintf(f, "%lu %u %d %d\n", total,
|
|
g->totalbytes,
|
|
gcstopped(g) ? 0 : g->GCdebt,
|
|
g->gcstate * 1000);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
return newblock;
|
|
}
|
|
|