Hi,
Greetings....
I am doing a few experiments with Lua and Lua memory consumptions. I have following memory allocator function registered with Lua via lua_newstate
lua_State *L = lua_newstate(myl_alloc,NULL);
static void *myl_alloc (void *ud, void *ptr, size_t osize,
size_t nsize)
{
(void)ud; (void)osize; /* not used */
if (nsize == 0) {
memsize-=osize;
// printf ("Freeing [%ld] bytes, memory size = [%ld] \n",osize, memsize);
free(ptr);
return NULL;
}
else
{
/*
if (memsize > 31000)
{
printf ("Memory exceeded 32K \n");
return NULL;
}
*/
memsize+=(nsize-osize);
// printf ("Allocating new [%ld] bytes,old size = [%ld], total = [%ld] \n",nsize, osize, memsize);
return realloc(ptr, nsize);
}
}
This function adds / subtracts the memory size used by Lua and stores the same in the global memsize variable.
At the end of the execution i.e. When I call lua_close - I expected to get a "zero" printed by the memsize but I am getting a negative number.
----------
The memory size = [-1165]
----------
Why is it that the memory count negative ?
I am pasting the code .....
Thanks and Regards
Santosh
Below is my script ..
------------------
function add(a, b)
a=10
b=20
print (a+b)
-- collectgarbage("collect")
print(collectgarbage("count"))
print ("Add - after garbage collect")
return a+b
end
function subt(a, b)
a=10
b=20
print (b-a)
print ("memory in subt")
-- collectgarbage("collect")
print(collectgarbage("count"))
return b-a
end
add (3,4)
---------------------
And the complete program is as below...
---------------
#include"lua.h"
#include"lauxlib.h"
#include"lualib.h"
#include<stdlib.h>
#include<stdio.h>
long memsize = 0;
static void *myl_alloc (void *ud, void *ptr, size_t osize,
size_t nsize);
int main ()
{
char str [80], *str1, *str2;
int i;
FILE *f = fopen("./add.lua", "rb");
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
fseek(f, 0, SEEK_SET);
str1 = malloc(fsize + 1);
fread(str1, fsize, 1, f);
fclose(f);
printf ("Add String = \n[%s]\n",str1);
FILE *f1 = fopen("./subt.lua", "rb");
fseek(f1, 0, SEEK_END);
fsize = ftell(f1);
fseek(f1, 0, SEEK_SET);
str2 = malloc(fsize + 1);
fread(str2, fsize, 1, f1);
fclose(f1);
printf ("Factorial String = \n[%s]\n",str2);
//lua_State *L = luaL_newstate();
lua_State *L = lua_newstate(myl_alloc,NULL);
luaL_openlibs(L);
luaL_loadstring(L, str1);
/*
if (lua_pcall(L,0, 1, 0)) {
printf ("Something went wrong during execution [%s\n",lua_tostring(L, -1)) ;
lua_pop(L,1);
}
*/
if (lua_pcall(L,0, LUA_MULTRET, 0)) {
printf ("Something went wrong during execution [%s\n",lua_tostring(L, -1)) ;
lua_pop(L,1);
}
do
{
printf ("Enter the operation: ");
scanf ("%79s",str);
// printf ("Memory before loadString = [%ld]\n",memsize);
if (strcmp (str, "add") == 0)
{
// printf ("Memory after loadString = [%ld]\n",memsize);
lua_getglobal(L, "add");
lua_pushnumber(L, 5);
lua_pushnumber(L, 5);
if (lua_pcall(L,2, 1, 0)) {
printf ("Something went wrong during execution [%s\n",lua_tostring(L, -1)) ;
lua_pop(L,1);
}
lua_pop(L,1);
// printf ("Memory after pcall = [%ld]\n",memsize);
}
if (strcmp (str, "subt") == 0)
{
luaL_loadstring(L, str2);
lua_getglobal(L, "subt");
lua_pushnumber(L, 5);
lua_pushnumber(L, 5);
printf ("Inside subt [%s]\n", lua_tostring(L, -1));
if (lua_pcall(L,2, 1, 0)) {
printf ("Something went wrong during execution [%s\n",lua_tostring(L, -1)) ;
lua_pop(L,1);
}
lua_pop(L,1);
}
printf ("You have entered %s \n",str);
} while (strcmp (str, "quit"));
lua_close(L);
printf ("The memory size = [%ld]\n",memsize);
return 0;
}
static void *myl_alloc (void *ud, void *ptr, size_t osize,
size_t nsize)
{
(void)ud; (void)osize; /* not used */
if (nsize == 0) {
memsize-=osize;
// printf ("Freeing [%ld] bytes, memory size = [%ld] \n",osize, memsize);
free(ptr);
return NULL;
}
else
{
/*
if (memsize > 31000)
{
printf ("Memory exceeded 32K \n");
return NULL;
}
*/
memsize+=(nsize-osize);
// printf ("Allocating new [%ld] bytes,old size = [%ld], total = [%ld] \n",nsize, osize, memsize);
return realloc(ptr, nsize);
}
}
--------------