Вызов функции 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
- Раскройте свою функцию C
initApp
на Lua, например, как_G.init_App
lua_pushcfunction(L, initApp);
lua_setglobal(L, "init_App");
- Передайте его как параметр при запуске каждой дорожки
- Внутри переулка вызовите
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