Skip to content

Commit bac0018

Browse files
committed
Merge branch 'unloadedcontainers' into 'master'
Fix Lua memory usage See merge request OpenMW/openmw!4363
2 parents 34e32b7 + 68ebefc commit bac0018

10 files changed

+424
-96
lines changed

apps/components_tests/lua/test_scriptscontainer.cpp

+59
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <components/lua/asyncpackage.hpp>
77
#include <components/lua/luastate.hpp>
88
#include <components/lua/scriptscontainer.hpp>
9+
#include <components/lua/scripttracker.hpp>
910

1011
#include <components/testing/util.hpp>
1112

@@ -135,6 +136,31 @@ return {
135136
end,
136137
},
137138
}
139+
)X");
140+
141+
constexpr VFS::Path::NormalizedView unloadPath("unload.lua");
142+
143+
VFSTestFile unloadScript(R"X(
144+
x = 0
145+
y = 0
146+
z = 0
147+
return {
148+
engineHandlers = {
149+
onSave = function(state)
150+
print('saving', x, y, z)
151+
return {x = x, y = y}
152+
end,
153+
onLoad = function(state)
154+
x, y = state.x, state.y
155+
print('loaded', x, y, z)
156+
end
157+
},
158+
eventHandlers = {
159+
Set = function(eventData)
160+
x, y, z = eventData.x, eventData.y, eventData.z
161+
end
162+
}
163+
}
138164
)X");
139165

140166
struct LuaScriptsContainerTest : Test
@@ -151,6 +177,7 @@ return {
151177
{ testInterfacePath, &interfaceScript },
152178
{ overrideInterfacePath, &overrideInterfaceScript },
153179
{ useInterfacePath, &useInterfaceScript },
180+
{ unloadPath, &unloadScript },
154181
});
155182

156183
LuaUtil::ScriptsConfiguration mCfg;
@@ -171,6 +198,7 @@ CUSTOM, NPC: loadSave2.lua
171198
CUSTOM, PLAYER: testInterface.lua
172199
CUSTOM, PLAYER: overrideInterface.lua
173200
CUSTOM, PLAYER: useInterface.lua
201+
CUSTOM: unload.lua
174202
)X");
175203
mCfg.init(std::move(cfg));
176204
}
@@ -511,4 +539,35 @@ CUSTOM, PLAYER: useInterface.lua
511539
Log::sMinDebugLevel = level;
512540
}
513541

542+
TEST_F(LuaScriptsContainerTest, Unload)
543+
{
544+
LuaUtil::ScriptTracker tracker;
545+
LuaUtil::ScriptsContainer scripts1(&mLua, "Test", &tracker, false);
546+
547+
EXPECT_TRUE(scripts1.addCustomScript(*mCfg.findId(unloadPath)));
548+
EXPECT_EQ(tracker.size(), 1);
549+
550+
mLua.protectedCall([&](LuaUtil::LuaView& lua) {
551+
scripts1.receiveEvent("Set", LuaUtil::serialize(lua.sol().create_table_with("x", 3, "y", 2, "z", 1)));
552+
testing::internal::CaptureStdout();
553+
for (int i = 0; i < 600; ++i)
554+
tracker.unloadInactiveScripts(lua);
555+
EXPECT_EQ(tracker.size(), 0);
556+
scripts1.receiveEvent("Set", LuaUtil::serialize(lua.sol().create_table_with("x", 10, "y", 20, "z", 30)));
557+
EXPECT_EQ(internal::GetCapturedStdout(),
558+
"Test[unload.lua]:\tsaving\t3\t2\t1\n"
559+
"Test[unload.lua]:\tloaded\t3\t2\t0\n");
560+
});
561+
EXPECT_EQ(tracker.size(), 1);
562+
ESM::LuaScripts data;
563+
scripts1.save(data);
564+
EXPECT_EQ(tracker.size(), 1);
565+
mLua.protectedCall([&](LuaUtil::LuaView& lua) {
566+
for (int i = 0; i < 600; ++i)
567+
tracker.unloadInactiveScripts(lua);
568+
});
569+
EXPECT_EQ(tracker.size(), 0);
570+
scripts1.load(data);
571+
EXPECT_EQ(tracker.size(), 0);
572+
}
514573
}

