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