diff options
Diffstat (limited to 'ltests.c')
| -rw-r--r-- | ltests.c | 47 |
1 files changed, 22 insertions, 25 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltests.c,v 1.162 2003/07/09 12:08:43 roberto Exp roberto $ | 2 | ** $Id: ltests.c,v 1.163 2003/07/29 19:26:34 roberto Exp roberto $ |
| 3 | ** Internal Module for Debugging of the Lua Implementation | 3 | ** Internal Module for Debugging of the Lua Implementation |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -80,10 +80,8 @@ static void setnameval (lua_State *L, const char *name, int val) { | |||
| 80 | #define fillmem(mem,size) /* empty */ | 80 | #define fillmem(mem,size) /* empty */ |
| 81 | #endif | 81 | #endif |
| 82 | 82 | ||
| 83 | unsigned long memdebug_numblocks = 0; | 83 | |
| 84 | unsigned long memdebug_total = 0; | 84 | Memcontrol memcontrol = {0L, 0L, 0L, ULONG_MAX}; |
| 85 | unsigned long memdebug_maxmem = 0; | ||
| 86 | unsigned long memdebug_memlimit = ULONG_MAX; | ||
| 87 | 85 | ||
| 88 | 86 | ||
| 89 | static void *checkblock (void *block, size_t size) { | 87 | static void *checkblock (void *block, size_t size) { |
| @@ -95,27 +93,26 @@ static void *checkblock (void *block, size_t size) { | |||
| 95 | } | 93 | } |
| 96 | 94 | ||
| 97 | 95 | ||
| 98 | static void freeblock (void *block, size_t size) { | 96 | static void freeblock (Memcontrol *mc, void *block, size_t size) { |
| 99 | if (block) { | 97 | if (block) { |
| 100 | lua_assert(checkblocksize(block, size)); | 98 | lua_assert(checkblocksize(block, size)); |
| 101 | block = checkblock(block, size); | 99 | block = checkblock(block, size); |
| 102 | fillmem(block, size+HEADER+MARKSIZE); /* erase block */ | 100 | fillmem(block, size+HEADER+MARKSIZE); /* erase block */ |
| 103 | free(block); /* free original block */ | 101 | free(block); /* free original block */ |
| 104 | memdebug_numblocks--; | 102 | mc->numblocks--; |
| 105 | memdebug_total -= size; | 103 | mc->total -= size; |
| 106 | } | 104 | } |
| 107 | } | 105 | } |
| 108 | 106 | ||
| 109 | 107 | ||
| 110 | void *debug_realloc (void *block, size_t oldsize, size_t size) { | 108 | void *debug_realloc (void *ud, void *block, size_t oldsize, size_t size) { |
| 109 | Memcontrol *mc = cast(Memcontrol *, ud); | ||
| 111 | lua_assert(oldsize == 0 || checkblocksize(block, oldsize)); | 110 | lua_assert(oldsize == 0 || checkblocksize(block, oldsize)); |
| 112 | /* ISO does not specify what realloc(NULL, 0) does */ | ||
| 113 | lua_assert(block != NULL || size > 0); | ||
| 114 | if (size == 0) { | 111 | if (size == 0) { |
| 115 | freeblock(block, oldsize); | 112 | freeblock(mc, block, oldsize); |
| 116 | return NULL; | 113 | return NULL; |
| 117 | } | 114 | } |
| 118 | else if (size > oldsize && memdebug_total+size-oldsize > memdebug_memlimit) | 115 | else if (size > oldsize && mc->total+size-oldsize > mc->memlimit) |
| 119 | return NULL; /* to test memory allocation errors */ | 116 | return NULL; /* to test memory allocation errors */ |
| 120 | else { | 117 | else { |
| 121 | void *newblock; | 118 | void *newblock; |
| @@ -127,14 +124,14 @@ void *debug_realloc (void *block, size_t oldsize, size_t size) { | |||
| 127 | if (newblock == NULL) return NULL; | 124 | if (newblock == NULL) return NULL; |
| 128 | if (block) { | 125 | if (block) { |
| 129 | memcpy(cast(char *, newblock)+HEADER, block, commonsize); | 126 | memcpy(cast(char *, newblock)+HEADER, block, commonsize); |
| 130 | freeblock(block, oldsize); /* erase (and check) old copy */ | 127 | freeblock(mc, block, oldsize); /* erase (and check) old copy */ |
| 131 | } | 128 | } |
| 132 | /* initialize new part of the block with something `weird' */ | 129 | /* initialize new part of the block with something `weird' */ |
| 133 | fillmem(cast(char *, newblock)+HEADER+commonsize, size-commonsize); | 130 | fillmem(cast(char *, newblock)+HEADER+commonsize, size-commonsize); |
| 134 | memdebug_total += size; | 131 | mc->total += size; |
| 135 | if (memdebug_total > memdebug_maxmem) | 132 | if (mc->total > mc->maxmem) |
| 136 | memdebug_maxmem = memdebug_total; | 133 | mc->maxmem = mc->total; |
| 137 | memdebug_numblocks++; | 134 | mc->numblocks++; |
| 138 | setsize(newblock, size); | 135 | setsize(newblock, size); |
| 139 | for (i=0;i<MARKSIZE;i++) | 136 | for (i=0;i<MARKSIZE;i++) |
| 140 | *(cast(char *, newblock)+HEADER+size+i) = cast(char, MARK+i); | 137 | *(cast(char *, newblock)+HEADER+size+i) = cast(char, MARK+i); |
| @@ -260,13 +257,13 @@ static int setgcthreshold (lua_State *L) { | |||
| 260 | 257 | ||
| 261 | static int mem_query (lua_State *L) { | 258 | static int mem_query (lua_State *L) { |
| 262 | if (lua_isnone(L, 1)) { | 259 | if (lua_isnone(L, 1)) { |
| 263 | lua_pushintegral(L, memdebug_total); | 260 | lua_pushintegral(L, memcontrol.total); |
| 264 | lua_pushintegral(L, memdebug_numblocks); | 261 | lua_pushintegral(L, memcontrol.numblocks); |
| 265 | lua_pushintegral(L, memdebug_maxmem); | 262 | lua_pushintegral(L, memcontrol.maxmem); |
| 266 | return 3; | 263 | return 3; |
| 267 | } | 264 | } |
| 268 | else { | 265 | else { |
| 269 | memdebug_memlimit = luaL_checkint(L, 1); | 266 | memcontrol.memlimit = luaL_checkint(L, 1); |
| 270 | return 0; | 267 | return 0; |
| 271 | } | 268 | } |
| 272 | } | 269 | } |
| @@ -830,8 +827,8 @@ static const struct luaL_reg tests_funcs[] = { | |||
| 830 | static void fim (void) { | 827 | static void fim (void) { |
| 831 | if (!islocked) | 828 | if (!islocked) |
| 832 | lua_close(lua_state); | 829 | lua_close(lua_state); |
| 833 | lua_assert(memdebug_numblocks == 0); | 830 | lua_assert(memcontrol.numblocks == 0); |
| 834 | lua_assert(memdebug_total == 0); | 831 | lua_assert(memcontrol.total == 0); |
| 835 | } | 832 | } |
| 836 | 833 | ||
| 837 | 834 | ||
| @@ -856,7 +853,7 @@ int luaB_opentests (lua_State *L) { | |||
| 856 | int main (int argc, char *argv[]) { | 853 | int main (int argc, char *argv[]) { |
| 857 | char *limit = getenv("MEMLIMIT"); | 854 | char *limit = getenv("MEMLIMIT"); |
| 858 | if (limit) | 855 | if (limit) |
| 859 | memdebug_memlimit = strtoul(limit, NULL, 10); | 856 | memcontrol.memlimit = strtoul(limit, NULL, 10); |
| 860 | l_main(argc, argv); | 857 | l_main(argc, argv); |
| 861 | return 0; | 858 | return 0; |
| 862 | } | 859 | } |
