]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Use native packer to transfer globals into async env(s)
authorsfan5 <sfan5@live.de>
Mon, 9 May 2022 16:20:10 +0000 (18:20 +0200)
committersfan5 <sfan5@live.de>
Tue, 10 May 2022 20:37:42 +0000 (22:37 +0200)
builtin/async/game.lua
builtin/game/misc.lua
src/script/common/c_packer.h
src/script/scripting_server.cpp
src/server.cpp
src/server.h

index 212a33e17ed63870000e593b5f925b80836f209c..8cb9720b66d113aaac82cd4fd96e5ee520665fb0 100644 (file)
@@ -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
index 9f5e3312bb42077a86d9579787162b09a23c93c7..997b1894a8acda38040e5e62d6e7ffa6be62fed8 100644 (file)
@@ -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
index ee732be860f9458811741212f687c9fdf27a75e4..fe072c10aeebb014ee62d80adb40ae36e502f7ee 100644 (file)
@@ -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
index 5b99468dcc28c7d7b9d6f93a992c1eef0257e6f7..b462141b09ec0b9068a0b5705b53e8a78bbe24b5 100644 (file)
@@ -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<std::string>(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'
 }
index ebe1d1f6b5393788457866115441751e70af1d34..d93f300d287f2152952e3e2252872b849eddd5d9 100644 (file)
@@ -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())
index ecba30b952b7ea4012fa4b6159577f8109f5e829..2c21f5dfc899c5a812b39a1a9f28f96ea4e06773 100644 (file)
@@ -73,6 +73,7 @@ struct Lighting;
 class ServerThread;
 class ServerModManager;
 class ServerInventoryManager;
+struct PackedValue;
 
 enum ClientDeletionReason {
        CDR_LEAVE,
@@ -388,8 +389,8 @@ class Server : public con::PeerHandler, public MapEventReceiver,
        // Lua files registered for init of async env, pair of modname + path
        std::vector<std::pair<std::string, std::string>> m_async_init_files;
 
-       // Serialized data transferred into async envs at init time
-       MutexedVariable<std::string> m_async_globals_data;
+       // Data transferred into async envs at init time
+       std::unique_ptr<PackedValue> m_async_globals_data;
 
        // Bind address
        Address m_bind_addr;