mirror of
https://github.com/minetest/minetest.git
synced 2024-11-23 08:03:45 +01:00
Use native packer to transfer globals into async env(s)
This commit is contained in:
parent
7f58887ae3
commit
ec9f157512
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user