diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-05-20 17:43:06 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-05-20 17:43:06 -0300 |
commit | 48326500d039c360f5abd0fe073902046124b1ba (patch) | |
tree | 66a2dcbe6e8d5d99988df36c95d1876343eeb0a7 /lmem.c | |
parent | c8d219798a2edaf551284e9a49d3ac8da304aff1 (diff) | |
download | lua-48326500d039c360f5abd0fe073902046124b1ba.tar.gz lua-48326500d039c360f5abd0fe073902046124b1ba.tar.bz2 lua-48326500d039c360f5abd0fe073902046124b1ba.zip |
longer marks when controling memory leaks
Diffstat (limited to 'lmem.c')
-rw-r--r-- | lmem.c | 12 |
1 files changed, 7 insertions, 5 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lmem.c,v 1.14 1999/03/01 17:49:13 roberto Exp roberto $ | 2 | ** $Id: lmem.c,v 1.15 1999/05/11 14:18:40 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 | */ |
@@ -83,6 +83,7 @@ void *luaM_growaux (void *block, unsigned long nelems, int inc, int size, | |||
83 | 83 | ||
84 | 84 | ||
85 | #define HEADER (sizeof(double)) | 85 | #define HEADER (sizeof(double)) |
86 | #define MARKSIZE 32 | ||
86 | 87 | ||
87 | #define MARK 55 | 88 | #define MARK 55 |
88 | 89 | ||
@@ -93,8 +94,9 @@ unsigned long totalmem = 0; | |||
93 | static void *checkblock (void *block) { | 94 | static void *checkblock (void *block) { |
94 | unsigned long *b = (unsigned long *)((char *)block - HEADER); | 95 | unsigned long *b = (unsigned long *)((char *)block - HEADER); |
95 | unsigned long size = *b; | 96 | unsigned long size = *b; |
96 | LUA_ASSERT(*(((char *)b)+size+HEADER) == MARK, | 97 | int i; |
97 | "corrupted block"); | 98 | for (i=0;i<MARKSIZE;i++) |
99 | LUA_ASSERT(*(((char *)b)+size+HEADER+i) == MARK+i, "corrupted block"); | ||
98 | numblocks--; | 100 | numblocks--; |
99 | totalmem -= size; | 101 | totalmem -= size; |
100 | return b; | 102 | return b; |
@@ -102,7 +104,7 @@ static void *checkblock (void *block) { | |||
102 | 104 | ||
103 | 105 | ||
104 | void *luaM_realloc (void *block, unsigned long size) { | 106 | void *luaM_realloc (void *block, unsigned long size) { |
105 | unsigned long realsize = HEADER+size+1; | 107 | unsigned long realsize = HEADER+size+MARKSIZE; |
106 | if (realsize != (size_t)realsize) | 108 | if (realsize != (size_t)realsize) |
107 | lua_error("memory allocation error: block too big"); | 109 | lua_error("memory allocation error: block too big"); |
108 | if (size == 0) { | 110 | if (size == 0) { |
@@ -122,7 +124,7 @@ void *luaM_realloc (void *block, unsigned long size) { | |||
122 | totalmem += size; | 124 | totalmem += size; |
123 | numblocks++; | 125 | numblocks++; |
124 | *(unsigned long *)block = size; | 126 | *(unsigned long *)block = size; |
125 | *(((char *)block)+size+HEADER) = MARK; | 127 | { int i; for (i=0;i<MARKSIZE;i++) *(((char *)block)+size+HEADER+i) = MARK+i; } |
126 | return (unsigned long *)((char *)block+HEADER); | 128 | return (unsigned long *)((char *)block+HEADER); |
127 | } | 129 | } |
128 | 130 | ||