[Date Prev][Date Next][Thread Prev][Thread Next]
- Subject: Re: How do you usually mix Lua and C callbacks?
- From: GrayFace <sergroj@...>
- Date: Tue, 15 Jul 2014 00:52:08 +0700
On 14.07.2014 22:51, Steven Degutis wrote:
I've got some C functions that take callback which has a void* pointer
for programmer-use. The technique I've been using is making a little
struct that holds the lua_State* and an int, which I store the return
value of luaL_ref'ing the given function. Then inside the C callback,
I take the Lua state and lua_rawgeti the function out of
LUA_REGISTRYINDEX, and call it.
But this seems very cumbersome and awkward. (Plus it means my function
won't be garbage-collected until I luaL_unref it out of there, but I'm
not sure that can be solved without making use of an explicit
"unregister" method for this C callback). Is there a better way to do
this that is less cumbersome and awkward? Thanks.
Well, instead of making a ref you can use the address of that little
struct as a lightweight userdata when you access the registry. This
won't solve the problem though, just make the struct smaller.
In many cases you don't need the little struct. When it's in the code of
executable, there normally is only one global Lua state, thus only the
ref needs storing.
You'll need to unregister the callback in any case. Only you know when
you no longer need the function. Either when the object for which the
callback is set gets destroyed or when you remove the callback or assign
a different one.
Sergey Rozhenko mailto:email@example.com