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 | } |