aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsfan5 <sfan5@live.de>2022-05-09 18:20:10 +0200
committersfan5 <sfan5@live.de>2022-05-10 22:37:42 +0200
commitec9f1575121e3b064b919bca7efddfa8b0fc4e65 (patch)
tree54d87ba45143f9d8d64e3ee3b8c36f6296627bdc /src
parent7f58887ae33893c981fbdff23d4e1fa4a11c32e4 (diff)
downloadminetest-ec9f1575121e3b064b919bca7efddfa8b0fc4e65.tar.gz
minetest-ec9f1575121e3b064b919bca7efddfa8b0fc4e65.tar.bz2
minetest-ec9f1575121e3b064b919bca7efddfa8b0fc4e65.zip
Use native packer to transfer globals into async env(s)
Diffstat (limited to 'src')
-rw-r--r--src/script/common/c_packer.h2
-rw-r--r--src/script/scripting_server.cpp9
-rw-r--r--src/server.cpp1
-rw-r--r--src/server.h5
4 files changed, 9 insertions, 8 deletions
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<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'
}
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<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;