mirror of
https://github.com/lua/lua.git
synced 2025-01-14 05:43:00 +08:00
"mem.c.debug" incorporated (with "#if").
This commit is contained in:
parent
131d66efd2
commit
a8a15ff1bd
103
luamem.c
103
luamem.c
@ -3,7 +3,7 @@
|
||||
** TecCGraf - PUC-Rio
|
||||
*/
|
||||
|
||||
char *rcs_mem = "$Id: mem.c,v 1.12 1996/05/06 16:59:00 roberto Exp roberto $";
|
||||
char *rcs_mem = "$Id: mem.c,v 1.14 1997/02/25 11:12:28 roberto Exp roberto $";
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
@ -11,6 +11,10 @@ char *rcs_mem = "$Id: mem.c,v 1.12 1996/05/06 16:59:00 roberto Exp roberto $";
|
||||
#include "lua.h"
|
||||
|
||||
|
||||
#define DEBUG 0
|
||||
|
||||
#if !DEBUG
|
||||
|
||||
void luaI_free (void *block)
|
||||
{
|
||||
if (block)
|
||||
@ -56,3 +60,100 @@ void* luaI_buffer (unsigned long 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
|
||||
|
Loading…
x
Reference in New Issue
Block a user