aboutsummaryrefslogtreecommitdiff
path: root/lmem.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2010-04-29 14:35:10 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2010-04-29 14:35:10 -0300
commit3410dcd3750d5e2852ffce7cfc4bda76dd1c83c0 (patch)
tree5747890ffd12cf30e4478efc32ffd310b8aedb97 /lmem.c
parent5a7a0c72d8a4766e1541345350500f3a0a14361b (diff)
downloadlua-3410dcd3750d5e2852ffce7cfc4bda76dd1c83c0.tar.gz
lua-3410dcd3750d5e2852ffce7cfc4bda76dd1c83c0.tar.bz2
lua-3410dcd3750d5e2852ffce7cfc4bda76dd1c83c0.zip
new way to control GC speed
Diffstat (limited to 'lmem.c')
-rw-r--r--lmem.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/lmem.c b/lmem.c
index 41047b04..05b4a873 100644
--- a/lmem.c
+++ b/lmem.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lmem.c,v 1.74 2009/12/16 16:42:58 roberto Exp roberto $ 2** $Id: lmem.c,v 1.75 2010/04/02 14:37:41 roberto Exp roberto $
3** Interface to Memory Manager 3** Interface to Memory Manager
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -79,13 +79,14 @@ void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) {
79 size_t realosize = (block) ? osize : 0; 79 size_t realosize = (block) ? osize : 0;
80 lua_assert((realosize == 0) == (block == NULL)); 80 lua_assert((realosize == 0) == (block == NULL));
81#if defined(HARDMEMTESTS) 81#if defined(HARDMEMTESTS)
82 if (nsize > realosize && g->GCthreshold != MAX_LUMEM) 82 if (nsize > realosize && !gcstopped(g))
83 luaC_fullgc(L, 1); /* force a GC whenever possible */ 83 luaC_fullgc(L, 1); /* force a GC whenever possible */
84#endif 84#endif
85 newblock = (*g->frealloc)(g->ud, block, osize, nsize); 85 newblock = (*g->frealloc)(g->ud, block, osize, nsize);
86 if (newblock == NULL && nsize > 0) { 86 if (newblock == NULL && nsize > 0) {
87 lua_assert(nsize > realosize); /* cannot fail when shrinking a block */ 87 api_check(L, nsize > realosize,
88 if (g->GCthreshold != MAX_LUMEM) { 88 "realloc cannot fail when shrinking a block");
89 if (!gcstopped(g)) {
89 luaC_fullgc(L, 1); /* try to free some memory... */ 90 luaC_fullgc(L, 1); /* try to free some memory... */
90 newblock = (*g->frealloc)(g->ud, block, osize, nsize); /* try again */ 91 newblock = (*g->frealloc)(g->ud, block, osize, nsize); /* try again */
91 } 92 }
@@ -94,6 +95,8 @@ void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) {
94 } 95 }
95 lua_assert((nsize == 0) == (newblock == NULL)); 96 lua_assert((nsize == 0) == (newblock == NULL));
96 g->totalbytes = (g->totalbytes - realosize) + nsize; 97 g->totalbytes = (g->totalbytes - realosize) + nsize;
98 if (!gcstopped(g)) /* new object? */
99 g->GCdebt += nsize; /* give some credit to garbage collector */
97#if defined(TRACEMEM) 100#if defined(TRACEMEM)
98 { /* auxiliar patch to monitor garbage collection. 101 { /* auxiliar patch to monitor garbage collection.
99 ** To plot, gnuplot with following command: 102 ** To plot, gnuplot with following command: