diff options
Diffstat (limited to 'lmem.c')
-rw-r--r-- | lmem.c | 11 |
1 files changed, 7 insertions, 4 deletions
@@ -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: |