diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-05-24 14:51:05 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-05-24 14:51:05 -0300 |
| commit | abfc885079aef8cecf0235265ff173db22172ea5 (patch) | |
| tree | 471d3d625258b009fbd53f833c32bb83729000b3 | |
| parent | 613b60c1565a1b1959822e76c04c38d44b565129 (diff) | |
| download | lua-abfc885079aef8cecf0235265ff173db22172ea5.tar.gz lua-abfc885079aef8cecf0235265ff173db22172ea5.tar.bz2 lua-abfc885079aef8cecf0235265ff173db22172ea5.zip | |
when debugging, move and erase old blocks to realloc.
| -rw-r--r-- | lmem.c | 80 |
1 files changed, 44 insertions, 36 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lmem.c,v 1.15 1999/05/11 14:18:40 roberto Exp roberto $ | 2 | ** $Id: lmem.c,v 1.16 1999/05/20 20:43:06 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 | */ |
| @@ -26,8 +26,6 @@ | |||
| 26 | 26 | ||
| 27 | 27 | ||
| 28 | 28 | ||
| 29 | #ifndef DEBUG | ||
| 30 | |||
| 31 | 29 | ||
| 32 | static unsigned long power2 (unsigned long n) { | 30 | static unsigned long power2 (unsigned long n) { |
| 33 | unsigned long p = MINSIZE; | 31 | unsigned long p = MINSIZE; |
| @@ -48,6 +46,8 @@ void *luaM_growaux (void *block, unsigned long nelems, int inc, int size, | |||
| 48 | } | 46 | } |
| 49 | 47 | ||
| 50 | 48 | ||
| 49 | #ifndef DEBUG | ||
| 50 | |||
| 51 | /* | 51 | /* |
| 52 | ** generic allocation routine. | 52 | ** generic allocation routine. |
| 53 | */ | 53 | */ |
| @@ -73,33 +73,38 @@ void *luaM_realloc (void *block, unsigned long size) { | |||
| 73 | #include <string.h> | 73 | #include <string.h> |
| 74 | 74 | ||
| 75 | 75 | ||
| 76 | void *luaM_growaux (void *block, unsigned long nelems, int inc, int size, | ||
| 77 | char *errormsg, unsigned long limit) { | ||
| 78 | unsigned long newn = nelems+inc; | ||
| 79 | if (newn >= limit) | ||
| 80 | lua_error(errormsg); | ||
| 81 | return luaM_realloc(block, newn*size); | ||
| 82 | } | ||
| 83 | |||
| 84 | |||
| 85 | #define HEADER (sizeof(double)) | 76 | #define HEADER (sizeof(double)) |
| 86 | #define MARKSIZE 32 | 77 | #define MARKSIZE 16 |
| 87 | 78 | ||
| 88 | #define MARK 55 | 79 | #define MARK 55 |
| 89 | 80 | ||
| 81 | |||
| 82 | #define blocksize(b) ((unsigned long *)((char *)(b) - HEADER)) | ||
| 83 | |||
| 90 | unsigned long numblocks = 0; | 84 | unsigned long numblocks = 0; |
| 91 | unsigned long totalmem = 0; | 85 | unsigned long totalmem = 0; |
| 92 | 86 | ||
| 93 | 87 | ||
| 94 | static void *checkblock (void *block) { | 88 | static void *checkblock (void *block) { |
| 95 | unsigned long *b = (unsigned long *)((char *)block - HEADER); | 89 | if (block == NULL) |
| 96 | unsigned long size = *b; | 90 | return NULL; |
| 97 | int i; | 91 | else { |
| 98 | for (i=0;i<MARKSIZE;i++) | 92 | unsigned long *b = blocksize(block); |
| 99 | LUA_ASSERT(*(((char *)b)+size+HEADER+i) == MARK+i, "corrupted block"); | 93 | unsigned long size = *b; |
| 100 | numblocks--; | 94 | int i; |
| 101 | totalmem -= size; | 95 | for (i=0;i<MARKSIZE;i++) |
| 102 | return b; | 96 | LUA_ASSERT(*(((char *)b)+HEADER+size+i) == MARK+i, "corrupted block"); |
| 97 | numblocks--; | ||
| 98 | totalmem -= size; | ||
| 99 | return b; | ||
| 100 | } | ||
| 101 | } | ||
| 102 | |||
| 103 | |||
| 104 | static void freeblock (void *block) { | ||
| 105 | if (block) | ||
| 106 | memset(block, -1, *blocksize(block)); /* erase block */ | ||
| 107 | free(checkblock(block)); | ||
| 103 | } | 108 | } |
| 104 | 109 | ||
| 105 | 110 | ||
| @@ -108,24 +113,27 @@ void *luaM_realloc (void *block, unsigned long size) { | |||
| 108 | if (realsize != (size_t)realsize) | 113 | if (realsize != (size_t)realsize) |
| 109 | lua_error("memory allocation error: block too big"); | 114 | lua_error("memory allocation error: block too big"); |
| 110 | if (size == 0) { | 115 | if (size == 0) { |
| 116 | freeblock(block); | ||
| 117 | return NULL; | ||
| 118 | } | ||
| 119 | else { | ||
| 120 | char *newblock = malloc(realsize); | ||
| 121 | int i; | ||
| 111 | if (block) { | 122 | if (block) { |
| 112 | unsigned long *b = (unsigned long *)((char *)block - HEADER); | 123 | unsigned long oldsize = *blocksize(block); |
| 113 | memset(block, -1, *b); /* erase block */ | 124 | if (oldsize > size) oldsize = size; |
| 114 | block = checkblock(block); | 125 | memcpy(newblock+HEADER, block, oldsize); |
| 126 | freeblock(block); /* erase (and check) old copy */ | ||
| 115 | } | 127 | } |
| 116 | free(block); | 128 | if (newblock == NULL) |
| 117 | return NULL; | 129 | lua_error(memEM); |
| 130 | totalmem += size; | ||
| 131 | numblocks++; | ||
| 132 | *(unsigned long *)newblock = size; | ||
| 133 | for (i=0;i<MARKSIZE;i++) | ||
| 134 | *(newblock+HEADER+size+i) = MARK+i; | ||
| 135 | return newblock+HEADER; | ||
| 118 | } | 136 | } |
| 119 | if (block) | ||
| 120 | block = checkblock(block); | ||
| 121 | block = (unsigned long *)realloc(block, realsize); | ||
| 122 | if (block == NULL) | ||
| 123 | lua_error(memEM); | ||
| 124 | totalmem += size; | ||
| 125 | numblocks++; | ||
| 126 | *(unsigned long *)block = size; | ||
| 127 | { int i; for (i=0;i<MARKSIZE;i++) *(((char *)block)+size+HEADER+i) = MARK+i; } | ||
| 128 | return (unsigned long *)((char *)block+HEADER); | ||
| 129 | } | 137 | } |
| 130 | 138 | ||
| 131 | 139 | ||
