better control for GC running or stopped
This commit is contained in:
13
lmem.c
13
lmem.c
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: lmem.c,v 1.78 2010/05/04 18:10:02 roberto Exp roberto $
|
||||
** $Id: lmem.c,v 1.79 2010/05/05 18:49:56 roberto Exp roberto $
|
||||
** Interface to Memory Manager
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@@ -79,14 +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 && !gcstopped(g))
|
||||
if (nsize > realosize && g->gcrunning)
|
||||
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)) {
|
||||
if (g->gcrunning) {
|
||||
luaC_fullgc(L, 1); /* try to free some memory... */
|
||||
newblock = (*g->frealloc)(g->ud, block, osize, nsize); /* try again */
|
||||
}
|
||||
@@ -95,8 +95,7 @@ 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 */
|
||||
g->GCdebt += nsize; /* give some credit to garbage collector */
|
||||
#if defined(TRACEMEM)
|
||||
{ /* auxiliary patch to monitor garbage collection.
|
||||
** To plot, gnuplot with following command:
|
||||
@@ -108,9 +107,7 @@ void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) {
|
||||
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);
|
||||
g->totalbytes, g->GCdebt, g->gcstate * 1000);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user