diff options
Diffstat (limited to 'lmem.c')
-rw-r--r-- | lmem.c | 25 |
1 files changed, 19 insertions, 6 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lmem.c,v 1.69 2005/02/23 17:30:22 roberto Exp roberto $ | 2 | ** $Id: lmem.c,v 1.70 2005/12/26 13:35:47 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 | */ |
@@ -14,6 +14,7 @@ | |||
14 | 14 | ||
15 | #include "ldebug.h" | 15 | #include "ldebug.h" |
16 | #include "ldo.h" | 16 | #include "ldo.h" |
17 | #include "lgc.h" | ||
17 | #include "lmem.h" | 18 | #include "lmem.h" |
18 | #include "lobject.h" | 19 | #include "lobject.h" |
19 | #include "lstate.h" | 20 | #include "lstate.h" |
@@ -74,13 +75,25 @@ void *luaM_toobig (lua_State *L) { | |||
74 | ** generic allocation routine. | 75 | ** generic allocation routine. |
75 | */ | 76 | */ |
76 | void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) { | 77 | void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) { |
78 | void *newblock; | ||
77 | global_State *g = G(L); | 79 | global_State *g = G(L); |
78 | lua_assert((osize == 0) == (block == NULL)); | 80 | lua_assert((osize == 0) == (block == NULL)); |
79 | block = (*g->frealloc)(g->ud, block, osize, nsize); | 81 | #if defined(HARDMEMTESTS) |
80 | if (block == NULL && nsize > 0) | 82 | if (nsize > osize && g->GCthreshold != MAX_LUMEM) |
81 | luaD_throw(L, LUA_ERRMEM); | 83 | luaC_fullgc(L, 1); /* force a GC whenever possible */ |
82 | lua_assert((nsize == 0) == (block == NULL)); | 84 | #endif |
85 | newblock = (*g->frealloc)(g->ud, block, osize, nsize); | ||
86 | if (newblock == NULL && nsize > 0) { | ||
87 | lua_assert(nsize > osize); /* cannot fail when shrinking a block */ | ||
88 | if (g->GCthreshold != MAX_LUMEM) { | ||
89 | luaC_fullgc(L, 1); /* try to free some memory... */ | ||
90 | newblock = (*g->frealloc)(g->ud, block, osize, nsize); /* try again */ | ||
91 | } | ||
92 | if (newblock == NULL) | ||
93 | luaD_throw(L, LUA_ERRMEM); | ||
94 | } | ||
95 | lua_assert((nsize == 0) == (newblock == NULL)); | ||
83 | g->totalbytes = (g->totalbytes - osize) + nsize; | 96 | g->totalbytes = (g->totalbytes - osize) + nsize; |
84 | return block; | 97 | return newblock; |
85 | } | 98 | } |
86 | 99 | ||