Вызов функции c из Lua-дорожек

Я хочу вызвать функцию c из lua, используя полосы.

      // c code
int initApp(lua_State *L) {
    lua_createtable(L, 0, 0);
    
    lua_pushcfunction(L, get_appinfo);
    lua_setfield(L, -2, "get_appinfo");
    
    lua_setglobal(L, "App");
    
    return 0;
}
// lua code
local function thread1(n)
    return App.get_appinfo(n)
end

function startlanes()
    local lanes = require 'lanes'
    package.preload['App'] = function() return App end
    package.loaded['App'] = App
    local app = require 'App'
    print(app, app.get_appinfo) //table: 0x1234    function: 0x5678
    //(1)
    f = lanes.gen('*', {required = {'App'}}, thread1) //Lua Error: module 'App' not found: no field package.preload['App']...
    //(2)
    --f = lanes.gen('App', thread1) // Bad library name: App
    a = f(1)
    sleep(1)
end

Когда я запускаю вариант (1), я получаю Lua Error: module 'App' not found: no field package.preload['App']...no file '/App.lua'.... Когда я запускаю вариант (2), я получаю Bad library name: App.

Как позвонить App.get_appinfo() с использованием lanes? Я могу переместить все Appфункции в пакет, но он должен быть загружен из памяти, а не из файловой системы. Я встраиваю все пакеты lua.

2 ответа

Чтобы вызвать функцию c, я должен передать функцию для on_state_createк lanes.configure.

      //c code
int init_App(lua_State *L) {
    lua_createtable(L, 0, 0);
    
    lua_pushcfunction(L, get_appinfo);
    lua_setfield(L, -2, "get_appinfo");
    
    lua_setglobal(L, "App");
    
    return 0;
}

int init(lua_State *L) {
    lua_pushcfunction(L, init_App);
    lua_setglobal(L, "init_App");
    luaL_dostring(L, "local lanes = require 'lanes'.configure{on_state_create=init_App}; local l = lanes.linda()");
    luaL_dostring(L, "startlanes()");
}

--lua code
local function thread1(n)
    return App.get_appinfo(n)
end

function startlanes()
    local lanes = require 'lanes'
    local f = lanes.gen('*', thread1)
    a = f(1)
    sleep(1)
    print(a[1])
end
  1. Раскройте свою функцию C initAppна Lua, например, как _G.init_App
          lua_pushcfunction(L, initApp);
    lua_setglobal(L, "init_App");
  1. Передайте его как параметр при запуске каждой дорожки
  2. Внутри переулка вызовите init_App(получается вторым параметром) - создаст вашу библиотеку
      local function thread1(n, init_App)
    init_App()  -- create global table App in the current lane
    return App.get_appinfo(n)
end

function startlanes()
    local lanes = require 'lanes'
    local f = lanes.gen('*', thread1)
    a = f(1, init_App)  -- pass your module loader as argument
    sleep(1)
end
Другие вопросы по тегам