summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNat Goodspeed <nat@lindenlab.com>2024-03-25 16:57:28 -0400
committerNat Goodspeed <nat@lindenlab.com>2024-03-25 16:57:28 -0400
commit98e6356aed0c757f16267cc2ae921f9c90a249fe (patch)
tree93a3f25ff650a50c594dd1c09c7fff267c1f9379
parentac4fa418e3a7402f9d9122c726d2fbfc4b8767b2 (diff)
Add LL.check_stop() entry point and call it in fiber scheduler().
fiber.lua's scheduler() is greedy, in the sense that it wants to run every ready Lua fiber before retrieving the next incoming event from the viewer (and possibly blocking for some real time before it becomes available). But check for viewer shutdown before resuming any suspended-but-ready Lua fiber.
-rw-r--r--indra/llcommon/lua_function.cpp9
-rw-r--r--indra/newview/scripts/lua/fiber.lua4
2 files changed, 10 insertions, 3 deletions
diff --git a/indra/llcommon/lua_function.cpp b/indra/llcommon/lua_function.cpp
index 962e9ee2fa..9f0abd5674 100644
--- a/indra/llcommon/lua_function.cpp
+++ b/indra/llcommon/lua_function.cpp
@@ -682,6 +682,15 @@ std::pair<LuaFunction::Registry&, LuaFunction::Lookup&> LuaFunction::getState()
}
/*****************************************************************************
+* check_stop()
+*****************************************************************************/
+lua_function(check_stop, "ensure that a Lua script responds to viewer shutdown")
+{
+ LLCoros::checkStop();
+ return 0;
+}
+
+/*****************************************************************************
* help()
*****************************************************************************/
lua_function(help,
diff --git a/indra/newview/scripts/lua/fiber.lua b/indra/newview/scripts/lua/fiber.lua
index 7dc67f510c..aebf27357f 100644
--- a/indra/newview/scripts/lua/fiber.lua
+++ b/indra/newview/scripts/lua/fiber.lua
@@ -222,8 +222,6 @@ local function scheduler()
-- processing to the main thread. If called from a coroutine, pass control
-- back to the main thread.
if coroutine.running() then
- -- seize the opportunity to make sure the viewer isn't shutting down
--- check_stop()
-- this is a real coroutine, yield normally to main thread
coroutine.yield()
-- main certainly still exists
@@ -240,7 +238,7 @@ local function scheduler()
repeat
for co in live_ready_iter do
-- seize the opportunity to make sure the viewer isn't shutting down
--- check_stop()
+ LL.check_stop()
-- before we re-append co, is it the only remaining entry?
others = next(ready)
-- co is live, re-append it to the ready list