From 3410dcd3750d5e2852ffce7cfc4bda76dd1c83c0 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Thu, 29 Apr 2010 14:35:10 -0300 Subject: new way to control GC speed --- lmem.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'lmem.c') diff --git a/lmem.c b/lmem.c index 41047b04..05b4a873 100644 --- a/lmem.c +++ b/lmem.c @@ -1,5 +1,5 @@ /* -** $Id: lmem.c,v 1.74 2009/12/16 16:42:58 roberto Exp roberto $ +** $Id: lmem.c,v 1.75 2010/04/02 14:37:41 roberto Exp roberto $ ** 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,8 @@ 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)) /* new object? */ + g->GCdebt += nsize; /* give some credit to garbage collector */ #if defined(TRACEMEM) { /* auxiliar patch to monitor garbage collection. ** To plot, gnuplot with following command: -- cgit v1.2.3-55-g6feb