commit dadba4d6ed9f7432185816abcbb788125aa991ff
parent d600a6b5b358c28d482b01f10bfa3292b17f5d12
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Tue, 16 Sep 1997 16:25:38 -0300
Interface to Memory Manager
Diffstat:
A | lmem.c | | | 137 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | lmem.h | | | 45 | +++++++++++++++++++++++++++++++++++++++++++++ |
D | luamem.c | | | 163 | ------------------------------------------------------------------------------- |
D | luamem.h | | | 40 | ---------------------------------------- |
4 files changed, 182 insertions(+), 203 deletions(-)
diff --git a/lmem.c b/lmem.c
@@ -0,0 +1,137 @@
+/*
+** $Id: $
+** Interface to Memory Manager
+** See Copyright Notice in lua.h
+*/
+
+
+#include <stdlib.h>
+
+#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 <assert.h>
+#include <string.h>
+
+
+#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
@@ -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
@@ -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 <stdlib.h>
-
-#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 <stdio.h>
-
-# 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
@@ -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
-