summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authornat-goodspeed <nat@lindenlab.com>2024-03-28 14:58:11 -0400
committerGitHub <noreply@github.com>2024-03-28 14:58:11 -0400
commit5e576c98f7df1a82cfb68f4cf817e0fe16f2e465 (patch)
treefa50e02d11aa8320ae86799b66e20aa157a45f9a /indra/newview
parent55c32761a0be05c7d4b4e17765e2d341efb0ebe6 (diff)
parent53ce38b106a086a4e3bc1ed0663bb47b0f0d967c (diff)
Merge pull request #1079 from secondlife/lua-hangfix
Terminate Lua scripts hanging in `LL.get_event_next()`.
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/llluamanager.cpp42
-rw-r--r--indra/newview/tests/llluamanager_test.cpp20
2 files changed, 21 insertions, 41 deletions
diff --git a/indra/newview/llluamanager.cpp b/indra/newview/llluamanager.cpp
index c65f062fd7..74306a60ba 100644
--- a/indra/newview/llluamanager.cpp
+++ b/indra/newview/llluamanager.cpp
@@ -31,20 +31,11 @@
#include "llcoros.h"
#include "llerror.h"
#include "lleventcoro.h"
+#include "llviewercontrol.h"
#include "lua_function.h"
#include "lualistener.h"
#include "stringize.h"
-// skip all these link dependencies for integration testing
-#ifndef LL_TEST
-#include "lluilistener.h"
-#include "llviewercontrol.h"
-
-// FIXME extremely hacky way to get to the UI Listener framework. There's
-// a cleaner way.
-extern LLUIListener sUIListener;
-#endif // ! LL_TEST
-
#include <boost/algorithm/string/replace.hpp>
#include <filesystem>
@@ -126,37 +117,6 @@ lua_function(print_warning, "print_warning(args...): WARNING level logging")
return 0;
}
-#ifndef LL_TEST
-
-lua_function(run_ui_command,
- "run_ui_command(name [, parameter]): "
- "call specified UI command with specified parameter")
-{
- int top = lua_gettop(L);
- std::string func_name;
- if (top >= 1)
- {
- func_name = lua_tostring(L,1);
- }
- std::string parameter;
- if (top >= 2)
- {
- parameter = lua_tostring(L,2);
- }
- LL_WARNS("LUA") << "running ui func " << func_name << " parameter " << parameter << LL_ENDL;
- LLSD event;
- event["function"] = func_name;
- if (!parameter.empty())
- {
- event["parameter"] = parameter;
- }
- sUIListener.call(event);
-
- lua_settop(L, 0);
- return 0;
-}
-#endif // ! LL_TEST
-
lua_function(post_on, "post_on(pumpname, data): post specified data to specified LLEventPump")
{
std::string pumpname{ lua_tostdstring(L, 1) };
diff --git a/indra/newview/tests/llluamanager_test.cpp b/indra/newview/tests/llluamanager_test.cpp
index e10dedcf53..b907ac6619 100644
--- a/indra/newview/tests/llluamanager_test.cpp
+++ b/indra/newview/tests/llluamanager_test.cpp
@@ -418,4 +418,24 @@ namespace tut
auto [count, result] = future.get();
ensure_equals("leap.lua: " + result.asString(), count, 0);
}
+
+ template<> template<>
+ void object::test<7>()
+ {
+ set_test_name("stop hanging Lua script");
+ const std::string lua(
+ "-- hanging Lua script should terminate\n"
+ "\n"
+ "LL.get_event_next()\n"
+ );
+ LuaState L;
+ auto future = LLLUAmanager::startScriptLine(L, lua);
+ // Poke LLTestApp to send its preliminary shutdown message.
+ mApp.setQuitting();
+ // but now we have to give the startScriptLine() coroutine a chance to run
+ auto [count, result] = future.get();
+ ensure_equals("killed Lua script terminated normally", count, -1);
+ ensure_equals("unexpected killed Lua script error",
+ result.asString(), "viewer is stopping");
+ }
} // namespace tut