Use native packer to transfer globals into async env(s)

This commit is contained in:
sfan5 2022-05-09 18:20:10 +02:00
parent 7f58887ae3
commit ec9f157512
6 changed files with 11 additions and 11 deletions

@ -22,8 +22,7 @@ dofile(gamepath .. "voxelarea.lua")
-- Transfer of globals -- Transfer of globals
do do
assert(core.transferred_globals) local all = assert(core.transferred_globals)
local all = core.deserialize(core.transferred_globals, true)
core.transferred_globals = nil core.transferred_globals = nil
-- reassemble other tables -- reassemble other tables

@ -262,5 +262,5 @@ function core.get_globals_to_transfer()
registered_items = copy_filtering(core.registered_items), registered_items = copy_filtering(core.registered_items),
registered_aliases = core.registered_aliases, registered_aliases = core.registered_aliases,
} }
return core.serialize(all) return all
end end

@ -119,7 +119,7 @@ void script_register_packer(lua_State *L, const char *regname,
// Pack a Lua value // Pack a Lua value
PackedValue *script_pack(lua_State *L, int idx); PackedValue *script_pack(lua_State *L, int idx);
// Unpack a Lua value (left on top of stack) // 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); void script_unpack(lua_State *L, PackedValue *val);
// Dump contents of PackedValue to stdout for debugging // Dump contents of PackedValue to stdout for debugging

@ -98,8 +98,9 @@ void ServerScripting::initAsync()
luaL_checktype(L, -1, LUA_TTABLE); luaL_checktype(L, -1, LUA_TTABLE);
lua_getfield(L, -1, "get_globals_to_transfer"); lua_getfield(L, -1, "get_globals_to_transfer");
lua_call(L, 0, 1); lua_call(L, 0, 1);
luaL_checktype(L, -1, LUA_TSTRING); auto *data = script_pack(L, -1);
getServer()->m_async_globals_data.set(readParam<std::string>(L, -1)); assert(!data->contains_userdata);
getServer()->m_async_globals_data.reset(data);
lua_pushnil(L); lua_pushnil(L);
lua_setfield(L, -3, "get_globals_to_transfer"); // unset function too lua_setfield(L, -3, "get_globals_to_transfer"); // unset function too
lua_pop(L, 2); // pop 'core', return value lua_pop(L, 2); // pop 'core', return value
@ -183,8 +184,8 @@ void ServerScripting::InitializeAsync(lua_State *L, int top)
// globals data // globals data
lua_getglobal(L, "core"); lua_getglobal(L, "core");
luaL_checktype(L, -1, LUA_TTABLE); luaL_checktype(L, -1, LUA_TTABLE);
std::string s = ModApiBase::getServer(L)->m_async_globals_data.get(); auto *data = ModApiBase::getServer(L)->m_async_globals_data.get();
lua_pushlstring(L, s.c_str(), s.size()); script_unpack(L, data);
lua_setfield(L, -2, "transferred_globals"); lua_setfield(L, -2, "transferred_globals");
lua_pop(L, 1); // pop 'core' lua_pop(L, 1); // pop 'core'
} }

@ -243,7 +243,6 @@ Server::Server(
m_clients(m_con), m_clients(m_con),
m_admin_chat(iface), m_admin_chat(iface),
m_on_shutdown_errmsg(on_shutdown_errmsg), m_on_shutdown_errmsg(on_shutdown_errmsg),
m_async_globals_data(""),
m_modchannel_mgr(new ModChannelMgr()) m_modchannel_mgr(new ModChannelMgr())
{ {
if (m_path_world.empty()) if (m_path_world.empty())

@ -73,6 +73,7 @@ struct Lighting;
class ServerThread; class ServerThread;
class ServerModManager; class ServerModManager;
class ServerInventoryManager; class ServerInventoryManager;
struct PackedValue;
enum ClientDeletionReason { enum ClientDeletionReason {
CDR_LEAVE, CDR_LEAVE,
@ -388,8 +389,8 @@ public:
// Lua files registered for init of async env, pair of modname + path // Lua files registered for init of async env, pair of modname + path
std::vector<std::pair<std::string, std::string>> m_async_init_files; std::vector<std::pair<std::string, std::string>> m_async_init_files;
// Serialized data transferred into async envs at init time // Data transferred into async envs at init time
MutexedVariable<std::string> m_async_globals_data; std::unique_ptr<PackedValue> m_async_globals_data;
// Bind address // Bind address
Address m_bind_addr; Address m_bind_addr;