apps/openmw/mwlua/localscripts.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,8 @@ namespace MWLua
224224
};
225225
}
226226

227-
LocalScripts::LocalScripts(LuaUtil::LuaState* lua, const LObject& obj)
228-
: LuaUtil::ScriptsContainer(lua, "L" + obj.id().toString())
227+
LocalScripts::LocalScripts(LuaUtil::LuaState* lua, const LObject& obj, LuaUtil::ScriptTracker* tracker)
228+
: LuaUtil::ScriptsContainer(lua, "L" + obj.id().toString(), tracker, false)
229229
, mData(obj)
230230
{
231231
lua->protectedCall(

apps/openmw/mwlua/localscripts.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,13 @@ namespace MWLua
6262
{
6363
public:
6464
static void initializeSelfPackage(const Context&);
65-
LocalScripts(LuaUtil::LuaState* lua, const LObject& obj);
65+
LocalScripts(LuaUtil::LuaState* lua, const LObject& obj, LuaUtil::ScriptTracker* tracker = nullptr);
6666

6767
MWBase::LuaManager::ActorControls* getActorControls() { return &mData.mControls; }
6868
const MWWorld::Ptr& getPtrOrEmpty() const { return mData.ptrOrEmpty(); }
6969

7070
void setActive(bool active);
71+
bool isActive() const override { return mData.mIsActive; }
7172
void onConsume(const LObject& consumable) { callEngineHandlers(mOnConsumeHandlers, consumable); }
7273
void onActivated(const LObject& actor) { callEngineHandlers(mOnActivatedHandlers, actor); }
7374
void onTeleported() { callEngineHandlers(mOnTeleportedHandlers); }

apps/openmw/mwlua/luamanagerimp.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,8 @@ namespace MWLua
210210
scripts->update(frameDuration);
211211
mGlobalScripts.update(frameDuration);
212212
}
213+
214+
mLua.protectedCall([&](LuaUtil::LuaView& lua) { mScriptTracker.unloadInactiveScripts(lua); });
213215
}
214216

215217
void LuaManager::objectTeleported(const MWWorld::Ptr& ptr)
@@ -560,7 +562,7 @@ namespace MWLua
560562
}
561563
else
562564
{
563-
scripts = std::make_shared<LocalScripts>(&mLua, LObject(getId(ptr)));
565+
scripts = std::make_shared<LocalScripts>(&mLua, LObject(getId(ptr)), &mScriptTracker);
564566
if (!autoStartConf.has_value())
565567
autoStartConf = mConfiguration.getLocalConf(type, ptr.getCellRef().getRefId(), getId(ptr));
566568
scripts->setAutoStartConf(std::move(*autoStartConf));

apps/openmw/mwlua/luamanagerimp.hpp

+3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include <components/lua/inputactions.hpp>
1010
#include <components/lua/luastate.hpp>
11+
#include <components/lua/scripttracker.hpp>
1112
#include <components/lua/storage.hpp>
1213
#include <components/lua_ui/resources.hpp>
1314
#include <components/misc/color.hpp>
@@ -234,6 +235,8 @@ namespace MWLua
234235

235236
LuaUtil::InputAction::Registry mInputActions;
236237
LuaUtil::InputTrigger::Registry mInputTriggers;
238+
239+
LuaUtil::ScriptTracker mScriptTracker;
237240
};
238241

239242
}

components/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ list(APPEND COMPONENT_FILES "${OpenMW_BINARY_DIR}/${OSG_PLUGIN_CHECKER_CPP_FILE}
5959

6060
add_component_dir (lua
6161
luastate scriptscontainer asyncpackage utilpackage serialization configuration l10n storage utf8
62-
shapes/box inputactions yamlloader
62+
shapes/box inputactions yamlloader scripttracker
6363
)
6464

6565
add_component_dir (l10n

0 commit comments

Comments
 (0)