Как я могу выполнить Lua обратный вызов от C (асинхронно)? - PullRequest
3 голосов
/ 21 марта 2020

Я хочу вызвать функцию в Lua из библиотеки C, но сделать это асинхронно.

У меня есть некоторый код Lua, который выглядит следующим образом:

l = require "mylib"

l.subscribe(function ()
  print("Called")
  error("This is an error")
end)

mylib реализовано с использованием Lua C API. Это выглядит примерно так:

struct cb {
  int ref;
  lua_State *state;
}

int number_callbacks;
struct **cb callback_functions;

static int subscribe(lua_State *L) {

  lua_settop(L, 1);
  luaL_checktype(L, 1, LUA_TFUNCTION);

  struct cb c;
  c.ref = luaL_ref(L, LUA_REGISTRYINDEX);
  c.state = L;

  // store c in callback_functions
}

// foo is registered as a callback to another C lib and
// is called occasionaly
static void foo(int callback_code) {

   for (int i = 0; i < number_callbacks; i++) {

     struct cb c = callback_functions[i];
     lua_rawgeti(c->state, LUA_REGISTRYINDEX, c->ref);
     lua_pushinteger(c->state, callback_code);

     int ret = lua_pcall(c->state, 1, 0, 0);

     // Check ret...
   }
}

Сообщение в обратном вызове печатается, однако error отображается не в том месте (говорит, что оно было вызвано какой-то не связанной функцией). Я предполагаю, что это потому, что состояние Lua изменилось.

Как правильно это сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...