lua-users home
lua-l archive

Callbacks using a 3rd party library in C

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Hello,
I need some help or ideas for the following problem:
Assume a third party C library to wich I can register any number of callbacks that this library will sometimes call, like:
foo * f = foo_open(...);
foo_reg_cb(f, "nameA", <void *userdata>, <void *callback(void *)> );
foo_reg_cb(f, "nameB", <void *userdata>, <void *callback(void *)> );
...
I can register as many callbacks as I would like. Every callback is given a unique name. Now, somewhere later, the foo-library will use the callbacks during a heavy computation. The call to the libray is somthing like:
int l_foo_open(lua_State * L)
{
 foo * f = foo_open(lua_tostring(L, 1), ...);
 lua_pushlightuserdata(L, f);
 return 1;
}
int l_foo_compute(lua_State * L)
{
 foo * f = (foo *)lua_touserdata(L, 1);
 foo_compute(f);
 return 0;
}
Now the problem:
How can I write a wrapper arround foo_reg_cb() to register lua functions? This will not work:
static int callback_wrapper(void *userdata)
{
 lua_State * L = (lua_State * userdata);
 /* PROBLEM: how to find the the function to call ???
 lua_call(L, 0, 0);
 return 0;
}
int l_foo_reg_cb(lua_State * L)
{
 foo * f = (foo *)lua_touserdata(L, 1);
 char * name = lua_tostring(L, 2);
 /* PROBLEM: What todo with the 3rd arg, the lua callback function? */
 foo_reg_cb(f, name, L, callback_wrapper);
 return 0;
}
How should I deal with this problem? I don't like the idea of a global lua_State and pass the function itself or some reference to the wrapper, because then it won't be possible to use this binding with two or more different lua-States in the same host. The Problem is, that there is not an fixed number of callbacks, so that I can't write N callback_wrappers.
Any Ideas?

Attachment: signature.asc
Description: OpenPGP digital signature


AltStyle によって変換されたページ (->オリジナル) /