From e7659883cc6fca343785da2a1af3890ae273abbf Mon Sep 17 00:00:00 2001 From: sfan5 Date: Mon, 2 May 2022 20:55:04 +0200 Subject: Async environment for mods to do concurrent tasks (#11131) --- builtin/async/game.lua | 46 ++++++++++++++++++++++++++++++++++++++++++++++ builtin/async/init.lua | 11 ----------- builtin/async/mainmenu.lua | 9 +++++++++ 3 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 builtin/async/game.lua delete mode 100644 builtin/async/init.lua create mode 100644 builtin/async/mainmenu.lua (limited to 'builtin/async') diff --git a/builtin/async/game.lua b/builtin/async/game.lua new file mode 100644 index 000000000..212a33e17 --- /dev/null +++ b/builtin/async/game.lua @@ -0,0 +1,46 @@ +core.log("info", "Initializing asynchronous environment (game)") + +local function pack2(...) + return {n=select('#', ...), ...} +end + +-- Entrypoint to run async jobs, called by C++ +function core.job_processor(func, params) + local retval = pack2(func(unpack(params, 1, params.n))) + + return retval +end + +-- Import a bunch of individual files from builtin/game/ +local gamepath = core.get_builtin_path() .. "game" .. DIR_DELIM + +dofile(gamepath .. "constants.lua") +dofile(gamepath .. "item_s.lua") +dofile(gamepath .. "misc_s.lua") +dofile(gamepath .. "features.lua") +dofile(gamepath .. "voxelarea.lua") + +-- Transfer of globals +do + assert(core.transferred_globals) + local all = core.deserialize(core.transferred_globals, true) + core.transferred_globals = nil + + -- reassemble other tables + all.registered_nodes = {} + all.registered_craftitems = {} + all.registered_tools = {} + for k, v in pairs(all.registered_items) do + if v.type == "node" then + all.registered_nodes[k] = v + elseif v.type == "craftitem" then + all.registered_craftitems[k] = v + elseif v.type == "tool" then + all.registered_tools[k] = v + end + end + + for k, v in pairs(all) do + core[k] = v + end +end diff --git a/builtin/async/init.lua b/builtin/async/init.lua deleted file mode 100644 index 3803994d6..000000000 --- a/builtin/async/init.lua +++ /dev/null @@ -1,11 +0,0 @@ - -core.log("info", "Initializing Asynchronous environment") - -function core.job_processor(func, serialized_param) - local param = core.deserialize(serialized_param) - - local retval = core.serialize(func(param)) - - return retval or core.serialize(nil) -end - diff --git a/builtin/async/mainmenu.lua b/builtin/async/mainmenu.lua new file mode 100644 index 000000000..0e9c222d1 --- /dev/null +++ b/builtin/async/mainmenu.lua @@ -0,0 +1,9 @@ +core.log("info", "Initializing asynchronous environment") + +function core.job_processor(func, serialized_param) + local param = core.deserialize(serialized_param) + + local retval = core.serialize(func(param)) + + return retval or core.serialize(nil) +end -- cgit v1.2.3 From ec9f1575121e3b064b919bca7efddfa8b0fc4e65 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Mon, 9 May 2022 18:20:10 +0200 Subject: Use native packer to transfer globals into async env(s) --- builtin/async/game.lua | 3 +-- builtin/game/misc.lua | 2 +- src/script/common/c_packer.h | 2 +- src/script/scripting_server.cpp | 9 +++++---- src/server.cpp | 1 - src/server.h | 5 +++-- 6 files changed, 11 insertions(+), 11 deletions(-) (limited to 'builtin/async') diff --git a/builtin/async/game.lua b/builtin/async/game.lua index 212a33e17..8cb9720b6 100644 --- a/builtin/async/game.lua +++ b/builtin/async/game.lua @@ -22,8 +22,7 @@ dofile(gamepath .. "voxelarea.lua") -- Transfer of globals do - assert(core.transferred_globals) - local all = core.deserialize(core.transferred_globals, true) + local all = assert(core.transferred_globals) core.transferred_globals = nil -- reassemble other tables diff --git a/builtin/game/misc.lua b/builtin/game/misc.lua index 9f5e3312b..997b1894a 100644 --- a/builtin/game/misc.lua +++ b/builtin/game/misc.lua @@ -262,5 +262,5 @@ function core.get_globals_to_transfer() registered_items = copy_filtering(core.registered_items), registered_aliases = core.registered_aliases, } - return core.serialize(all) + return all end diff --git a/src/script/common/c_packer.h b/src/script/common/c_packer.h index ee732be86..fe072c10a 100644 --- a/src/script/common/c_packer.h +++ b/src/script/common/c_packer.h @@ -119,7 +119,7 @@ void script_register_packer(lua_State *L, const char *regname, // Pack a Lua value PackedValue *script_pack(lua_State *L, int idx); // Unpack a Lua value (left on top of stack) -// Note that this may modify the PackedValue, you can't reuse it! +// Note that this may modify the PackedValue, reusability is not guaranteed! void script_unpack(lua_State *L, PackedValue *val); // Dump contents of PackedValue to stdout for debugging diff --git a/src/script/scripting_server.cpp b/src/script/scripting_server.cpp index 5b99468dc..b462141b0 100644 --- a/src/script/scripting_server.cpp +++ b/src/script/scripting_server.cpp @@ -98,8 +98,9 @@ void ServerScripting::initAsync() luaL_checktype(L, -1, LUA_TTABLE); lua_getfield(L, -1, "get_globals_to_transfer"); lua_call(L, 0, 1); - luaL_checktype(L, -1, LUA_TSTRING); - getServer()->m_async_globals_data.set(readParam(L, -1)); + auto *data = script_pack(L, -1); + assert(!data->contains_userdata); + getServer()->m_async_globals_data.reset(data); lua_pushnil(L); lua_setfield(L, -3, "get_globals_to_transfer"); // unset function too lua_pop(L, 2); // pop 'core', return value @@ -183,8 +184,8 @@ void ServerScripting::InitializeAsync(lua_State *L, int top) // globals data lua_getglobal(L, "core"); luaL_checktype(L, -1, LUA_TTABLE); - std::string s = ModApiBase::getServer(L)->m_async_globals_data.get(); - lua_pushlstring(L, s.c_str(), s.size()); + auto *data = ModApiBase::getServer(L)->m_async_globals_data.get(); + script_unpack(L, data); lua_setfield(L, -2, "transferred_globals"); lua_pop(L, 1); // pop 'core' } diff --git a/src/server.cpp b/src/server.cpp index ebe1d1f6b..d93f300d2 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -243,7 +243,6 @@ Server::Server( m_clients(m_con), m_admin_chat(iface), m_on_shutdown_errmsg(on_shutdown_errmsg), - m_async_globals_data(""), m_modchannel_mgr(new ModChannelMgr()) { if (m_path_world.empty()) diff --git a/src/server.h b/src/server.h index ecba30b95..2c21f5dfc 100644 --- a/src/server.h +++ b/src/server.h @@ -73,6 +73,7 @@ struct Lighting; class ServerThread; class ServerModManager; class ServerInventoryManager; +struct PackedValue; enum ClientDeletionReason { CDR_LEAVE, @@ -388,8 +389,8 @@ public: // Lua files registered for init of async env, pair of modname + path std::vector> m_async_init_files; - // Serialized data transferred into async envs at init time - MutexedVariable m_async_globals_data; + // Data transferred into async envs at init time + std::unique_ptr m_async_globals_data; // Bind address Address m_bind_addr; -- cgit v1.2.3