[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Best way to save/re-load an lua state
- From: "kathrin_69@..." <kathrin_69@...>
- Date: Sat, 21 Mar 2009 13:09:36 +0100
Hello Ben and every buddy else,
I investigated a bit and it seems much simpler: If I call lua_Newstate
instead of luaL_Newstate as I did until now, I am able to pass an
allocator function which is used exclusively for memory management by
Lua regarding the lua_State* it is assigned to.
The default allocator function used by luaL_Newstate() is this:
-----------------------------
static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
(void)ud;
(void)osize;
if (nsize == 0) {
free(ptr);
return NULL;
}
else
return realloc(ptr, nsize);
}
-----------------------------
If I would overwrite it in a way so that all memory used by my
lua_State* is inside my own (pre-allocated) buffer, I could just save
and re-load that buffer to/from disc and resume execution. What do you
think, will this work? It sounds pretty easy so far.
Two questions to the l_alloc function shown above:
1. What is void* ud for? The src code says something about "auxiliary
data to the allocation function". Why is it not used by that function?
2. What are the first two lines for?
(void)ud;
(void)osize;
They do absolutely nothing, right? Are they there to let the compiler
check something?
Thank you + Regards
Joeerg
Ben Sunshine-Hill schrieb:
If you want to serialize *everything* in the Lua state, the easiest
approach is a Lua variant called lper. That basically does your #3.
It's unix-specific, though... I'm not sure how much work would be
involved in porting it to win32.
Ben
On Fri, Mar 20, 2009 at 7:10 AM, kathrin_69@gmx.de <kathrin_69@gmx.de> wrote:
Hi,
I want to save the state of a Lua VM to a file to re-load and restart
execution later.
Three options come to my mind:
1. Serializing the global index table of the VM. I even found a library
called "Pluto" which promises to do this.
2. Trying to make a deep copy of the lua_State* pointing to a VM and
save/load the binary data.
3. Trying to overwrite malloc/free for the Lua.dll, place all memory the VM
holds in an pre-allocated chunk. Save and re-load that whole chunk. I'm not
sure If I'm yet experienced (in C/C++) enough to get this done. Probably
not.
My Questions are:
1. Which of that options will work or which one are used and which not?
2. Are there any other options I missed?
3. Which option is most promising in terms of time and complexity?
4. Are there any other helper libraries (beside Pluto) which helps doing one
of the options?
Thank you!
Regards
Joerg