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 | |
| parent | c8d219798a2edaf551284e9a49d3ac8da304aff1 (diff) | |
| download | lua-48326500d039c360f5abd0fe073902046124b1ba.tar.gz lua-48326500d039c360f5abd0fe073902046124b1ba.tar.bz2 lua-48326500d039c360f5abd0fe073902046124b1ba.zip | |
longer marks when controling memory leaks
| -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 | ||
