summaryrefslogtreecommitdiff
path: root/src/luamem.c
diff options
context:
space:
mode:
authorLua Team <team@lua.org>1997-07-01 12:00:00 +0000
committerrepogen <>1997-07-01 12:00:00 +0000
commit4f8c5d0f284e1f4da717aea5008915f185cd2e05 (patch)
tree5671acf8a2cacf0c0524ce96d22959590a3aa5af /src/luamem.c
parent47a298a24ad3a8202440051de5938618502302a0 (diff)
downloadlua-github-3.0.tar.gz
Lua 3.03.0
Diffstat (limited to 'src/luamem.c')
-rw-r--r--src/luamem.c159
1 files changed, 159 insertions, 0 deletions
diff --git a/src/luamem.c b/src/luamem.c
new file mode 100644
index 00000000..e4cdd6d9
--- /dev/null
+++ b/src/luamem.c
@@ -0,0 +1,159 @@
+/*
+** 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
+
+void luaI_free (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");
+ 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