aboutsummaryrefslogtreecommitdiff
path: root/ltests.c
diff options
context:
space:
mode:
Diffstat (limited to 'ltests.c')
-rw-r--r--ltests.c47
1 files changed, 22 insertions, 25 deletions
diff --git a/ltests.c b/ltests.c
index a659d3af..2c0f5869 100644
--- a/ltests.c
+++ b/ltests.c
@@ -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
83unsigned long memdebug_numblocks = 0; 83
84unsigned long memdebug_total = 0; 84Memcontrol memcontrol = {0L, 0L, 0L, ULONG_MAX};
85unsigned long memdebug_maxmem = 0;
86unsigned long memdebug_memlimit = ULONG_MAX;
87 85
88 86
89static void *checkblock (void *block, size_t size) { 87static 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
98static void freeblock (void *block, size_t size) { 96static 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
110void *debug_realloc (void *block, size_t oldsize, size_t size) { 108void *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
261static int mem_query (lua_State *L) { 258static 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[] = {
830static void fim (void) { 827static 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) {
856int main (int argc, char *argv[]) { 853int 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}