|
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_newstatelua_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 RegardsSantoshBelow is my script ..------------------function add(a, b)a=10b=20print (a+b)-- collectgarbage("collect")print(collectgarbage("count"))print ("Add - after garbage collect")return a+bendfunction subt(a, b)a=10b=20print (b-a)print ("memory in subt")-- collectgarbage("collect")print(collectgarbage("count"))return b-aendadd (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);}}--------------