From dadba4d6ed9f7432185816abcbb788125aa991ff Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Tue, 16 Sep 1997 16:25:59 -0300 Subject: [PATCH] Interface to Memory Manager --- lmem.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++ lmem.h | 45 +++++++++++++++ luamem.c | 163 ------------------------------------------------------- luamem.h | 40 -------------- 4 files changed, 182 insertions(+), 203 deletions(-) create mode 100644 lmem.c create mode 100644 lmem.h delete mode 100644 luamem.c delete mode 100644 luamem.h diff --git a/lmem.c b/lmem.c new file mode 100644 index 00000000..8aeb9974 --- /dev/null +++ b/lmem.c @@ -0,0 +1,137 @@ +/* +** $Id: $ +** Interface to Memory Manager +** See Copyright Notice in lua.h +*/ + + +#include + +#include "lmem.h" +#include "lua.h" + + + +int luaM_growaux (void **block, unsigned long nelems, int size, + char *errormsg, unsigned long limit) +{ + if (nelems >= limit) + lua_error(errormsg); + nelems = (nelems == 0) ? 32 : nelems*2; + if (nelems > limit) + nelems = limit; + *block = luaM_realloc(*block, nelems*size); + return (int)nelems; +} + + +static unsigned long Mbuffsize = 0; +static char *Mbuffer = NULL; + + +void *luaM_buffer (unsigned long size) +{ + if (size > Mbuffsize) { + Mbuffsize = size; + Mbuffer = luaM_realloc(Mbuffer, Mbuffsize); + } + return Mbuffer; +} + + +void luaM_clearbuffer (void) +{ + Mbuffsize /= 2; + Mbuffer = luaM_realloc(Mbuffer, Mbuffsize); +} + + +#ifndef DEBUG + +/* +** generic allocation routine. +** real ANSI systems do not need some of these tests, +** since realloc(NULL, s)==malloc(s) and realloc(b, 0)==free(b). +** But some systems (e.g. Sun OS) are not that ANSI... +*/ +void *luaM_realloc (void *block, unsigned long size) +{ + size_t s = (size_t)size; + if (s != size) + lua_error("Allocation Error: Block too big"); + if (size == 0) { + if (block) { + free(block); + } + return NULL; + } + block = block ? realloc(block, s) : malloc(s); + if (block == NULL) + lua_error(memEM); + return block; +} + + + +#else +/* DEBUG */ + +#include +#include + + +#define MARK 55 + +static unsigned long numblocks = 0; +static unsigned long totalmem = 0; + + + +void luaM_query (void) +{ + lua_pushnumber(totalmem); + lua_pushnumber(numblocks); +} + + +static void *checkblock (void *block) +{ + unsigned long *b = (unsigned long *)block - 1; + unsigned long size = *b; + assert(*(((char *)b)+size+sizeof(unsigned long)) == MARK); + numblocks--; + totalmem -= size; + return b; +} + + +void *luaM_realloc (void *block, unsigned long size) +{ + unsigned long realsize = sizeof(unsigned long)+size+sizeof(char); + if (realsize != (size_t)realsize) + lua_error("Allocation Error: Block too big"); + if (size == 0) { /* ANSI doen't need this, but some machines... */ + if (block) { + memset(block, -1, *((unsigned long *)block-1)); /* erase block */ + block = checkblock(block); + free(block); + } + return NULL; + } + if (block) { + block = checkblock(block); + block = (unsigned long *)realloc(block, realsize); + } + else + block = (unsigned long *)malloc(realsize); + if (block == NULL) + lua_error(memEM); + totalmem += size; + numblocks++; + *(unsigned long *)block = size; + *(((char *)block)+size+sizeof(unsigned long)) = MARK; + return (unsigned long *)block+1; +} + + +#endif diff --git a/lmem.h b/lmem.h new file mode 100644 index 00000000..dcc1c1a4 --- /dev/null +++ b/lmem.h @@ -0,0 +1,45 @@ +/* +** $Id: $ +** Interface to Memory Manager +** See Copyright Notice in lua.h +*/ + +#ifndef lmem_h +#define lmem_h + + +#ifndef NULL +#define NULL 0 +#endif + + +/* memory error messages */ +#define codeEM "code size overflow" +#define symbolEM "symbol table overflow" +#define constantEM "constant table overflow" +#define stackEM "stack size overflow" +#define lexEM "lex buffer overflow" +#define refEM "reference table overflow" +#define tableEM "table overflow" +#define memEM "not enough memory" + +void *luaM_buffer (unsigned long size); +void luaM_clearbuffer (void); +void *luaM_realloc (void *oldblock, unsigned long size); +int luaM_growaux (void **block, unsigned long nelems, int size, + char *errormsg, unsigned long limit); + +#define luaM_free(b) luaM_realloc((b), 0) +#define luaM_malloc(t) luaM_realloc(NULL, (t)) +#define luaM_new(t) ((t *)luaM_malloc(sizeof(t))) +#define luaM_newvector(n,t) ((t *)luaM_malloc((n)*sizeof(t))) +#define luaM_growvector(old,n,t,e,l) \ + (luaM_growaux((void**)old,n,sizeof(t),e,l)) +#define luaM_reallocvector(v,n,t) ((t *)luaM_realloc(v,(n)*sizeof(t))) + + +void luaM_query (void); /* only ifdef DEBUG */ + + +#endif + diff --git a/luamem.c b/luamem.c deleted file mode 100644 index 812da490..00000000 --- a/luamem.c +++ /dev/null @@ -1,163 +0,0 @@ -/* -** mem.c -** TecCGraf - PUC-Rio -*/ - -char *rcs_luamem = "$Id: luamem.c,v 1.16 1997/04/01 21:23:20 roberto Exp $"; - -#include - -#include "luamem.h" -#include "lua.h" - - -#define DEBUG 0 - -#if !DEBUG - -static void lfree (void *block) -{ - if (block) - { - *((char *)block) = -1; /* to catch errors */ - free(block); - } -} - - -void *luaI_realloc (void *oldblock, unsigned long size) -{ - void *block; - size_t s = (size_t)size; - if (s != size) - lua_error("Allocation Error: Block too big"); - if (size == 0) { /* ANSI doen't need this, but some machines... */ - lfree(oldblock); - return NULL; - } - block = oldblock ? realloc(oldblock, s) : malloc(s); - if (block == NULL) - lua_error(memEM); - return block; -} - - -int luaI_growvector (void **block, unsigned long nelems, int size, - char *errormsg, unsigned long limit) -{ - if (nelems >= limit) - lua_error(errormsg); - nelems = (nelems == 0) ? 20 : nelems*2; - if (nelems > limit) - nelems = limit; - *block = luaI_realloc(*block, nelems*size); - return (int)nelems; -} - - -void* luaI_buffer (unsigned long size) -{ - static unsigned long buffsize = 0; - static char* buffer = NULL; - if (size > buffsize) - buffer = luaI_realloc(buffer, buffsize=size); - return buffer; -} - -#else -/* DEBUG */ - -#include - -# define assert(ex) {if (!(ex)){(void)fprintf(stderr, \ - "Assertion failed: file \"%s\", line %d\n", __FILE__, __LINE__);exit(1);}} - -#define MARK 55 - -static unsigned long numblocks = 0; -static unsigned long totalmem = 0; - - -static void message (void) -{ -#define inrange(x,y) ((x) < (((y)*3)/2) && (x) > (((y)*2)/3)) - static int count = 0; - static unsigned long lastnumblocks = 0; - static unsigned long lasttotalmem = 0; - if (!inrange(numblocks, lastnumblocks) || !inrange(totalmem, lasttotalmem) - || count++ >= 5000) - { - fprintf(stderr,"blocks = %lu mem = %luK\n", numblocks, totalmem/1000); - count = 0; - lastnumblocks = numblocks; - lasttotalmem = totalmem; - } -} - - -void luaI_free (void *block) -{ - if (block) - { - unsigned long *b = (unsigned long *)block - 1; - unsigned long size = *b; - assert(*(((char *)b)+size+sizeof(unsigned long)) == MARK); - numblocks--; - totalmem -= size; - free(b); - message(); - } -} - - -void *luaI_realloc (void *oldblock, unsigned long size) -{ - unsigned long *block; - unsigned long realsize = sizeof(unsigned long)+size+sizeof(char); - if (realsize != (size_t)realsize) - lua_error("Allocation Error: Block too big"); - if (oldblock) - { - unsigned long *b = (unsigned long *)oldblock - 1; - unsigned long oldsize = *b; - assert(*(((char *)b)+oldsize+sizeof(unsigned long)) == MARK); - totalmem -= oldsize; - numblocks--; - block = (unsigned long *)realloc(b, realsize); - } - else - block = (unsigned long *)malloc(realsize); - if (block == NULL) - lua_error("not enough memory"); - totalmem += size; - numblocks++; - *block = size; - *(((char *)block)+size+sizeof(unsigned long)) = MARK; - message(); - return block+1; -} - - -int luaI_growvector (void **block, unsigned long nelems, int size, - char *errormsg, unsigned long limit) -{ - if (nelems >= limit) - lua_error(errormsg); - nelems = (nelems == 0) ? 20 : nelems*2; - if (nelems > limit) - nelems = limit; - *block = luaI_realloc(*block, nelems*size); - return (int)nelems; -} - - -void* luaI_buffer (unsigned long size) -{ - static unsigned long buffsize = 0; - static char* buffer = NULL; - if (size > buffsize) - buffer = luaI_realloc(buffer, buffsize=size); - return buffer; -} - -#endif diff --git a/luamem.h b/luamem.h deleted file mode 100644 index f9c573d7..00000000 --- a/luamem.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -** mem.c -** memory manager for lua -** $Id: luamem.h,v 1.10 1997/07/29 20:38:45 roberto Exp roberto $ -*/ - -#ifndef luamem_h -#define luamem_h - -#ifndef NULL -#define NULL 0 -#endif - - -/* memory error messages */ -#define codeEM "code size overflow" -#define symbolEM "symbol table overflow" -#define constantEM "constant table overflow" -#define stackEM "stack size overflow" -#define lexEM "lex buffer overflow" -#define refEM "reference table overflow" -#define tableEM "table overflow" -#define memEM "not enough memory" - - -void *luaI_realloc (void *oldblock, unsigned long size); -void *luaI_buffer (unsigned long size); -int luaI_growvector (void **block, unsigned long nelems, int size, - char *errormsg, unsigned long limit); - -#define luaI_free(b) luaI_realloc((b), 0) -#define luaI_malloc(s) luaI_realloc(NULL, (s)) -#define new(s) ((s *)luaI_malloc(sizeof(s))) -#define newvector(n,s) ((s *)luaI_malloc((n)*sizeof(s))) -#define growvector(old,n,s,e,l) \ - (luaI_growvector((void**)old,n,sizeof(s),e,l)) -#define shrinkvector(v,n,t) ((t *)luaI_realloc(v,(n)*sizeof(t))) - -#endif -