diff options
Diffstat (limited to 'src/lmem.c')
-rw-r--r-- | src/lmem.c | 29 |
1 files changed, 25 insertions, 4 deletions
@@ -1,5 +1,5 @@ /* -** $Id: lmem.c,v 1.74 2009/12/16 16:42:58 roberto Exp $ +** $Id: lmem.c,v 1.79 2010/05/05 18:49:56 roberto Exp $ ** Interface to Memory Manager ** See Copyright Notice in lua.h */ @@ -79,13 +79,14 @@ void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) { size_t realosize = (block) ? osize : 0; lua_assert((realosize == 0) == (block == NULL)); #if defined(HARDMEMTESTS) - if (nsize > realosize && g->GCthreshold != MAX_LUMEM) + 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) { - lua_assert(nsize > realosize); /* cannot fail when shrinking a block */ - if (g->GCthreshold != MAX_LUMEM) { + 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 */ } @@ -94,6 +95,26 @@ void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) { } 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; } |