aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1999-05-24 14:51:05 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1999-05-24 14:51:05 -0300
commitabfc885079aef8cecf0235265ff173db22172ea5 (patch)
tree471d3d625258b009fbd53f833c32bb83729000b3
parent613b60c1565a1b1959822e76c04c38d44b565129 (diff)
downloadlua-abfc885079aef8cecf0235265ff173db22172ea5.tar.gz
lua-abfc885079aef8cecf0235265ff173db22172ea5.tar.bz2
lua-abfc885079aef8cecf0235265ff173db22172ea5.zip
when debugging, move and erase old blocks to realloc.
-rw-r--r--lmem.c80
1 files changed, 44 insertions, 36 deletions
diff --git a/lmem.c b/lmem.c
index 556f3a8a..1c334b64 100644
--- a/lmem.c
+++ b/lmem.c
@@ -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
32static unsigned long power2 (unsigned long n) { 30static 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
76void *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
90unsigned long numblocks = 0; 84unsigned long numblocks = 0;
91unsigned long totalmem = 0; 85unsigned long totalmem = 0;
92 86
93 87
94static void *checkblock (void *block) { 88static 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
104static 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